在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法和遇到的问题

这篇具有很好参考价值的文章主要介绍了在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法和遇到的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法

切换用户之后执行多个函数以及执行多行命令

#!/bin/bash

# 切换用户
su - username <<EOF
# 执行多行命令
function1() {
  # 函数体
}

function2() {
  # 函数体
}

function1
function2
EOF

其中,username是您要切换到的用户的用户名,function1和function2是您要执行的函数名称,您可以根据需要添加更多函数和命令。在EOF标记之间的所有内容都将作为切换后的用户执行。请注意,您需要确保切换后的用户具有执行所需命令和函数的权限。


在脚本中切换用户后,执行脚本中的一行命令:

su - username -c "command"

其中,username为要切换到的用户,command为要执行的命令。在执行该命令时,会切换到指定用户,并以该用户的身份执行命令。

# 切换为普通用户
sudo -u 普通用户名称 bash << EOF

# 在普通用户下执行的命令
echo "Hello, World!"

EOF

其中,普通用户名称需要替换为实际的普通用户名称。在脚本中使用sudo -u命令可以切换到指定的用户下执行命令,<< EOF和EOF之间的代码块是在普通用户下执行的命令。执行完普通用户下的命令后,脚本会自动切换回root用户,继续执行后续的命令。


在脚本中切换用户之后,执行脚本中的函数

例如,在Linux系统中,可以使用以下代码切换用户并执行脚本中的函数:

sudo -u username bash -c "source /path/to/script.sh && functionName parameter1 parameter2"

其中,username为需要切换到的用户,/path/to/script.sh为脚本文件的路径,functionName为需要执行的函数名,parameter1和parameter2为函数需要传递的参数。

su - $1 bash -c "source /usr/local/shell_01/ssh_.sh && create_keygen $1"

其中su表示切换用户,
$1表示第一个参数,
bash -c表示执行后面的命令,
source /usr/local/shell_01/ssh_.sh表示执行该脚本文件,
&&表示前面的命令执行成功后才执行后面的命令,
create_keygen $1表示执行create_keygen函数并传入第一个参数。

在脚本中切换用户后,执行脚本中的函数需要注意以下几点:

  1. 确认切换用户的方式:根据脚本中切换用户的方式,选择相应的命令或函数进行切换。例如,如果是使用sudo命令切换用户,则可以使用exec()函数执行sudo命令。

  2. 确认切换后的用户权限:切换用户后,需要确认当前用户的权限是否足够执行脚本中的函数。如果权限不足,则需要使用su命令切换到更高权限的用户。

  3. 执行脚本中的函数:切换用户后,可以直接调用脚本中的函数进行执行。如果函数需要传递参数,则需要在调用函数时传递相应的参数。


shell脚本中切换用户之后为什么脚本不继续运行了

在shell脚本中切换用户后,脚本会在切换后的用户环境中继续执行,如果该用户没有执行脚本的权限或者脚本所需的环境变量不在该用户的环境中,脚本就会停止运行。

为了让切换用户后的脚本能正常继续运行,可以使用sudo命令来切换用户,并使用-i选项来保持原来的环境变量。例如:

sudo -i -u otheruser
# 切换到otheruser用户,并保持原来的环境变量

# 在这里执行需要切换用户后才能执行的命令

exit
# 切换回原来的用户

这样,脚本就可以在切换用户后继续执行,并且可以使用原来用户的环境变量。

su的参数

参考博客:
inux su命令:su命令语法、su root与su - root区别、su与sudo区别、su -c 参数的使用理解

注意:su命令有

- l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root,
也就是 以目标用户的环境变量执行命令
-c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者

下面是一个使用su -c命令的示例,假设当前用户为user1,要以root用户的身份执行ls命令:

su -c "ls /root" root

其中,-c参数后面跟着要执行的命令ls /root,root为要切换到的用户。执行该命令后,会要求输入root用户的密码,输入正确后即可执行ls命令。


在shell脚本中写代码检查当前用户是否为root用户,如果是则切换为普通用户,如果不是就切换为root并且输入密码

#!/bin/bash

if [ $(id -u) -eq 0 ]; then
    echo "当前用户为root用户,将切换为普通用户"
    su - 普通用户
