如何从文件中生成ssh-add读密码?

时间:2012-10-23 15:19:34

标签: ssh ssh-agent

我正在尝试在ssh-agent中添加密钥,并希望ssh-add使用该文件读取密码。怎么可能?

如何从shell脚本自动执行此过程?

4 个答案:

答案 0 :(得分:27)

根据您的发行版和ssh-add的版本,您可以使用ssh-add的-p选项,以这种方式从stdin读取密码:

cat passfile | ssh-add -p keyfile

如果这不起作用,您可以使用Unix工具Expect使交互式应用程序成为非交互式应用程序。您必须从包管理器安装它。

我已经为你准备了一个工具。只需将内容复制到名为 ssh-add-pass 的文件中,并在其上设置可执行权限(chmod +x ssh-add-pass)。您也可以将其复制到/ usr / bin或/ usr / local / bin,以便从$ PATH搜索中访问。

#!/bin/bash

if [ $# -ne 2 ] ; then
  echo "Usage: ssh-add-pass keyfile passfile"
  exit 1
fi

eval $(ssh-agent)
pass=$(cat $2)

expect << EOF
  spawn ssh-add $1
  expect "Enter passphrase"
  send "$pass\r"
  expect eof
EOF

用法很简单:ssh-add-pass keyfile passfile

答案 1 :(得分:9)

以下是不支持-p的系统的一些解决方法:

$ PASS="my_passphrase"
$ install -vm700 <(echo "echo $PASS") "$PWD/ps.sh"
$ cat id_rsa | SSH_ASKPASS="$PWD/ps.sh" ssh-add - && rm -v "$PWD/ps.sh"

其中ps.sh基本上是您打印密码的脚本。请参阅:man ssh-add

为了使其更安全(不要将其保存在同一个文件中),请使用mktemp生成随机私有文件,使其可执行(chmod)并确保将密码打印到标准输出一旦执行。

答案 2 :(得分:3)

与kenorb的答案类似,但没有将秘密保存在文件中:

$ SSH_ASKPASS=/path/to/ssh_give_pass.sh ssh-add $KEYFILE <<< "$KEYPASS"

其中ssh_give_pass.sh是:

#!/bin/bash
# Parameter $1 passed to the script is the prompt text
# READ Secret from STDIN and echo it
read SECRET
echo $SECRET

如果您在$ KEYPASSFILE中具有秘密,请先使用

将其读入变量中
KEYPASS=`cat $KEYPASSFILE`

还要确保ssh_give_pass.sh不能被未经授权的用户编辑-记录通过脚本传递的所有机密将很容易。

答案 3 :(得分:1)

在我的 Ubuntu 系统上,没有一个答案有效:

  • ssh-add 不支持 -p 选项。
  • ssh-add 忽略了 SSH_ASKPASS,坚持在控制终端上提示输入密码。
  • 我想避免安装额外的软件包,尤其是 expect

对我有用的是:

password_source | SSH_ASKPASS=/bin/cat setsid -w ssh-add keyfile

password_source 并不是真正的程序:它只是代表将密码短语提供给 ssh-add 的任何内容。就我而言,它是一个执行 setsid 并将密码写入其标准输入的程序。如果您将密码保存在文件中,您有责任进行简单的修改:我不会让您伤害自己。

setsid 已安装,并分离控制终端,以便 ssh-add 不会尝试使用它来提示输入密码。 -w 导致 setsid 等待 ssh-add 退出并使其返回代码可用。 /bin/cat 与 Ray Shannon 提供的脚本具有相同的效果,但使用标准工具,而不是通过脚本复制其功能。