运行脚本或命令作为Linux中的另一个用户
1. 概述
在本教程中,我们将学习在 Linux 中以其他用户身份运行脚本或命令的不同方法。特别是,我们将了解如何在不以目标用户身份登录的情况下做到这一点。
2. 环境
假设我们的系统中除了root之外,还有用户annie和用户dave。然后,当以annie身份登录时,我们在*/home/annie中创建一个脚本annie-script.sh*:
$ cat > /home/annie/annie-script.sh <<EOF
echo "Running annie-script.sh as user $(whoami)"
EOF
在脚本中,我们首先使用whoami 命令获取用户名。这将捕获执行脚本的用户的用户名。然后,我们使用进程替换将用户名与要打印的消息结合起来。最后,echo 会将整个消息打印到标准输出。
使用这个简单的脚本,我们将能够分辨出哪个用户运行了该脚本。
此外,我们使脚本只能由annie执行:
$ chmod u+x /home/annie/annie-script.sh
然后我们可以验证脚本的权限信息:
$ ls -l /home/annie
total 4
-rwxrw-r-- 1 annie annie 41 Oct 31 03:11 annie-script.sh
从文件权限 位,我们可以看到只有所有者才能执行该脚本。在我们的示例中,只有annie可以执行该脚本。换句话说,dave执行annie-script.sh的唯一方法是通过annie。
设置环境后,我们将以dave身份再次登录。
在以下部分中,我们将演示如何以 annie 身份运行annie-script.sh,**同时以dave身份登录。
3. 使用su
su 是 Linux 中常用的切换用户的命令行工具。此外,它还允许我们以其他用户的身份执行脚本或命令。
3.1.以其他用户身份运行脚本
以用户 dave身份登录时,我们可以以用户annie身份运行annie-script.sh:
$ su -c '/home/annie/annie-script.sh' annie
Password:
Running annie-script.sh as user annie
默认情况下,su命令需要输入一个目标用户名来切换。但是,我们可以使用标志-c*指定要运行的脚本*。指定后,su命令将只执行脚本,而不会以目标用户身份进入新的 shell。
在我们的示例中,我们使用su命令以用户annie执行annie-script.sh。然后,su命令会询问annie的密码。一旦通过身份验证,脚本将被执行。
从输出中,我们可以看到脚本确实是由annie执行的,如我们的简单脚本所示。
在不指定目标用户的情况下,su命令将改为切换到root 用户:
$ su -c 'echo I am $(whoami)'
Password:
Running annie-script.sh as user root
3.2. 禁用密码提示
密码提示可能并不总是可取的,尤其是在编写脚本期间。由于su命令依赖 Linux 的 PAM 进行身份验证,我们可以通过其 PAM 配置文件禁用su命令的密码提示。
当用户dave以用户annie执行脚本时,让我们禁用密码提示。
首先,我们使用任何文本编辑器打开文件 /etc/pam.d/su。然后,我们将以下行添加到文件中auth enough pam_rootok.so行之后:
auth [success=ignore default=1] pam_succeed_if.so user = annie
auth sufficient pam_succeed_if.so use_uid user = dave
第一条规则检查目标用户是否为annie。如果是,那么它将继续执行第二条规则以检查当前用户是否为dave。如果两个规则都为 true,则将授予权限,并且dave可以使用 su而无需输入 annie的密码。
另一方面,如果任一规则失败,它将透明地忽略这些规则,提示输入密码。
配置完成后,我们现在可以在没有密码提示的情况下运行相同的命令:
$ su -c /home/annie/annie-script.sh annie
Running annie-script.sh as user annie
但是,如果我们尝试运行与用户root相同的命令,su将询问root的密码。这是因为dave的密码豁免仅适用于他以annie身份执行脚本时,而不是其他任何人。
4. 使用sudo
sudo 是另一个允许用户以其他用户身份执行脚本的命令行工具。在本文中,我们将跳过有关sudo命令的详细信息。相反,我们将专注于使用sudo作为另一个用户执行脚本。
4.1.以其他用户身份运行特定脚本
在我们可以使用sudo作为其他用户执行脚本之前,我们需要将当前用户添加到sudoers文件中。为此,我们将使用visudo 命令安全地编辑*/etc/sudoers*文件。
让我们以root身份执行以下命令,将dave添加到sudoers文件中:
$ echo 'dave ALL=(annie) /home/annie/annie-script.sh' | EDITOR='tee -a' visudo
上面的命令 echo 显规则并将规则传递到visudo命令中。默认情况下,visudo将打开一个交互式编辑器。但是,我们已经通过 EDITOR字段覆盖了该行为。最后,visudo将使用命令tee -a将规则附加到sudoers文件中。
该规则授予dave以用户 annie身份在任何主机上执行脚本 annie-script.sh的权限。
配置完成后,我们可以在以dave身份登录时使用sudo命令以 annie身份执行annie-script.sh:
$ sudo -u annie /home/annie/annie-script.sh
[sudo] password for dave:
Running annie-script.sh as user annie
sudo命令将要执行的命令或脚本作为参数。此外,可以指定 标志*-u以将目标用户从默认root*更改为另一个用户。
请注意,使用sudo时,它会请求当前用户的密码,而不是目标用户的密码。一旦通过身份验证,我们将看到该脚本确实已作为annie执行。
4.2. 以系统上的任何用户身份运行脚本
如果我们现在以 root身份运行命令,我们将看到以下输出:
$ sudo -u root /home/annie/annie-script.sh
[sudo] password for dave:
Sorry, user dave is not allowed to execute '/home/annie/annie-script.sh' as root
因为我们配置的规则只允许dave以annie(特定用户)的身份 执行annie-script.sh(特定脚本 )。要允许 dave以任何用户身份执行脚本annie-script.sh,我们可以更改dave的规则,如下所示:
dave ALL=(ALL) /home/annie/annie-script.sh
使用值ALL而不是 annie,dave将能够像系统上的任何用户一样执行annie-script.sh 。
一旦我们重新配置它,我们将能够成功运行相同的命令:
$ sudo -u root /home/annie/annie-script.sh
[sudo] password for dave:
Running annie-script.sh as user root
4.3. 跳过密码提示
使用sudo ,我们还可以通过在脚本和命令部分前面加上NOPASSWD前缀来禁用密码提示。
例如,我们可以通过调整规则来禁用dave 的密码提示:
dave ALL=(ALL) NOPASSWD: /home/annie/annie-script.sh
在规则中,我们在脚本前面添加了NOPASSWD。这将使dave在以其他用户身份运行annie-script.sh时免除密码输入请求。
重新配置后,我们可以以annie和 root身份重新运行命令,而无需输入dave的密码:
$ sudo -u annie /home/annie/annie-script.sh
Running annie-script.sh as user annie
$ sudo -u root /home/annie/annie-script.sh
Running annie-script.sh as user root