sudo 在一个命令行中输入密码?

Jic*_*hao 168 sudo shell

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

$ ./configure && make && sudo make install && halt
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*n T 256

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

$echo <password> | sudo -S <command>
Run Code Online (Sandbox Code Playgroud)

所以对于你的情况,它看起来像这样:

$./configure && make && echo <password> | sudo -S make install && halt
Run Code Online (Sandbox Code Playgroud)

当然,替换<password>为您的密码。

  • 显然,如果其他人在 shell 历史记录中看到密码有任何危险,人们就不想运行它。 (52认同)
  • 如果您决定使用 'echo &lt;password&gt; | sudo -S' 选项,为了避免在命令历史记录中暴露密码,请使用空格字符启动命令。当然,最好的选择是通过管道从安全文件中输入密码。 (23认同)

use*_*365 29

将 HISTIGNORE 设置为“ sudo -S

$ export HISTIGNORE='*sudo -S*'
Run Code Online (Sandbox Code Playgroud)

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

$ echo "your_password" | sudo -S -k <command>
Run Code Online (Sandbox Code Playgroud)

“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
Run Code Online (Sandbox Code Playgroud)

上述方法的缺点是,如果您想查看稍后在历史记录中运行的命令,它们将不存在。另一种方法是更新 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
Run Code Online (Sandbox Code Playgroud)

注意我在每个命令之前运行了 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 将改为将您的密码作为命令运行,即坏的。

  • 正如关于使历史记录中不可用的事情的一个小说明一样,在命令前面加上一个空格来运行您的命令。出于某种原因,这会导致历史忽略它。 (2认同)
  • 如果您将密码放入命令行参数中,那么所有人都可以在 _ps_ 的输出中看到它。最好将其放在文件中并使用间接(`sudo -S -v &lt;FILE`),或者如果 _bash_ 是您的 shell,则使用此处的字符串(`sudo -S -v &lt;&lt;&lt;'&lt;your_password&gt;'`) (2认同)

Nat*_*tim 11

您还可以配置 sudovisudo以允许您的用户在没有密码的情况下将 make 用作 sudo。

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 11

一些其他解决方案的缺点是,他们不必要的运行./configure,并make作为根。

这有点令人费解,但它应该可以工作:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"
Run Code Online (Sandbox Code Playgroud)

请注意使用双引号以允许$USER(非根)shell 进行扩展。

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


小智 11

你也可以这样做:

sudo -S <<< "password" command
Run Code Online (Sandbox Code Playgroud)

  • 在 mac os 中只有这个对我有用。 (2认同)

Car*_*rlF 10

你可以用这个替换你的命令行:

$sudo su

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

系统会立即提示您输入密码,然后其余命令将以超级用户身份运行。

  • 另一个(可能是首选)版本:`sudo sh -c "./configure &amp;&amp; make &amp;&amp; make install &amp;&amp;halt"` (8认同)
  • 但是不是所有生成的编译文件都具有超级用户权限吗?这将阻止您以后以普通用户身份运行 ./configure &amp;&amp; make 。 (2认同)

小智 5

请注意,我发现该方法不适用于旧版本的 sudo,特别是“Sudo 版本 1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami
Run Code Online (Sandbox Code Playgroud)

此方法适用于旧版本和新版本 sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Run Code Online (Sandbox Code Playgroud)