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


115

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

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

晚上睡觉,希望可以自动安装该应用程序。但是第二天我看到的是sudo向我询问密码的屏幕。那么,如何在一个命令行中使用密码运行sudo,或者有其他方法可以执行此操作?


您需要halt以root身份运行。
基思·汤普森

1
没有sudo15分钟的超时时间吗?您是否无法运行(比如说sudo ls或类似方法)输入密码,然后在sudo特权仍处于活动状态的情况下运行上述命令?(我目前无法对此进行测试,否则我会将其发布为答案。)
Matt

1
超时时间sudo是可配置的。具有安全意识的人(又像我一样偏执狂)将其设置为零... :-)
dda

Answers:


173

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

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

因此,对于您的情况,它看起来像这样:

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

当然,请<password>用您的密码代替。


42
显然,如果有人在shell历史记录中看到密码有任何危险,那就不要运行它。
布雷特·丹尼尔

寻找在远程主机上运行特权命令的快速方法,这很有效。
nelaaro 2011年

13
如果您决定使用'echo <password> | sudo -S'选项,为避免在命令历史记录中暴露密码,请使用空格字符启动命令。当然,最好的选择是从安全文件中传递密码。
Shannon Haworth

如果您在$ VARIABLE中输入了密码(例如可以使用
肥皂进行配给

9年后,它仍然像魅力一样工作:)
WinEunuuchs2Unix

10

您可以使用以下命令替换命令行:

$sudo su

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

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


8
此的替代版本(并且可能是首选版本):sudo sh -c "./configure && make && make install && halt"
quack quixote 09年

2
但是,不是所有生成的编译文件都具有超级用户权限吗?这样可以防止您以后以普通用户身份运行./configure && make。
user45909 2013年

是的,user45909,您说得对。我个人从来没有重新运行过./configure && make,除非仍然下载了主程序包的更新之后,但是我可能并不典型。
CarlF

10

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

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

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

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

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


9

您还可以将sudo配置为,visudo以使您的用户无需密码即可将make用作sudo。

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

将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“或注销然后登录。但是,我正在考虑将其用于脚本目的,因此,为了获得最佳安全性实践,我将其保留在所有脚本的顶部。将sudo -S -v“改为变量也可能是一个好主意,然后只需在需要root特权的每个命令之前运行该变量,请参阅Janar的注释。” John T“的注释中还应包含” -k“参数,就像您在不带“ -k”的情况下运行“ sudo -S”并且sudo身份验证缓存已经具有您的凭据(并且仍然有效,默认sudo身份验证缓存为5分钟)一样,bash会以命令的方式运行您的密码,即坏。


1
就像关于使历史记录不可用的小注释一样,请在命令的前面加一个空格来运行命令。由于某种原因,这会导致历史忽略它。
马特·弗莱彻

4

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

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

在旧版本和新版本sudo上,此方法的确适用:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

不是原始问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,就可以在任何帖子中发表评论
DavidPostill

@Darren DeHaven:能否请您解释一下如何成为这里提出的问题的答案?
Renju Chandran chingath 2014年

4

你也可以这样做:

sudo -S <<< "password" command

在Mac OS中,只有这个对我有用。
Mehdico

2

如果要多加注意,可以制作一个脚本,更改文件的权限,以便只有root可以读取和编辑,然后才可以运行它。

示例:
1)创建一个文件:

gedit ~/.easy.install  

2)粘贴并保存:

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

3)使其可执行:

sudo chmod +x ~/.easy.install  

4)更改文件的权限,以便只有root可以读取和编辑它:

sudo chmod 700 ~/.easy.install  

5)运行:

~/.easy.install  

请享用 ;-)


echo <password>仍会显示在进程列表中,如果某人在正确的时机使用ps aux感到幸运,他们会以明文形式看到密码。最好将密码保存到文件,并使用<将文件从重定向到sudo。
bobpaul

1

如果有人偶然发现sudo不需要您的帐户密码,那么像这样设置sudo将会很危险。除非您知道自己在做什么,否则不要那样做。我的实验计算机在本地A +培训计划中发生过太多次了... -_-

John T.所说的话听起来不错,但是仍然存在在shell历史记录中找到密码的风险。CarlF所说的听起来更好,但是如果一个命令失败,则计算机仍将以超级用户权限运行。


0

就我个人而言,我的行为与John T在2009年11月9日2:47回答的完全相同,我还根据他的回答进行了改进,谢谢。

区别在于我倾向于使用变量,例如:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

这样,我可以轻松地使用我的变量而不是sudo,

$AutoSuDo apt-get update;

对于一些较长的脚本,这非常方便。我主要将这些用于我必须维护的其他个人计算机。

我还建议注意:

  • desgua在2011年4月19日在23:56回答
  • user224306于13年5月14日在17:38评论约翰T在09年11月9日在2:47回答

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.