シェルセッションにSSHキー(パスワードを含む)を個別に追加しないでください。

シェルセッションにSSHキー(パスワードを含む)を個別に追加しないでください。

.<name of shell>rc注:この特定のSSHキーにはパスワードがあり、パスワードを入力し続ける必要がないため、ここに数行を追加しても問題は解決されません。

ssh-agentだから私はそれが後ろでどのように機能するのか本当に理解していません。私はいくつかのリモートリソースにアクセスするためにキーを追加する必要があるたびにとssh-agentを使用します。ssh-add ~/.ssh/id_rsaキーを一度追加したので、同じ「シェルセッション」に対して再度追加する必要はありません(「シェルセッション」はおそらく適切な用語ではありません)。

残念ながら、新しいシェルセッションを作成し続けています。私はOS Xのtmuxでzshを実行しており、創造的な名前のssh keyを持っていますid_rsa。 SSHキーにはこれに関連するパスワードがあります。

新しいシェルを起動するたびに、次のことを行う必要があります。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
<type password>

これは本当に迷惑なことです。

ssh-agent環境変数の出力がSSH_AGENT_PID毎回異なることがわかりました。私の直感は、この環境変数がSSH_AUTH_SOCK単一のシェルセッション内でキーを再追加する必要がない理由です。プログラムを呼び出すと、sshこれらの環境変数を使用して通信し、ssh-agent認証が成功します。

ssh-agentセッション間でsを共有する方法があるかどうか疑問に思います。おそらく正しい方法は、SSHキーを追加してtmux起動する前に環境変数を保存するtmuxように設定することです。本当によくわかりません。この問題を解決する標準的な方法は何ですか?SSH_AUTH_SOCKSSH_AGENT_PID

答え1

ssh-agentがどのように機能するかは、セッションごとに1つのエージェントがあることです。エージェントはセッションを開始して終了します。

セッションは、端末を開いたりシェルを起動したりするのではなく、ログインしたときに開始されます。ssh-agentこれをシェル起動スクリプトの一部として体系的に実行するのは間違いなくエラーです。

私はOSXユーザーではないため、何かが欠けている可能性がありますが、私が理解したのは、古代のOSXバージョン(10.5ベース)では、SSHがOSXキーチェーンと統合されていることです。したがって、ssh-agentまったく走ってはいけません。このSSH_AUTH_SOCK変数はlaunchdソケットを指す必要があります(launchdはsshプロキシサービスを提供します)。バラよりSSHキーでMac OS Xキーチェーンを使用するには?そしてsshがSnow Leopardのssh-agentに自分のキーを追加しないようにするにはどうすればよいですか?

何らかの理由でこれに固執し、ssh-agentすべてのセッションに1つのプロキシを使用したい場合(これは合理的)、SSHソケットに固定パスを使用できます。 (私はWindowsでこれを行いました。)あなたのパスで固定パスを.profile設定し、まだ実行されていない場合は始めます。SSH_AUTH_SOCKssh-agent

export SSH_AUTH_SOCK=~/.ssh/auth_sock
if ! fuser "$SSH_AUTH_SOCK" >/dev/null 2>/dev/null; then
  # Nothing has the socket open, it means the agent isn't running
  ssh-agent -a "$SSH_AUTH_SOCK" -s >~/.ssh/agent-info
fi

私のコードはプロキシを終了しようとしません。ログアウト時にエージェントを終了するには、ログアウトスクリプトにkillディレクティブを追加します。もちろん、ユーザーとして実行されているすべてのプロセスを終了すると、エージェントも含まれます。

答え2

以下は、必要なものを処理するログインスクリプトの小さな部分です。

SSHAF=$HOME/.ssh_agent_env
[ -f $SSHAF ] && . $SSHAF

# if ssh-agent not really running?
if [ -n "$SSH_AGENT_PID" ] && ! kill -0 $SSH_AGENT_PID >/dev/null
then ssh-agent >$SSHAF 
     . $SSHAF
     ssh-add # add list of more keys here if needed
fi

