我正在编写一个UNIX shell函数,该函数将执行一个命令,提示用户输入密码。我想将密码硬编码到脚本中并将其提供给命令。我已经尝试将密码输入命令,如下所示:
function() {
echo "password" | command
}
这可能对某些命令不起作用,因为命令可能会在提示输入密码之前刷新输入缓冲区。
我还尝试将标准输入重定向到包含这样的密码的文件,但这不起作用:
function() {
echo "password" > pass.tmp
command < pass.tmp
rm pass.tmp
}
我知道有些命令允许将密码作为参数提供,但我宁愿通过标准输入。
我正在寻找一种快速而肮脏的方式将密码传递给bash中的命令。
答案 0 :(得分:32)
如何使用autoexpect将密码管道输入命令:
这些步骤用Ubuntu 12.10桌面说明。您的发行版的确切命令可能略有不同。
这很危险,因为您冒险将您使用的密码暴露给可以阅读autoexpect脚本文件的任何人。
请勿将您的root密码或高级用户密码通过这样的方式进行管道公开。 Root kit会立即找到这个,你的盒子就是拥有的。
EXPECT生成一个进程,读取进来的文本,然后发送脚本文件中预定义的文本。
确保您已安装expect
和autoexpect
:
sudo apt-get install expect
sudo apt-get install expect-dev
阅读:
man expect
man autoexpect
转到您的主目录:
cd /home/el
用户el
无法将文件chown到root并且必须输入密码:
touch testfile.txt
sudo chown root:root testfile.txt
[enter password to authorize the changing of the owner]
这是我们想要自动化的密码条目。重新启动终端以确保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
您已创建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
您需要验证上述expect命令是否合适。如果autoexpect脚本过于敏感或不够敏感,那么它将挂起。在这种情况下,它是可以接受的,因为期望是等待总是到达的文本。
以用户el:
运行expect脚本expect my_test_expect.exp
spawn sudo chown root:root myfile.txt
[sudo] password for el:
my_test_expect.exp中包含的密码通过用户线路传输到root用户。要查看密码是否已被接受,请查看myfile.txt
:
ls -l
-rw-r--r-- 1 root root 0 Dec 2 14:48 myfile.txt
它起作用,因为它是root,并且el从未输入密码。如果您使用此脚本公开root,sudo或高级用户密码,那么在您的盒子上获取root将很容易。这就是对安全系统的惩罚,让所有人都可以毫无疑问地提出问题。
答案 1 :(得分:20)
看看autoexpect
(体面的教程HERE)。它就像你可以在不诉诸欺骗的情况下那样快速而肮脏。
答案 2 :(得分:6)
安全命令不允许这样做,这是正确的,我担心 - 这是一个安全漏洞,你可以驾驶卡车。
如果您的命令不允许使用输入重定向,命令行参数或配置文件,那么您将不得不诉诸严重的欺骗。
某些应用程序实际上会打开/dev/tty
以确保您很难打败安全性。你可以通过暂时接管/dev/tty
(例如创建自己的管道)来 绕过它们,但这需要严格的权限,甚至它都可以被击败
答案 3 :(得分:6)
您可以使用//tbody/tr/td[position() = count(//tbody/tr/th[./text() = 'Name']/preceding-sibling::th) + 1][./text() = 'STU']/../td[position() = count(//tbody/tr/th[./text() = 'salary']/preceding-sibling::th) + 1]/text()
标志来读取标准输入。在下面找到一个例子:
-S
答案 4 :(得分:3)
read
在此示例中,使用 key f1 f2 state
0 001 A B f3
1 002 C D f4
2 003 A D f4
3 004 C B f5
获取密码并将其存储在变量read
中。然后,7z
使用密码来创建加密的存档:
pass
但是请注意,密码可以easily be sniffed。
答案 5 :(得分:2)
提示输入密码的程序通常会将tty设置为“原始”模式,并直接从tty读取输入。如果您在pty中生成子进程,则可以使其工作。这就是Expect所做的......
答案 6 :(得分:1)
只需使用:
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
答案 7 :(得分:-2)
这是一个非常不安全的想法,但是: Using the passwd command from within a shell script