在忙碌的日子里,我想在夜间运行

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


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

评论

您需要停止以root身份运行。

sudo不会有15分钟的超时时间吗?您是否不能运行sudo ls或类似的东西,输入密码,然后在仍然具有sudo权限的情况下运行上述命令? (我目前无法对此进行测试,否则我会将其发布为答案。)

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

另请参阅在bash脚本中提示输入sudo密码并以编程方式提升特权?,如何在需要sudo的bash脚本中仅输入一次密码,如何从脚本内请求root特权,在脚本中创建sudo用户而不提示输入密码... ,如何提示用户输入sudo密码?等

#1 楼

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

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


因此,您的情况如下所示:

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


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

评论


显然,如果有人在外壳程序历史记录中看到密码有任何危险,那就不想运行它。

–布雷特·丹尼尔(Brett Daniel)
2009年11月9日,3:16

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

–nelaaro
2011年9月15日上午11:08

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

– Shannon Haworth
13年5月14日在17:38

如果您在$ VARIABLE中输入密码,则可能要使用该密码(例如,可以使用sops进行配置)

– Natim
17年9月6日在9:25

9年后,仍然像魅力一样发挥作用:)

–WinEunuuchs2Unix
18/09/23在21:20

#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分钟的时间,但我认为最好还是在每个命令之前运行它,以确保一致性。您也可以在〜/ .bashrc文件中放入“ export HISTIGNORE ='sudo -S'”,然后用“。〜/ .bashrc”加载它,或者注销然后登录。但是,我正在考虑将其用于脚本目的,因此,为了获得最佳安全性实践,我将其保留在所有脚本的顶部。将“ echo”“ | sudo -S -v”设置为变量也可能是一个好主意,然后只需在需要根特权的每个命令之前运行该变量,请参阅Janar的注释。 “ John T”的注释还应该包含“ -k”参数,就像您在不带“ -k”的情况下运行“ sudo -S”并且sudo身份验证缓存已经具有您的凭据一样(并且仍然有效,默认的sudo身份验证缓存为5分钟),然后bash会以命令的方式运行您的密码,这很糟糕。

评论


就像关于使历史记录中不可用的内容的小注释一样,请在命令前面的单个空格处运行命令。由于某种原因,这会导致历史忽略它。

–马特·弗莱彻(Matt Fletcher)
17年8月2日在8:20

感谢-k提示!

–塞尔吉奥·阿布鲁(Sergio Abreu)
20年4月11日在6:39

如果将密码放入命令行参数,则在ps的输出中所有人都可以看到该密码。最好将其放在文件中并使用间接寻址(sudo -S -v ')

– bobbogo
20-4-14上午17:42

#3 楼

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

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


评论


我发现不需要声明别名。添加my_user ALL =(ALL)NOPASSWD:/ usr / bin /您的命令正常。请记住将其添加到最后以覆盖其他配置。

–李俊乐
20年1月20日,12:38

#4 楼

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

$sudo su

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

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

评论


备用(可能是首选)版本:sudo sh -c“ ./configure && make && make install && halt”

–嘎嘎吉qua德
09年9月9日,下午3:51

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

–user45909
13年8月4日在23:35

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

– CarlF
13年8月6日在19:48

#5 楼

其他一些解决方案的缺点是它们不必要以root用户身份运行./configuremake

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

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


请注意使用双引号允许$USER被(非root用户)外壳扩展。

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

#6 楼

您也可以执行以下操作:

sudo -S <<< "password" command


评论


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

– Sabrina
19年9月19日19:30在

#7 楼

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

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


此方法的作用所在在旧版本和新版本上工作sudo:

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


评论


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

–DavidPostill♦
2014年12月8日15:25

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

– Renju Chandran chingath
2014年12月8日15:50

#8 楼

如果要多加注意,可以制作一个脚本,更改文件的权限,以便只有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 仍会显示在进程列表中,如果某人在正确的时机使用ps aux感到幸运,他们会以明文形式看到密码。最好将密码保存到文件,并使用<将文件从重定向到sudo。

– bobpaul
18年4月18日在17:26

#9 楼

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

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

#10 楼

就我个人而言,我的行为与John T在09年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 4月答复19年11月19日23:56
user224306于13年5月14日17:38发表评论,John T于09年11月9日2:47回答


#11 楼

问题已解决。
例如,以用户root:

echo -e 'password\npassword\n' | sudo passwd root


评论


-e标志有什么作用,@ jerson Martinez?

–user674669
19年4月25日在18:00

echo的-e标志允许它将某些序列解释为具有特殊含义。

–安东尼奥·莫雷诺(Antonio Moreno)
19年4月26日在15:03