sudo带密码的命令行?
忙碌的日子里,我想在晚上运行
$ ./configure && make && sudo make install && halt
&001
晚上睡觉的时候,希望应用能自动安装。但是第二天我看到的是sudo问我密码的画面。那么,我怎么才能在一个命令行中运行sudo带密码,或者有其他的方法吗?
忙碌的日子里,我想在晚上运行
$ ./configure && make && sudo make install && halt
&001
晚上睡觉的时候,希望应用能自动安装。但是第二天我看到的是sudo问我密码的画面。那么,我怎么才能在一个命令行中运行sudo带密码,或者有其他的方法吗?
其他几个方案的缺点是,它们的缺点是不必要地以root身份运行./configure
和make
。
这有点迂回曲折,但应该是可行的:
sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"
注意,使用双引号是为了让$USER
被(非root)shell展开。我有时会做这样的事情,期望命令能运行很长时间,但出了问题,它立即终止;sleep 60
可以让我在系统关闭前杀死命令。或者你可以用halt
加上时间参数。
将HISTIGNORE设置为"sudo -S“
$ export HISTIGNORE='*sudo -S*'
然后将你的密码安全地传给sudo:
$ echo "your_password" | sudo -S -k <command>
"HISTIGNORE "的意思是不把这个命令保存到历史记录中。比如说,下面这条命令可以安全地将你的密码传输到sudo命令中,而不保留密码的历史记录。
”-S",是指使用stdin来获取密码,
“-k "是指忽略缓存的凭证,强制sudo总是询问。以上方法的缺点是,如果你想在历史记录中看到你运行的命令,那么它们就不会出现。另一种方法是更新sudo验证凭证缓存(默认是启用5分钟超时),然后单独运行sudo。但这样做的坏处是,你需要注意5分钟的缓存。
例如:
$ 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,以确保sudo缓存更新,因为默认是5分钟。是的,whoami应该不需要5分钟,但我觉得在每条命令之前运行也可以,这样可以保持一致。你也可以在你的 ~/.bashrc 文件中输入 "export HISTIGNORE=‘sudo -S’",然后用”. ~//.bashrc “或者登录后再登录。不过,我想用这个来编写脚本,所以我会把它放在我所有脚本的最上面,以确保安全。将 "echo ”“ | sudo -S -v "设置为变量也是个好主意,然后在每条需要root权限的命令之前运行这个变量就可以了,见Janar的评论。"John T "的评论中也应该包括”-k “参数,因为如果你运行 "sudo -S "而没有”-k",而sudo验证缓存中已经有你的凭证(并且仍然有效,默认的sudo验证缓存是5分钟),那么bash会把你的密码作为命令运行,这是不对的。
注意,我发现这个方法在老版本的sudo上不起作用,特别是 “Sudo 1.6.7p5版本":
$ echo "<your_password>" | sudo -S -k whoami
,而这个方法在新老版本的sudo上确实起作用,因为这个方法在新老版本的sudo:
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
如果你想更加小心,可以做一个脚本,改变文件的权限,让只有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 -e 'password\npassword\n' | sudo passwd root