在一个命令行中使用密码进行 sudo 吗?

在一个命令行中使用密码进行 sudo 吗?

在忙碌的日子里,我想跑步

$ ./configure && make && sudo make install && halt

晚上睡觉,希望应用程序会自动安装。但第二天我看到的是 sudo 要求我输入密码的屏幕。那么我如何在一个命令行中运行带有密码的 sudo,或者还有其他方法可以做到这一点?

答案1

是的,使用-S从 STDIN 读取密码的开关:

$echo <password> | sudo -S <command>

因此,对于你的情况,它看起来应该是这样的:

$./configure && make && echo <password> | sudo -S make install && halt

当然,<password>用你的密码替换。

答案2

将 HISTIGNORE 设置为“sudo-S 复制代码

$ export HISTIGNORE='*sudo -S*'

然后将你的密码安全地传递给 sudo:

$ echo "your_password" | sudo -S -k <command>

“HISTIGNORE” 表示不将此命令保存到历史记录中。即内存中的历史记录或“~/.bash_history”文件中的历史记录。

例如,下面将安全地将您的密码传送到 sudo 命令,而不保留您的密码历史记录。

“-S” 表示使用 stdin 输入密码,

“-k” 表示忽略缓存的凭据,以强制 sudo 始终询问。这是为了保持一致的行为。

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

上述方法的缺点是,如果您以后想在历史记录中查看您运行的命令,它们将不在那里。另一种方法是更新 sudo 身份验证凭据缓存(默认启用 5 分钟超时),然后单独运行 sudo。但这种方法的缺点是您需要注意 5 分钟缓存。

例如:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

注意,我在每个命令之前都运行了 sudo,以确保 sudo 缓存已更新,因为默认值为 5 分钟。是的,whoami 不应该花 5 分钟,但我认为最好在每个命令之前运行它以保持一致性。您还可以输入“export HISTIGNORE='sudo-S 复制代码'” 在您的 ~/.bashrc 文件中,然后使用“。~/.bashrc”加载它或注销然后登录。但是,我正在考虑将其用于脚本目的,因此为了获得最佳安全实践,我将把它放在所有脚本的顶部。将“echo”“| sudo -S -v”设置为变量也可能是一个好主意,然后在每个需要 root 权限的命令之前运行该变量,请参阅 Janar 的评论。“John T”的评论还应包括“-k”参数,因为如果您运行不带“-k”的“sudo -S”并且 sudo 身份验证缓存已经有您的凭据(并且仍然有效,默认的 sudo 身份验证缓存为 5 分钟)那么 bash 将运行您的密码作为命令,这是不好的。

答案3

你也可以这样做:

sudo -S <<< "password" command

答案4

其他几个解决方案的缺点是它们不需要以 root 身份./configure运行make

这有点复杂,但应该可以工作:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

请注意,使用双引号是为了允许$USER(非 root)shell 进行扩展。

我可能还会在命令sleep 60前添加一个halt。我有时会做这样的事情,期望命令运行很长时间,但出现问题并立即终止;这sleep让我可以在系统关闭之前终止命令。或者您可以使用shutdown时间参数。

相关内容