web-dev-qa-db-ja.com

ssh-addにファイルからパスフレーズを読み取らせる方法は?

ssh-agentにキーを追加しようとしています。ssh-addを使用してファイルからパスワードを読み取ってください。どのように可能ですか?

シェルスクリプトからこのプロセスを自動化するにはどうすればよいですか?

26
Satish

ディストリビューションとssh-addのバージョンによっては、次のようにstdinからパスフレーズを読み取るssh-addの-pオプションを使用できる場合と使用できない場合があります。

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

32
enrico.bacis

-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)、パスフレーズが標準に出力されるようにします。一度実行すると出力されます。

9
kenorb

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を編集できないようにしてください。スクリプトで渡されたすべてのシークレットを簡単にログに記録できます。

6
Ray Shannon