使用Expect自动化ssh-add密码

时间:2015-10-10 15:49:02

标签: shell ubuntu ssh expect

在shell脚本中,我需要在运行ssh-add时自动填写密码。

我遇到expect并试过这个剧本,但没有运气:

expect -c "spawn ssh-add; expect -re \".*passphrase.*\"; send \"mypass\r\n\";"

脚本不会抛出任何错误,但是当它ssh时会询问密码(意味着它不起作用)。

编辑:如果运行ssh-add并手动添加密码,则按预期工作。

2 个答案:

答案 0 :(得分:1)

这是一种更好的自动化方式。

创建一个脚本(例如带有可执行标志的ps.sh),用于打印您的密码,例如:

#!/bin/sh
echo 'my_passphrase'

然后通过SSH_ASKPASS变量指定此脚本,以便它可用于身份验证,例如:

$ cat id_rsa | SSH_ASKPASS=./ps.sh ssh-add -

另一种方法是使用named pipe

$ mkfifo -m=600 ~/.fifo
$ cat id_rsa > ~/.fifo | SSH_ASKPASS=./ps.sh ssh-add ~/.fifo

您可以在SSH_ASKPASS中详细了解man ssh-add

  

如果ssh-add没有与之关联的终端,但设置了DISPLAYSSH_ASKPASS,则会执行SSH_ASKPASS指定的程序。

答案 1 :(得分:-1)

如果您使用expect来传递密码,则意味着您需要将密码存储在密钥宽度的某处 - 同一用户都可以读取。这根本不会增强安全性,因为能够访问密钥的攻击者可以同时访问密码。

只需使用没有密码的密钥。