単一のコマンドラインでsshを介してgpg-agentを使用すると問題が発生します。
これが私の設定です:
サーバーA:sshを介してコマンドをトリガーします。
ssh user@serverB "Sudo -E /path/to/script.sh"
サーバーB:パスフレーズ署名を必要とするスクリプトを実行しています。
システム情報:Ubuntu 12.04
サーバーBでgpg-agentをセットアップし、この構成を/home/user/.bashrcに追加しました。
Invoke GnuPG-Agent the first time we login.
# Does `~/.gpg-agent-info' exist and points to gpg-agent process accepting signals?
if test -f $HOME/.gpg-agent-info && \
kill -0 `cut -d: -f 2 $HOME/.gpg-agent-info` 2>/dev/null; then
GPG_AGENT_INFO=`cat $HOME/.gpg-agent-info | cut -c 16-`
else
# No, gpg-agent not available; start gpg-agent
eval `gpg-agent --daemon --write-env-file $HOME/.gpg-agent-info`
fi
export GPG_TTY=`tty`
export GPG_AGENT_INFO
/home/user/.gnupg/gpg-agent.conf内のエージェントの構成は次のとおりです。
enable-ssh-support
#1 year cache support
default-cache-ttl 31536000
default-cache-ttl-ssh 31536000
max-cache-ttl 31536000
max-cache-ttl-ssh 31536000
#debug-all
したがって、これを機能させるために、ssh経由でserverBに接続します。
ssh user@serverB
Gpg-agentが起動し、スクリプトを手動でトリガーします。
Sudo -E /path/to/script.sh
次に、gpg-agentはパスフレーズを要求するように要求します。パスフレーズを設定すると、スクリプトを再度実行でき、パスフレーズを要求せずにタスクを実行します。
私の問題は、私がそれを遠くにトリガーしようとすると、例えば経由:
ssh user@serverB "Sudo -E /path/to/script.sh"
スクリプトがパスフレーズを要求し続けるため、gpg-agentが機能していないようです。
編集:
Sudoパスワードなしでスクリプトを遠くからトリガーし、環境変数を保持するために、次のコンテンツを/etc/sudoers.d/userに追加しました。
user ALL=(ALL)NOPASSWD:SETENV:/path/to/script.sh
何か案は?
ssh user@serverB
を使用してログインし、スクリプトを手動で実行すると、最初にパスフレーズの入力を求められます。次に、スクリプトを実行すると、shh-agentが保存されているパスフレーズを提供します。
ただし、ssh user@serverB "Sudo -E /path/to/script.sh
を実行すると、毎回新しいログインが行われるため、ssh-agentが個別のSSHログインでのパスフレーズの保存をサポートすることはないと思います。
キーチェーンはあなたが必要とすることをしているようです: http://www.funtoo.org/Keychain
キーチェーンを使用すると、ローカルマシンを再起動するたびに1回だけパスフレーズを入力する必要があります。キーチェーンを使用すると、リモートcronジョブが長時間実行されるssh-agentプロセスに安全に「フックイン」できるようになり、スクリプトでキーベースのログインを利用できるようになります。
キーチェーンの現在のバージョンは、ssh-agentだけでなくgpg-agentもサポートしています。