在非交互模式下使用sudo命令
1. 概述
在 Linux 中,*sudo *命令允许我们以超级用户身份执行命令或脚本。但是,默认情况下,sudo命令以交互模式运行。
在本教程中,我们将了解如何让sudo在非交互模式下工作——例如,将密码作为参数传递给它。
此外,我们还讨论了无需密码即可以超级用户身份运行命令的其他方法。
2. 将密码作为参数传递
首先,让我们回顾一下sudo命令的默认行为:
kent$ sudo cp /root/.vimrc root_vimrc
[sudo] password for kent:
kent$ ls -l root_vimrc
-rw------- 1 root root 19768 Oct 23 23:24 root_vimrc
在上面的示例中,我们以普通用户kent的身份执行了sudo命令。我们想复制root的Vim配置文件到当前目录。
如输出所示, sudo提示输入密码并等待我们提供用户kent的密码以继续。在我们输入正确的密码后,它将 .vimrc 复制到当前目录。
有时,我们希望以非交互模式运行 sudo命令——例如,当我们需要将此sudo命令包装在脚本中时。
接下来,让我们看看如何将密码作为参数传递给sudo。
2.1. 使用*-S*选项
sudo 命令提供了**一个 -S选项来从标准输入 (stdin)中读取密码,**而不是使用终端设备。
让我们使用相同的命令测试此选项:
kent$ echo "My Pass" | sudo -S cp /root/.vimrc root_vimrc2
[sudo] password for kent:
kent$ ls -l root_vimrc2
-rw------- 1 root root 19768 Oct 23 23:34 root_vimrc2
如我们所见,我们已将密码通过管道传输到stdin。即使sudo命令仍然显示提示符,但这一次,它没有等待我们的输入,而是继续执行 cp命令。
2.2. 抑制提示
值得一提的是,*当我们使用-S*选项时,sudo会将提示写入标准错误 ( stderr )**而不是标准输出 ( stdout )。
如果需要,我们可以使用重定向 快速抑制密码提示:
kent$ echo "My Password" | sudo -S cp /root/.vimrc root_vimrc3 2>/dev/null
kent$ ls -l root_vimrc3
-rw------- 1 root root 19768 Oct 23 23:44 root_vimrc3
2.3. 安全风险
到目前为止,我们已经成功地让 sudo在非交互模式下工作。但是,如果我们重新访问我们的命令,我们可以看到我们将密码作为明文传递给sudo命令。
如果我们在终端中执行这些命令,密码可能会存储在命令历史记录 中。此外,如果我们将命令包装在 shell 脚本中,脚本文件将保存密码。
也就是说,这种方法可能会产生安全风险。特别是当我们在公共服务器上应用它时,我们可能会在不知不觉中泄露密码。 接下来,让我们看看另一种在不提供密码的情况下使用sudo命令执行命令的方法。
3. 以超级用户身份执行命令而不要求输入密码
3.1. 脚本示例
首先,让我们创建一个简单的 shell 脚本,以便于解释:
kent$ cat cpvimrc.sh
#!/bin/bash
echo "Copy root's .vimrc as root_vimrc"
cp /root/.vimrc root_vimrc
echo "File copied:"
ls -l root_vimrc
基本上,这个脚本包装了复制root的*.vimrc文件的命令和ls*命令。
毫不奇怪,如果我们直接以kent用户身份运行此脚本,它将失败,因为只有用户root才能访问*/root/.vimrc*文件。
此外,如果我们使用sudo执行它,我们将被要求输入密码。
接下来,我们将讨论如何使用sudo命令以超级用户身份执行此脚本而不要求输入密码。
3.2. 更改sudo命令的配置
我们可以配置sudo命令,让所有用户或指定用户无需输入密码即可访问特定程序。
要编辑sudo命令的配置,我们可以执行visudo 命令或编辑文件/etc/sudoers。**它们都需要root权限才能保存更改。
现在,让我们回到我们的例子。我们的目标是让kent用户以非交互模式运行“ sudo ./cpvimrc.sh ”命令。
为此,我们可以在sudo命令的配置中添加一行:
kent ALL=(root) NOPASSWD: /tmp/test/cpvimrc.sh
这一行告诉sudo:当用户kent使用sudo执行脚本/tmp/test/cpvimrc.sh时,sudo命令将以root*身份运行脚本而不要求输入密码。*
接下来,让我们保存更改并测试它是否按我们预期的那样工作:
kent$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 22:59 root_vimrc
正如我们在输出中看到的,这次sudo没有提示输入密码,而是直接复制了文件。此外,我们没有在任何地方泄露密码。
但是,此权限仅分配给用户 kent。因此,如果我们以另一个普通用户的身份执行相同的脚本,我们必须提供正确的密码:
guest$ sudo ./cpvimrc.sh
[sudo] password for guest:
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:05 root_vimrc
上面的示例表明,当我们以用户guest 身份登录并使用sudo 启动脚本时,我们必须输入密码。
3.3. 允许所有用户以root身份执行程序而不要求输入密码
有时,我们希望允许所有具有sudo 权限的用户以root 身份运行程序而无需输入密码。
为此,我们可以在 sudo命令的配置中添加一个非常相似的行:
ALL ALL=(root) NOPASSWD: /tmp/test/cpvimrc.sh
现在,所有具有sudo权限的用户都可以作为超级用户运行脚本*/tmp/test/cpvimrc.sh*而无需提供密码。
接下来,让我们保存更改并进行测试:
kent$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:18 root_vimrc
guest$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:19 root_vimrc
上面的输出显示guest和 kent都可以以root身份执行脚本,而不会被提示输入密码。