如何在 Linux 脚本中以其他用户身份运行命令
已发表: 2022-07-13很自然,当您运行命令或脚本时,系统会将其作为您启动的进程执行。 但是您可以以其他用户身份运行命令和脚本。
流程有所有者
当执行程序或脚本时,Linux 会创建一个进程。 该过程有一个所有者。 所有者是另一个进程或用户帐户的名称(如果有人启动它)。
流程的所有权定义了流程的一些能力和环境。 根据进程的启动方式,它会继承其父进程或用户的某些属性。 或者,更严格地说,用户用来启动程序的进程,通常是一个 shell。
以其他用户身份运行命令或脚本可能很有用,因为该进程创建的任何文件的所有权都属于相应的用户。
每次我们使用sudo
时,我们都以另一个用户身份运行命令。 sudo
使用的默认用户帐户是 root 或“超级”用户。 因此, sudo
经常被错误地认为代表超级用户 do 。 但这只是闲散的行话。 它实际上代表替代用户做。
使用sudo
,您可以以任何其他用户身份运行命令,而不仅仅是 root 用户。 具有讽刺意味的是,您需要 root 权限才能这样做。 但是启动另一个用户拥有的程序或脚本与运行另一个用户的进程不同。 您仍然会以 root 身份运行它。
以下是如何以另一个用户的身份实际运行进程,以及如何从脚本中运行命令,就好像它们已由另一个用户执行一样。
以其他用户身份运行脚本
我们正在使用配置了多个用户的计算机。 一个是 Mary,用户名为 maryq,另一个是 Dave,用户名为 dave。
Mary 在她的主目录中有一个名为“other-user.sh”的脚本。 这是脚本的文本。
#!/bin/bash echo "脚本名称:" $0 echo "工作目录:" $(pwd) echo "脚本以用户身份运行:" $(whoami)
它打印出脚本名称,该名称保存在$0
环境变量中。 然后它使用pwd
打印工作目录。 最后,它使用whoami
命令打印启动脚本的用户名。 或者它认为是谁启动了脚本。
将脚本中的文本复制到编辑器中,并将其另存为“other-user.sh”在不同用户帐户的主目录中。
我们需要使脚本可执行。 我们将使用chmod
命令并使用+x
(执行)选项和-u
(用户)选项仅为所有者设置执行标志。 这意味着只有 Mary 可以运行该脚本。 我们将使用ls
检查文件权限。
chmod u+x 其他用户.sh
ls
从左到右,权限为:
- 所有者可以读取、写入和执行文件。
- 组成员可以读取和写入文件。
- 其他人只能读取该文件。
因此,唯一能够运行该脚本的用户是 Mary 和 root。 这是 Mary 运行脚本时发生的情况:
./其他用户.sh
我们被告知脚本的当前工作目录是 Mary 的主目录,并且脚本的所有者是用户帐户 maryq。
正如预期的那样,Dave 无法运行该脚本。
/home/maryq/other-user.sh
如果 Dave 具有 root 用户权限,他可以尝试以 root 身份运行脚本,使用sudo
。
须藤/home/maryq/other-user.sh
这是部分成功。 脚本运行,但脚本的所有者是 root,而不是 maryq。
我们需要使用的技巧是sudo -u
(user) 选项。 这使您可以指定要运行命令的用户。 如果不使用-u
选项, sudo
默认使用 root。 如果我们想以 Mary 的身份运行命令,我们需要将他们的用户帐户的名称传递给sudo
命令。
sudo -u maryq /home/maryq/other-user.sh
这次脚本报告进程所有者是maryq。
让我们在“other-user.sh”脚本中添加一行。 我们将echo
显一些文本并将输出重定向到一个名为“mary.txt”的文件中。
#!/bin/bash echo "脚本名称:" $0 echo "工作目录:" $(pwd) echo "脚本以用户身份运行:" $(whoami) echo "这将进入 /home/maryq/ 中的文件" > /home/maryq/mary.txt
我们正在 Mary 的主目录中创建新文件。 这很好,因为我们以 Mary 身份运行脚本。
./其他用户.sh
如果我们检查 Mary 的主目录,我们会看到该文件已创建,并且该文件的所有权属于 maryq 用户帐户。
ls -hl mary.txt
如果 Mary 自己真的启动了脚本,我们会看到这种行为。
相关:如何在 Linux 上使用 chmod 命令
运行用户命令
您可以使用我们目前在脚本中使用的sudo -u
命令,但还有另一个命令runuser
旨在以与脚本内部不同的用户身份运行进程。 它可以更好地处理已启动进程的返回代码,并且比sudo
具有更少的开销。
runuser
命令需要由 root 运行,但这是通过以 root 运行整个脚本来完成的。 您不需要在脚本中使用sudo
。 runuser
命令也可以在命令行上使用,因此不限于脚本使用,尽管它是脚本的首选方法。
Dave 无法列出“mary.txt”文件,因为它位于 Mary 的主目录中并且他没有访问权限。
猫 /home/maryq/mary.txt
但是,我们可以使用runuser
查看文件内部。 -
(login) 选项启动一个新的 shell,其环境非常接近 Mary 实际登录时所拥有的 shell 环境。 -c
(command) 选项后跟我们要运行的命令。
sudo runuser -maryq -c 'cat mary.txt'
请注意,该命令不需要文件的完整路径。 相对于她的主目录,我们可以像 Mary 一样引用该文件。
作为用户 Dave,我们将创建一个名为“run-maryq.sh”的脚本,其中包含以下文本:
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
我们将使其可执行:
chmod +x 运行-maryq.sh
让我们看看当我们尝试运行它时会发生什么。
./run-maryq.sh
runuser
命令会报错,因为它是由普通用户执行的。 让我们用sudo
再次运行它。
须藤 ./run-maryq.sh
这就像我们希望的那样工作,就像玛丽自己启动了脚本一样。
使用哪一个?
在命令行上,它们之间没有太多选择。 但是由于无论如何您都必须将sudo
与runuser
一起使用,您不妨单独使用sudo
。
但在脚本中, runuser
是首选命令。
相关: 10 个适合初学者的基本 Linux 命令