Shell 使用Expect自动化ssh添加密码短语

Shell 使用Expect自动化ssh添加密码短语,shell,ubuntu,ssh,expect,Shell,Ubuntu,Ssh,Expect,在shell脚本中,我需要在运行ssh add时自动填充密码短语 我遇到expect并尝试了这个脚本,但没有成功: expect-c spawn-ssh-add;expect-re\.*密码短语。*\;发送\mypass\r\n\ 脚本不会抛出任何错误,但当它使用ssh时,它会请求密码,这意味着它无法工作 编辑:如果运行ssh add并手动添加密码短语,它将按预期工作。如果使用expect传递密码,则意味着您需要将密码存储在密钥的某个位置,这两个密码都可由同一用户读取。这根本不能增强安全性,因为

在shell脚本中,我需要在运行ssh add时自动填充密码短语

我遇到expect并尝试了这个脚本,但没有成功:

expect-c spawn-ssh-add;expect-re\.*密码短语。*\;发送\mypass\r\n\

脚本不会抛出任何错误,但当它使用ssh时,它会请求密码,这意味着它无法工作

编辑:如果运行ssh add并手动添加密码短语,它将按预期工作。

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


只需使用不带密码的密钥。

这里有一个更好的自动化方法

创建带有可执行标志的脚本,例如ps.sh,打印您的密码短语,例如:

#!/bin/sh
echo 'my_passphrase'
然后通过SSH_ASKPASS变量指定此脚本,以便用于身份验证,例如:

$ cat id_rsa | SSH_ASKPASS=./ps.sh ssh-add -
另一种方法是使用:

您可以在man SSH add中阅读更多关于SSH_ASKPASS的信息:

如果ssh add没有与其关联的终端,但设置了DISPLAY和ssh_ASKPASS,它将执行ssh_ASKPASS指定的程序


当我使用ssh时,它会要求我输入密码,这意味着它不起作用,您可能会在这里得出结论。ssh可能会提示输入密码的原因有很多,即使您已经向代理添加了密钥。事实上,这实际上是这个网站上的一个常见问题。相关:@Kenster我编辑了这个问题,可能不清楚。现在让我们一起跳。如果不是我将密码作为参数传递或随后删除该文件,则为True。如果您不知道答案,请不要回复。此解决方案打印:输入/dev/fd/63的密码短语:。您链接的:输入~/.fifo:的密码短语。我不明白:@fra-c纠正了这个例子。似乎需要使用管道来按照手册加载SSH_ASKPASS,以便不关联终端。注意,如果您在不带X的脚本或tty中,还需要设置DISPLAY=dummy
$ mkfifo -m=600 ~/.fifo
$ cat id_rsa > ~/.fifo | SSH_ASKPASS=./ps.sh ssh-add ~/.fifo