如何提供密码给在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产生一个进程,读取进入的文本,然后在脚本文件中发送预定义的文本。

  1. 确保你有expectautoexpect expect安装:

     sudo apt-get install expect sudo apt-get install expect-dev 
  2. 阅读它:

     man expect man autoexpect 
  3. 转到您的主目录:

     cd /home/el 
  4. 用户el无法将文件chown到root并且必须input密码:

     touch testfile.txt sudo chown root:root testfile.txt [enter password to authorize the changing of the owner] 
  5. 这是我们想要自动化的密码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 
  6. 你已经创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. 
  7. 您可以在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 
  8. 您将需要validation上面的expect命令是否合适。 如果autoexpect脚本过于敏感或不够敏感,则会挂起。 在这种情况下,这是可以接受的,因为期望等待文本总是到达。

  9. 以用户el的身份运行expect脚本:

     expect my_test_expect.exp spawn sudo chown root:root myfile.txt [sudo] password for el: 
  10. 包含在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命令