如何为bash中提示输入的命令提供密码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为bash中提示输入的命令提供密码?相关的知识,希望对你有一定的参考价值。

我正在编写一个UNIX shell函数,它将执行一个命令,提示用户输入密码。我想将密码硬编码到脚本中并将其提供给命令。我已经尝试将密码管道输入命令,如下所示:

function() {
    echo "password" | command
}

这可能对某些命令不起作用,因为命令可能会在提示输入密码之前刷新输入缓冲区。

我也尝试将标准输入重定向到包含这样的密码的文件,但这也不起作用:

function() {
    echo "password" > pass.tmp
    command < pass.tmp
    rm pass.tmp
}

我知道有些命令允许将密码作为参数提供,但我宁愿通过标准输入。

我正在寻找一种快速而肮脏的方法,将密码传递给bash中的命令。

答案

看看autoexpect(体面的教程HERE)。它就像你可以在不诉诸欺骗的情况下那样快速而肮脏。

另一答案

如何使用autoexpect将密码管道输入命令:

这些步骤用Ubuntu 12.10桌面说明。您的发行版的确切命令可能略有不同。

这很危险,因为您冒险将您使用的任何密码暴露给可以读取autoexpect脚本文件的任何人。

不要通过这样的方式管理它们来暴露您的root密码或高级用户密码。根工具包会立即找到这个,你的盒子是拥有的。

EXPECT生成一个进程,读取进来的文本,然后发送脚本文件中预定义的文本。

  1. 确保安装了expectautoexpectsudo apt-get install expect sudo apt-get install expect-dev
  2. 阅读它: man expect man autoexpect
  3. 转到您的主目录: cd /home/el
  4. 用户el无法将文件chown到root并且必须输入密码: touch testfile.txt sudo chown root:root testfile.txt [enter password to authorize the changing of the owner]
  5. 这是我们想要自动化的密码条目。重新启动终端以确保sudo再次要求我们输入密码。再次转到/ 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. 您已经创建了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 " expect eof
  8. 您需要验证上述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的root。要查看密码是否被接受,请查看myfile.txtls -l -rw-r--r-- 1 root root 0 Dec 2 14:48 myfile.txt

它起作用,因为它是root,el从未输入密码。如果您使用此脚本公开root,sudo或高级用户密码,那么在您的盒子上获取root将很容易。这就是对安全系统的惩罚,让所有人都可以毫无疑问地提出问题。

另一答案

安全命令不允许这样做,这是正确的,我担心 - 这是一个安全漏洞,你可以驾驶卡车通过。

如果您的命令不允许使用输入重定向,命令行参数或配置文件,那么您将不得不诉诸严重的欺骗。

有些应用程序实际上会打开/dev/tty以确保您很难击败安全性。你可以通过暂时接管/dev/tty(例如创建你自己的管道)绕过它们,但这需要严格的特权,甚至可以被击败。

另一答案

您可以使用-S标志从std输入读取。在下面找一个例子:

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}    
另一答案

提示输入密码的程序通常将tty设置为“原始”模式,并直接从tty读取输入。如果您在pty中生成子进程,则可以使其工作。这就是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中

另一答案

这是一个非常不安全的想法,但是:Using the passwd command from within a shell script

以上是关于如何为bash中提示输入的命令提供密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 git pull 输入带有密码的命令?

如何为 gradle 任务命令行参数提供 flyway 密码?

在linux里输入su命令,输入密码后提示bash:…………(一个地址)找不到文件,是怎么回事?

如何为`system()`调用的命令提供参数?

如何为 Camellia 密码提供正确的密钥并在 Java 中进行加密

如何为需要 4 个数字输入的 C 程序编写 Bash 脚本? [复制]