else
    echo "当前用户不是root用户,将切换为root用户"
    su -c "echo '请输入root用户密码:'; su - root" 普通用户
fi

其中,id -u命令可以获取当前用户的UID,如果等于0,则表示当前用户为root用户。如果是root用户,则使用su - 普通用户命令切换为普通用户;如果不是root用户,则使用su -c命令切换为root用户,并提示输入密码。其中,-c选项可以让su命令执行指定的命令,echo '请输入root用户密码:'用于提示用户输入密码。

在Linux中,root用户的UID默认一直是0。普通用户的UID则是由系统管理员在创建用户时分配的,通常从1000开始递增。不过,这个UID的范围可以通过修改系统配置文件来改变。一般来说,普通用户的UID应该是大于等于1000的整数,以避免与系统用户的UID冲突。


在linux中su和su - 有什么区别

在Linux中,su和su - 都是用于切换用户的命令,但它们之间有一些区别。
su命令用于切换到另一个用户,但不改变当前的工作目录和环境变量。如果没有指定要切换到的用户,则默认切换到root用户。使用su命令时,需要输入目标用户的密码才能切换到该用户。
su - 命令也用于切换到另一个用户,但它会改变当前的工作目录和环境变量,使其与目标用户的环境变量一致。使用su -命令时,需要输入目标用户的密码才能切换到该用户。
因此,su - 命令更适合在切换到另一个用户后执行需要目标用户环境变量的操作,例如在目标用户的家目录下执行脚本或命令。而su命令则更适合在不需要目标用户环境变量的情况下切换到另一个用户。

// 变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su - clsung

shell脚本中在expect中如何执行多个命令

在shell脚本中,可以使用expect命令来实现自动化交互式命令行操作。如果需要执行多个命令,可以使用expect的send命令来发送命令,并使用expect的expect命令来等待命令执行完成。

以下是一个示例脚本,其中包含了两个命令:

#!/usr/bin/expect

# 连接到远程主机
spawn ssh user@host

# 等待输入密码
expect "password:"

# 发送密码
send "mypassword\r"

# 等待命令提示符
expect "$ "

# 执行命令
send "ls -l\r"

# 等待命令执行完成
expect "$ "

# 执行另一个命令
send "echo 'Hello, world!'\r"

# 等待命令执行完成
expect "$ "

# 退出交互式会话
send "exit\r"
expect eof

在上面的脚本中,使用spawn命令连接到远程主机,并使用expect命令等待输入密码。然后使用send命令发送密码,并使用expect命令等待命令提示符。接着使用send命令发送第一个命令,并使用expect命令等待命令执行完成。然后再使用send命令发送第二个命令,并使用expect命令等待命令执行完成。最后使用send命令退出交互式会话。


在shell脚本中,可以使用以下几种方法来查看当前的用户

  1. 使用whoami命令
#!/bin/bash
echo "当前用户是:$(whoami)"
  1. 使用id命令
#!/bin/bash
echo "当前用户是:$(id -un)"
  1. 使用$USER环境变量
#!/bin/bash
echo "当前用户是:$USER"

以上三种方法都可以用来查看当前的用户,其中whoami和id命令会返回当前用户的用户名,而$USER环境变量则直接存储了当前用户的用户名。在实际使用中,可以根据具体情况选择使用哪种方法。


将linux目录权限修改为drwxr-xr-x

可以使用chmod命令来修改Linux目录权限,具体命令如下:

chmod 755 /path/to/directory

其中,755表示目录权限为drwxr-xr-x,其中d表示目录,r表示读权限,w表示写权限,x表示执行权限。具体含义如下:

  • 第一位:d表示目录,-表示文件
  • 第二至四位:所有者权限,r表示读权限,w表示写权限,x表示执行权限
  • 第五至七位:组用户权限,r表示读权限,w表示写权限,x表示执行权限
  • 第八至十位:其他用户权限,r表示读权限,w表示写权限,x表示执行权限
    因此,755表示目录所有者具有读、写、执行权限,组用户和其他用户具有读、执行权限。

ssh-keygen -t rsa有什么作用