説明:$ HOME(.ssh_agent_env)のドットファイルにssh-agentの設定変数を保存し、そのファイルが存在する場合(行2)、そのファイルをインポートし(おそらく)実行中のssh-agentプロセスIDを取得します。来ます。 。 (SSH_AGENT_PID変数) SSH_AGENT_PID変数が設定されている場合は、kill -0を使用してエージェントがそのPIDで実行されていることを確認します。 (プロセスが実行されている場合、kill -0は戻りコードを0(true)、1(false)に設定します)インポートしてシェルセッションに値を追加し、ssh-addを実行してキーをキャッシュします。

初めてシステムに入ると、そのファイルが存在せず、エージェントが起動します。このファイルが存在する場合は、いつでもエージェントが実行されていることを確認してください。そうでなければ始めましょう。

注:これは上記の最初の答えのうちソリューション2を実行している実装です。

答え3

デフォルトでは、この機能はssh-agentバックグラウンドで独自に起動し、sshクライアントユーティリティがプロキシ(主にソケットパスSSH_AUTH_SOCK)に到達する方法を知るために使用する複数の環境変数を印刷します。エージェントを再起動すると複数のコピーが実行されていますがps uax | grep agent、通常はシェルssh-addから1つしかアクセスできません。を読むように要求します。これにより、ssh同じインスタンスに接続されているssh-agentすべてのクライアントが保存されたキーを利用できます。


1つだけを実行するにはいくつかのオプションがありますssh-agent

1) セッションをssh-agent開始するtmux前に(またはscreenその問題について)開始します。この時点で設定された環境変数は、tmuxまたはで実行されているすべてのシェルに継承する必要がありますscreen。 (tmux環境変数をクリーンアップしたくない場合は、特別な設定が必要かどうかわかりません。)

私は(不適切に)怠惰なので、各セッションを開始する前に手動でこれを実行しましたが、screenエージェントを起動してから起動/セッションを開始するスクリプトを作成するのは簡単です。screentmux

グラフィックスデスクトップ環境などを検討している場合は、DEが起動した場合(可能な場合)、エージェントを起動して起動するすべての端末で環境変数を使用できるようにする必要があります。

2)ログイン時にシステムがすでに起動している可能性がありますssh-agent。この場合、ssh-addエージェントの新しいコピーを開始せずにそのキーのみを入力できる必要があります。具体的sshには、OSのssh-add通常どおりに使用することもできます。

3)完全に別々のシェルで単一のエージェントを使用する場合(したがって環境変数を継承できない場合)、シェルの起動スクリプトでエージェントが実行されていることを確認し、それ以外の場合は起動します。プロキシのソケットアドレスをファイルに保存するか、ソケットへの固定パスを使用します。


とにかく問題は、環境変数を同じssh-agentssh-add

ただし、ssh-addキーを保持する期間を定義するために使用できるパラメータがあります。実行すると、ssh-add -t 3600 my-key-fileエージェントは1時間後にキーを忘れるように指示します。これにより、キーがメモリに暗号化されていないままになる時間を短縮するのに役立ちます。

答え4

理想的には、ssh-agent一度起動してssh-add一度だけ実行すると、後続のシェルはエージェントを継承します。

GUIを介してログインし、ウィンドウマネージャがまたはを.xsession使用している場合は、.xinitrcファイルに次のものを追加できます。

if [ -z "$SSH_AUTH_SOCK" ]; then
  eval $(ssh-agent)
  ssh-add
fi

xtermこれは、ウィンドウマネージャ(または他の端末エミュレータ)によって生成されたすべてのプロセスがこのエージェントを継承することを意味します。

X11なしで作業している場合は本当に素晴らしいことに喜んで、次の行をシェル初期化スクリプト.bash_profileに追加してください。.profile

現在のシェルの出力をeval取得して評価し、任意の値に設定します。これにより、手動で実行したものとほぼ同じように実行されます。このプロキシは、ログイン後すぐに開始できるセッションから継承されます(実際のログインシェルを設定していない場合)。ssh-agentSSH_AUTH_SOCKSSH_AGENT_PIDssh-addtmuxtmux

完璧な世界では、実行中のSSHエージェントのみがあり、ログアウトして再ログインするか、別のコンソールにログインするまでパスワードを再提供する必要はありません。

関連情報