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

Nat*_* W. 37 unix passwords bash

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

function() {
    echo "password" | command
}
Run Code Online (Sandbox Code Playgroud)

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

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

function() {
    echo "password" > pass.tmp
    command < pass.tmp
    rm pass.tmp
}
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*ski 33

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

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

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

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

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

  1. 确保您已安装expectautoexpect安装:

    sudo apt-get install expect
    sudo apt-get install expect-dev
    
    Run Code Online (Sandbox Code Playgroud)
  2. 阅读它:

    man expect
    man autoexpect
    
    Run Code Online (Sandbox Code Playgroud)
  3. 转到您的主目录:

    cd /home/el
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用户el无法将文件chown到root并且必须输入密码:

    touch testfile.txt
    sudo chown root:root testfile.txt 
       [enter password to authorize the changing of the owner]
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  8. 您需要验证上述expect命令是否合适.如果autoexpect脚本过于敏感或不够敏感,那么它将挂起.在这种情况下,它是可以接受的,因为期望是等待总是到达的文本.

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

    expect my_test_expect.exp 
    spawn sudo chown root:root myfile.txt
    [sudo] password for el: 
    
    Run Code Online (Sandbox Code Playgroud)
  10. my_test_expect.exp中包含的密码通过管道传输到用户el的root.要查看密码是否被接受,请查看myfile.txt:

    ls -l
    -rw-r--r--  1 root root          0 Dec  2 14:48 myfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 屏幕抓取工具和机器人肉手指戳 MacBook 触控板以证明我们不是机器人;尽管如此,在 bash 中以明文方式传递密码是最糟糕的代码味道,当我在 2013 年写下这篇文章时,有人发明了一台时间机器,这让我大吃一惊。 (3认同)

Sie*_*geX 20

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

  • 如果此处的答案中至少包含一个快速片段,那就太好了。六年后,链接并不“总是”有效。这个确实可以,但是:) (3认同)

小智 7

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

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}    
Run Code Online (Sandbox Code Playgroud)

  • @AwaisKaleem这个答案应该澄清它只适用于像“shutdown”这样的命令,这些命令会导致系统专门提示输入“sudo”密码。首先通过“sudo”选项“-S”获取超级用户权限,从而避免调用“shutdown”来请求密码。它不适用于本身提示输入密码的命令。 (2认同)

pax*_*blo 6

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

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

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


Mat*_*aun 6

read

read这是一个用于获取密码并将其存储在变量中的示例pass。然后,7z使用密码创建加密存档:

read -s -p "Enter password: " pass && 7z a archive.zip a_file -p"$pass"; unset pass
Run Code Online (Sandbox Code Playgroud)

但请注意,密码很容易被嗅探