【问题标题】:Automate ssh-add passphrase using Expect [duplicate]使用 Expect 自动化 ssh-add 密码 [重复]
【发布时间】:2016-01-08 10:31:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “当我 ssh 时它要求我输入密码(这意味着它不起作用)”你可能会在这里得出结论。即使在您向代理添加了密钥后,ssh 仍可能提示输入密码的原因有很多。事实上,这实际上是本网站上的常见问题解答。
  • @Kenster 我编辑了这个问题,也许不清楚。现在让我们一起跳吧。

标签: shell ubuntu ssh expect


【解决方案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

您可以在man ssh-add 中阅读有关SSH_ASKPASS 的更多信息:

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

【讨论】:

  • 此解决方案打印:Enter passphrase for /dev/fd/63:。您链接的那个:Enter passphrase for ~/.fifo:。我不明白:(
  • @fra-c 更正了示例。似乎需要使用管道按照手册加载SSH_ASKPASS(为了不关联终端)。
  • 请注意,如果您在没有 X 的脚本或 tty 中,还需要设置 DISPLAY=dummy
【解决方案2】:

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

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

【讨论】:

  • 是的,除非我将密码作为参数传递或之后删除文件。不知道答案的请不要回复。
猜你喜欢
  • 2021-01-24
  • 2017-01-30
  • 1970-01-01
  • 2012-11-12
  • 2018-02-20
  • 2015-08-27
  • 2017-07-05
  • 2012-12-19
相关资源
最近更新 更多