如何在 Linux 脚本中以其他用户身份运行命令

已发表: 2022-07-13
蓝色背景下笔记本电脑上的 Linux 终端。
fatmawati achmad zaenuri/Shutterstock.com

很自然,当您运行命令或脚本时,系统会将其作为您启动的进程执行。 但是您可以以其他用户身份运行命令和脚本。

流程有所有者

当执行程序或脚本时,Linux 会创建一个进程。 该过程有一个所有者。 所有者是另一个进程或用户帐户的名称(如果有人启动它)。

流程的所有权定义了流程的一些能力和环境。 根据进程的启动方式,它会继承其父进程或用户的某些属性。 或者,更严格地说,用户用来启动程序的进程,通常是一个 shell。

如何从 Linux 终端管理进程:你需要知道的 10 个命令
相关如何从 Linux 终端管理进程:你需要知道的 10 个命令

以其他用户身份运行命令或脚本可能很有用,因为该进程创建的任何文件的所有权都属于相应的用户。

每次我们使用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 可以运行

从左到右,权限为:

  • 所有者可以读取、写入和执行文件。
  • 组成员可以读取和写入文件。
  • 其他人只能读取该文件。

因此,唯一能够运行该脚本的用户是 Mary 和 root。 这是 Mary 运行脚本时发生的情况:

 ./其他用户.sh 

Mary 运行脚本时的输出

我们被告知脚本的当前工作目录是 Mary 的主目录,并且脚本的所有者是用户帐户 maryq。

正如预期的那样,Dave 无法运行该脚本。

 /home/maryq/other-user.sh 

用户 Dave 无法运行脚本,权限被拒绝

如果 Dave 具有 root 用户权限,他可以尝试以 root 身份运行脚本,使用sudo

 须藤/home/maryq/other-user.sh 

脚本由 root 运行时的输出

这是部分成功。 脚本运行,但脚本的所有者是 root,而不是 maryq。

我们需要使用的技巧是sudo -u (user) 选项。 这使您可以指定要运行命令的用户。 如果不使用-u选项, sudo默认使用 root。 如果我们想以 Mary 的身份运行命令,我们需要将他们的用户帐户的名称传递给sudo命令。

sudo -u maryq /home/maryq/other-user.sh

使用 -u 用户选项和 root 以用户 Mary 身份运行脚本

这次脚本报告进程所有者是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 运行整个脚本来完成的。 您不需要在脚本中使用sudorunuser命令也可以在命令行上使用,因此不限于脚本使用,尽管它是脚本的首选方法。

Dave 无法列出“mary.txt”文件,因为它位于 Mary 的主目录中并且他没有访问权限。

 猫 /home/maryq/mary.txt 

用户 Dave 无法读取 Mary 的文件,权限被拒绝

但是,我们可以使用runuser查看文件内部。 - (login) 选项启动一个新的 shell,其环境非常接近 Mary 实际登录时所拥有的 shell 环境。 -c (command) 选项后跟我们要运行的命令。

 sudo runuser -maryq -c 'cat mary.txt' 

使用 runuser 命令读取 Mary 的文件

请注意,该命令不需要文件的完整路径。 相对于她的主目录,我们可以像 Mary 一样引用该文件。

作为用户 Dave,我们将创建一个名为“run-maryq.sh”的脚本,其中包含以下文本:

 #!/bin/bash

runuser -l maryq -c 'cat mary.txt'

我们将使其可执行:

 chmod +x 运行-maryq.sh 

使用 chmod 使脚本可执行

让我们看看当我们尝试运行它时会发生什么。

 ./run-maryq.sh 

以普通用户身份运行带有 runuser 的脚本

runuser命令会报错,因为它是由普通用户执行的。 让我们用sudo再次运行它。

 须藤 ./run-maryq.sh 

以 root 身份运行带有 runuser 的脚本

这就像我们希望的那样工作,就像玛丽自己启动了脚本一样。

使用哪一个?

在命令行上,它们之间没有太多选择。 但是由于无论如何您都必须将sudorunuser一起使用,您不妨单独使用sudo

但在脚本中, runuser是首选命令。

相关: 10 个适合初学者的基本 Linux 命令