42

我正在尝试添加一个密钥ssh-agent并想ssh-add从我正在使用的密钥文件中读取密码。这怎么可能?

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

4

4 回答 4

42

根据您的发行版和 ssh-add 的版本,您可能能够或不使用-p以这种方式从标准输入读取密码的 ssh-add 选项:

cat passfile | ssh-add -p keyfile

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

我已经为您编写了一个工具。只需将内容复制到名为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

于 2012-10-23T15:45:29.010 回答
13

类似于 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 不能被未经授权的用户编辑 - 很容易记录通过脚本传递的所有秘密。

于 2018-10-05T18:21:17.333 回答
10

以下是不支持系统的一些解决方法-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)并确保它在执行后将密码短语打印到标准输出。

于 2015-10-11T18:03:08.317 回答
5

在我的 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 提供的脚本具有相同的效果,但使用标准工具而不是使用脚本复制其功能。

于 2020-12-21T22:27:31.143 回答