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

6mzjoqzu  于 2023-01-30  发布在  Unix
关注(0)|答案(8)|浏览(146)

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

function() {
    echo "password" | command
}

这对于某些命令可能不起作用,因为命令可能在提示输入密码之前刷新输入缓冲区。
我也尝试过将标准输入重定向到包含密码的文件中,如下所示,但也不起作用:

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

我知道有些命令允许将密码作为参数提供,但我宁愿使用标准输入。
我正在寻找一种快速而又简单的方法,在bash中将密码输入命令。

jhiyze9q

jhiyze9q1#

如何使用自动预期将密码通过管道输入命令:

这些步骤是在Ubuntu 12.10桌面上演示的,您的发行版的具体命令可能会略有不同。
这是危险的,因为您可能会将您使用的密码暴露给任何可以读取自动预期脚本文件的人。
不要暴露您的根密码或超级用户密码管道通过期待像这样。根工具包将发现这在瞬间和您的方块是拥有的。
EXPECT生成一个进程,读取进来的文本,然后发送脚本文件中预定义的文本。
1.请确保已安装expectautoexpect

sudo apt-get install expect
sudo apt-get install expect-dev

1.仔细阅读:

man expect
man autoexpect

1.转到您的主目录:

cd /home/el

1.用户el无法将文件的所有权更改为root,必须输入密码:

touch testfile.txt
sudo chown root:root testfile.txt 
   [enter password to authorize the changing of the owner]

1.这是我们希望自动输入的密码。重新启动终端以确保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

1.您已经创建了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.

1.您可以在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

1.你需要验证上面的expect命令是否正确。如果autoexpect脚本过于敏感或不够敏感,那么它将挂起。在这种情况下,这是可以接受的,因为expect正在等待总是会到达的文本。
1.以用户el身份运行expect脚本:

expect my_test_expect.exp 
spawn sudo chown root:root myfile.txt
[sudo] password for el:
  1. my_test_expect.exp中包含的密码由用户el通过管道传输到root的chown中。要查看密码是否被接受,请查看myfile.txt
ls -l
-rw-r--r--  1 root root          0 Dec  2 14:48 myfile.txt

它之所以有效是因为它是root用户,而且el从来没有输入过密码。如果你用这个脚本暴露了你的root、sudo或超级用户密码,那么在你的机器上获得root用户就很容易了。这是对一个让每个人都能毫无疑问地进入的安全系统的惩罚。

gpnt7bae

gpnt7bae2#

看一看autoexpectHERE教程),它是你不需要使用技巧就能得到的最快最脏的教程。

oxosxuxt

oxosxuxt3#

您可以使用-S标志从标准输入读取数据。

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}
toiithl6

toiithl64#

安全命令不会允许这样做,我想这是正确的, -这是一个你可以开卡车通过的安全漏洞。
如果您的命令不允许使用输入重定向、命令行参数或配置文件,那么您将不得不采取严重的欺骗手段。
一些应用程序实际上会打开/dev/tty,以确保你很难破解安全性。你可以通过临时接管/dev/tty来绕过它们(例如,创建自己的管道),但这需要很高的特权,甚至可以破解它。

lpwwtiir

lpwwtiir5#

带有read

下面的例子使用read获取密码并将其存储在变量pass中,然后7z使用该密码创建一个加密存档:

read -s -p "Enter password: " pass && 7z a archive.zip a_file -p"$pass"; unset pass

但要注意,密码可以easily be sniffed

gtlvzcf8

gtlvzcf86#

提示输入密码的程序通常会将tty设置为“raw”模式,并直接从tty读取输入。如果你在一个pty中生成子进程,你可以让它工作。这就是Expect所做的...

2nbm6dog

2nbm6dog7#

只需用途:

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

相关问题