ssh-keygen -t rsa命令用于生成RSA密钥对,包括公钥和私钥。在执行该命令时,会提示用户输入密钥文件的名称和路径,以及密码(可选)。如果在Linux中没有.ssh目录,则执行此命令时,会自动创建该目录。生成的密钥对可以用于SSH连接和身份验证。具体操作步骤如下:

  • 打开终端,输入ssh-keygen -t rsa命令。
  • 按照提示输入密钥文件的名称和路径,或者直接按Enter键使用默认值。
  • 如果需要设置密码,则输入密码并确认。
  • 生成密钥对后,可以在.ssh目录下找到id_rsa和id_rsa.pub两个文件,分别为私钥和公钥。

需要注意的是,私钥文件必须保密,不应该与他人共享。公钥文件可以发送给其他人,用于身份验证。


ssh-keygen的参数有哪些

ssh-keygen是用于生成和管理SSH密钥对的命令行工具。它的常用参数包括:

  • -t:指定密钥类型,常用的有rsa、dsa、ecdsa和ed25519等。
  • -b:指定密钥长度,单位为比特。默认值为2048。
  • -C:添加注释,用于标识该密钥的用途。
  • -f:指定密钥文件名,可以自定义密钥文件的名称和路径。
  • -N:设置密钥的密码,用于保护密钥的安全性。
  • -q:静默模式,不输出任何信息。

例如,生成一个2048位的RSA密钥对,并将公钥保存到文件id_rsa.pub中,私钥保存到文件id_rsa中,可以使用以下命令:

ssh-keygen -t rsa -b 2048 -f id_rsa

在生成密钥对的过程中,可以根据需要设置注释和密码等选项。生成的密钥对可以用于SSH连接、Git代码仓库等场景。


shell中的spawn命令

在shell中,spawn命令用于创建一个新的进程并执行指定的命令。它通常用于在后台执行长时间运行的任务,以避免阻塞当前进程。spawn命令可以接受多个参数,其中第一个参数是要执行的命令,后面的参数是传递给该命令的参数。spawn命令还可以指定标准输入、输出和错误流的重定向,以及设置环境变量。在执行完命令后,spawn命令会返回一个进程ID,可以使用该ID来监视和控制该进程的行为。


shell中的expect命令

在shell中,expect命令是一种自动化交互式应用程序的工具。它可以模拟用户的交互行为,例如输入密码、选择选项等等。expect命令通常用于自动化测试、自动化部署、自动化配置等场景。

expect命令的基本语法如下:

expect [-d] [-c cmds] [-f scriptfile] [-i in] [-o out] [-p prompt] [-u user] [args]

其中,常用的参数包括:

  • -c:指定命令行中的expect脚本;
  • -f:指定expect脚本文件;
  • -i:指定输入流;
  • -o:指定输出流;
  • -p:指定提示符;
  • -u:指定用户名。

expect脚本通常由一系列expect和send命令组成。expect命令用于匹配输出流中的某个字符串,send命令用于向输入流中发送某个字符串。例如,下面是一个简单的expect脚本:

#!/usr/bin/expect

set timeout 10
spawn ssh user@host
expect "password:"
send "mypassword\r"
expect "$ "
send "ls -l\r"
expect "$ "
send "exit\r"

这个脚本的作用是通过ssh登录到远程主机,执行ls -l命令,然后退出。在这个脚本中,expect命令用于匹配"password:“和”$ "这两个提示符,send命令用于向输入流中发送密码和命令。

总之,expect命令是一种非常强大的自动化工具,可以大大提高工作效率。但是,需要注意的是,expect脚本的编写需要一定的技巧和经验,否则可能会出现意想不到的问题。


在shell脚本中设置了切换用户后执行whoami命令,为什么whoami命令显示用户是之前为切换时的用户

在shell脚本中切换用户后执行whoami命令,可能会出现whoami命令显示用户是之前为切换时的用户的情况。这是因为whoami命令是根据当前进程的有效用户ID来确定当前用户的身份的,而在切换用户后,当前进程的有效用户ID并没有改变,仍然是切换前的用户ID。因此,为了正确地获取切换后的用户身份,可以使用su命令来切换用户,并在su命令后面加上-c参数来执行需要执行的命令,例如:

su -c "whoami" - username

其中,-表示使用当前用户的环境变量,-c表示执行后面的命令,username表示需要切换到的用户。这样就可以正确地获取切换后的用户身份了。文章来源地址https://www.toymoban.com/news/detail-442076.html

