如何提供密码给在bash中提示一个的命令?
我在写一个UNIX shell函数,它将执行一个命令,提示用户input密码。 我想将密码硬编码到脚本中并提供给命令。 我已经尝试将密码input到命令中,如下所示:
function() { echo "password" | command }
这可能不适用于某些命令,因为在提示input密码之前,命令可能会刷新input缓冲区。
我也试着将标准inputredirect到一个包含这样的密码的文件,但是这也不起作用:
function() { echo "password" > pass.tmp command < pass.tmp rm pass.tmp }
我知道有些命令允许将密码作为参数提供,但我宁愿通过标准input。
我正在寻找一个快速和肮脏的方式在bash中input密码到一个命令。
看看autoexpect
(体面教程这里 )。 这是尽可能快而又脏,你可以得到而不诉诸于欺骗。
如何使用autoexpect将密码input到命令中:
这些步骤用Ubuntu 12.10桌面来说明。 您的分配确切的命令可能会稍有不同。
这是很危险的,因为你冒任何可以读取autoexpect脚本文件的人冒任何密码的风险。
不要暴露你的root密码或高级用户密码通过pipe道他们通过这样的期望。 根工具包会立即发现,你的箱子是拥有的。
EXPECT产生一个进程,读取进入的文本,然后在脚本文件中发送预定义的文本。
-
确保你有
expect
和autoexpect
expect
安装:sudo apt-get install expect sudo apt-get install expect-dev
-
阅读它:
man expect man autoexpect
-
转到您的主目录:
cd /home/el
-
用户
el
无法将文件chown到root并且必须input密码:touch testfile.txt sudo chown root:root testfile.txt [enter password to authorize the changing of the owner]
-
这是我们想要自动化的密码input。 重新启动terminal,以确保sudo再次要求我们input密码。 再次进入/ home / el并执行此操作:
touch myfile.txt autoexpect -f my_test_expect.exp sudo chown root:root myfile.txt [enter password which authorizes the chown to root] autoexpect done, file is my_test_expect.exp
-
你已经创build了
my_test_expect.exp
文件。 你的超级秘密密码是存储在这个文件的明文。 这应该让你非常不舒服。 尽可能地限制权限和所有权来缓解一些不适:sudo chown el my_test_expect.exp //make el the owner. sudo chmod 700 my_test_expect.exp //make file only readable by el.
-
您可以在
my_test_expect.exp
的底部看到这些命令:set timeout -1 spawn sudo chown root:root myfile.txt match_max 100000 expect -exact "\[sudo\] password for el: " send -- "YourPasswordStoredInPlaintext\r" expect eof
-
您将需要validation上面的expect命令是否合适。 如果autoexpect脚本过于敏感或不够敏感,则会挂起。 在这种情况下,这是可以接受的,因为期望等待文本总是到达。
-
以用户el的身份运行expect脚本:
expect my_test_expect.exp spawn sudo chown root:root myfile.txt [sudo] password for el:
-
包含在my_test_expect.exp中的密码被用户el通过pipe道传送到根。 要查看密码是否被接受,请查看
myfile.txt
:ls -l -rw-r--r-- 1 root root 0 Dec 2 14:48 myfile.txt
它工作,因为它是根,并从来没有input密码。 如果你用这个脚本暴露你的root,sudo或者高级用户密码,那么在你的机器上获取root会很容易。 这是一个安全系统的处罚,让大家不问任何问题。
安全的命令不会允许这样做,而且,我担心 – 这是一个安全漏洞,你可以驾驶卡车通过。
如果你的命令不允许使用inputredirect,命令行参数或configuration文件,那么你将不得不采取严重的欺骗手段。
一些应用程序实际上会打开/dev/tty
以确保您在安全性方面遇到困难。 你可以通过暂时接pipe/dev/tty
(例如创build你自己的pipe道)来绕过它们,但是这需要严重的特权,甚至可以被打败。
您可以使用-S
标志从stdinput读取。 查找下面的例子:
function shutd() { echo "mySuperSecurePassword" | sudo -S shutdown -h now }
提示input密码的程序通常将tty设置为“raw”模式,并直接从tty读取input。 如果你在pty中产生subprocess,你可以做这个工作。 Expect就是这么做的
只需使用:
echo "password" | sudo -S mount -t vfat /dev/sda1 /media/usb/; if [ $? -eq 0 ]; then echo -e '[ ok ] Usb key mounted' else echo -e '[warn] The USB key is not mounted' fi
这段代码适用于我,并在/etc/init.d/myscriptbash.sh中
这是一个非常不安全的想法,但是: 在shell脚本中使用passwd命令