.<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_SOCK
SSH_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_SOCK
ssh-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
エージェントを起動してから起動/セッションを開始するスクリプトを作成するのは簡単です。screen
tmux
グラフィックスデスクトップ環境などを検討している場合は、DEが起動した場合(可能な場合)、エージェントを起動して起動するすべての端末で環境変数を使用できるようにする必要があります。
2)ログイン時にシステムがすでに起動している可能性がありますssh-agent
。この場合、ssh-add
エージェントの新しいコピーを開始せずにそのキーのみを入力できる必要があります。具体的ssh
には、OSのssh-add
通常どおりに使用することもできます。
3)完全に別々のシェルで単一のエージェントを使用する場合(したがって環境変数を継承できない場合)、シェルの起動スクリプトでエージェントが実行されていることを確認し、それ以外の場合は起動します。プロキシのソケットアドレスをファイルに保存するか、ソケットへの固定パスを使用します。
とにかく問題は、環境変数を同じssh-agent
。ssh-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-agent
SSH_AUTH_SOCK
SSH_AGENT_PID
ssh-add
tmux
tmux
完璧な世界では、実行中のSSHエージェントのみがあり、ログアウトして再ログインするか、別のコンソールにログインするまでパスワードを再提供する必要はありません。