到了这里,关于在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法和遇到的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux shell操作- 03 用户切换及shell案例

    linux是多用户的、多进程的操作系统,通常多个用户之间需要来回切换; su,switch user 命令 参数 - , 切换用户,同时切换工作目录(为目标用户的家目录) 参数 -c cmd,切换到目标用户,执行一条指令,然后切回原用户; 参数 -m -p ,保持原用户的环境变量; 参数 -l,重新登

    2024年02月06日
    浏览(42)
  • 【Linux命令-shell】虚拟机中创建shell脚本、查看当前路径、执行脚本

    目录 一、创建shell脚本 二、查看当前的路径 三、执行脚本 一、创建shell脚本 shell脚本的特点 提前将可执行的命令语句写入一个文件中 顺序执行 解释器逐行解释代码 常见的脚本有:shell、python、PHP...... 注:用什么解释器就是什么脚本 编写shell脚本: 步骤: 1、新建文件 2、

    2024年02月05日
    浏览(68)
  • IDEA多个账号如何切换git用户

    IDEA中如何切换git用户 如果有多个账号切换到自己的git账号 Settings→passwords→选择下面的do not save 取消自动保存密码 如果还是不可以的话 进入控制面板 凭据管理器中 windows凭据中 删除git的凭据 重启IDEA就可以了 多个账号切换要注意,同一项目保存不同代码仓库密码账号不一

    2024年02月11日
    浏览(46)
  • nodejs脚本中执行shell命令

    Node.js v8.x 中文文档: child_process - 子进程 Node.js中使用内置的 child_process 模块来执行shell命令。该模块提供了 exec 、 execFile 、 spawn 等方法来启动子进程并执行命令 exec 方法是将整个命令输出缓存到内存中,当执行 完成后一次性 返回,所以适合执行 较小 的命令 exec 方法的 回调

    2024年01月21日
    浏览(51)
  • 【Linux】编写一个 shell 脚本&执行

    在Linux中编写和执行脚本相对简单。下面是一个基本的步骤指南,帮助你创建一个简单的bash脚本并运行它: 1. 创建脚本文件 首先,你需要使用文本编辑器创建一个新的文件。这个文件通常会有 .sh 的扩展名,以表明它是一个shell脚本。例如,你可以创建一个名为 myscript.sh 的文

    2024年04月26日
    浏览(35)
  • Linux下定时执行shell脚本

    vi test.sh 录入要执行的命令  保存退出,并且对脚本进行授权  :wq chmod 777 test.sh  生产文件data.txt touch /opt/data.txt  vi /etc/crontab  录入: 一分钟执行一次  保存退出即可每个一分钟执行一次 配置说明:

    2024年02月17日
    浏览(53)
  • springboot通过接口执行本地shell脚本

    首先创建springboot项目 shell脚本 这里是执行本地脚本 然后编写执行shell脚本的util类 最后开发接口调用此类 如何执行远程脚本 在这里我试用了三种方式,实现远程脚本的执行 但是使用ssh2时 会抛出上述的异常,大体的意思就是密钥交换算法不匹配,导致连接失败。 但是老版本

    2024年02月14日
    浏览(39)
  • shell脚本-批量主机执行命令(expect)

    上次连接多台服务器使用ssh-keygen,24机器去连接22、25,所以存在.ssh/authorized_keys 1.如果有.ssh/authorized_keys该文件则先删除 1.expect命令含义 expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互

    2024年02月13日
    浏览(56)
  • shell批量执行命令与文件传输脚本

    对未进行主机信任操作的服务器进行批量操作 由于ssh只能在交互模式中输入服务器密码进行登录登操作,不便于进行大批量服务器进行巡检或日志采集。sshpass恰好又解决了这个问题,使用 ssh -p passwd 可以实现命令行输入密码操作,便于进行规模巡检 首先需要在脚本执行机器

    2024年02月08日
    浏览(46)
  • Linux 环境使用定时任务执行shell脚本

    前言:Linux添加定时任务需要依赖crond服务,如果没有该服务,需要先安装:yum -y install crontabs 1、crond服务相关命令介绍         启动crond服务: service crond start         停止crond服务: service crond stop         重启crond服务: service crond restart         重载crond服务

    2024年02月16日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包