質問: 複数のログインセッション間で同じ「ssh-agent」を共有する 特定のユーザー(つまり私)からのすべてのログインが同じssh-agentを使用することを保証する便利な方法はありますか?ほとんどの場合、これを機能させるためにスクリプトをハッキングしましたが、私が見逃していた方法がいくつかあるのではないかとずっと思っていました。さらに、その時以来、例えばこのウェブサイトのように、コンピューティング技術の驚くべき進歩がありました。ここでの目標は ssh経由か、gdm/kdm/etcから開始されたグラフィカルセッションか、コンソールからかに関わらず、ボックスにログインするたび: ユーザー名で現在ssh-agentが実行されていない場合は、1つが開始され、環境変数がエクスポートされ、ssh-addが呼び出されます。 それ以外の場合は、既存のエージェントの座標がログインセッションの環境変数にエクスポートされます。 この機能は、問題のボックスが3番目のボックスにsshingするときにリレーポイントとして使用される場合に特に役立ちます。この場合、sshを実行するたびに秘密鍵のパスフレーズを入力する必要がなく、たとえばgit pushなどを実行する必要がなくなります。以下のスクリプトはこれをほぼ確実に実行しますが、最近xがクラッシュし、別のグラフィカルセッションを開始したときに失敗しました。その場合、他の厄介なことが起こった可能性があります。これが私の悪いスクリプトです。私はこれを.bashrcから入手しています。# ssh-agent-procure.bash # v0.6.4 # ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent. # copyright me, now; licensed under the dwtfywt license. mkdir -p "$home/etc/ssh"; function ssh-procure-launch-agent { eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`; ssh-add; } if [ ! $ssh_agent_pid ]; then if [ -e ~/etc/ssh/ssh-agent-socket ] ; then ssh_agent_pid=`ps -fc ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\s+\s+(\s+).*$/\1/'`; if [[ $ssh_agent_pid =~ [0-9]+ ]]; then # in this case the agent has already been launched and we are just attaching to it. ##++ it should check that this pid is actually active & belongs to an ssh instance export ssh_agent_pid; ssh_auth_sock=~/etc/ssh/ssh-agent-socket; export ssh_auth_sock; else # in this case there is no agent running, so the socket file is left over from a graceless agent termination. rm ~/etc/ssh/ssh-agent-socket; ssh-procure-launch-agent; fi; else ssh-procure-launch-agent; fi; fi; これを行うより良い方法があると教えてください。また、不整合や誤りをつまずかないでください(たとえば、varのものをetcに入れます)。私はこれを少し前に書いて、それ以来多くのことを学びました。
回答: ssh -a [user@]remotehostこれはあなたが探しているものかもしれません。 sshを実行するときに-aスイッチを使用して、ssh-agentを転送します。ここにユースケースがあります:私は、githubを指しているリモートでいくつかのgitリポジトリを持つリモートサーバーを持っています。スクリーンセッションでssh-agentを実行していない場合、「git pull origin master」を実行するには、キーのパスフレーズを入力する必要があります。ブー!さらに、リモートサーバーにprivateキーをインストールする必要があります-さらにboooo!代わりに、単にssh -a [user@]remotehostローカルで実行しているssh-agentを渡します。これで、リモートホスト上に存在するための秘密鍵は不要になりました。 ssh-agentでスクリプトを実行する必要はまったくないと思います。