私は主にMacで作業し、ssh/tmuxをLinuxマシンに接続して作業を行います。 Linuxマシンでssh-agentを実行しています。私は
set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
私の.tmux.conf
で 。それでも、このセッションに再度接続するときはいつでも、実行する必要があります
tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
新しいtmuxウィンドウに$SSH_AUTH_SOCK
を設定するため 正しく設定してください。私はこれをする必要がないことを望みます。何かアイデアはありますか?
更新
私はこれをうまく説明していないと思います。リモートマシンでシェルを開くためのシェル関数は次のとおりです。
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
tmuxがこのsshコマンドを実行すると、$SSH_AUTH_SOCK
ない はですが、設定します 私のローカル環境に設定します。これをsetenv
を使用してtmuxの環境に配置すると 上記のコマンドでは、すべてが正常に機能します。私の質問は、なぜsetenvコマンドを実行する必要があるのですか?
アップデート2
詳細情報:
既存のセッションに接続すると、$SSH_AUTH_SOCK
tmux環境(またはグローバル環境)では設定されていません。
% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
手動で設定すると、うまくいきます:
% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
切り離して再接続すると、$SSH_AUTH_SOCK
設定されていない状態に戻ります。
承認された回答:
バウンティを受け取ったので、完全を期すために、また同じ問題を抱えている訪問者を間違った方向に向かわせないように、キーコメントを再投稿します。
Tmuxは環境変数を削除します
Tmuxのマニュアルページには、update-environmentが「set-environmentコマンドに-rが指定されたかのように[…]ソース環境に存在しない変数を削除する」と記載されています。
どうやらそれが問題の原因でした。以下のクリスの回答をご覧ください。ただし、変数が「ソース環境」に存在せず、新しく作成されたtmuxウィンドウで有効である方法をまだ想像できません…
前の回答:
SSH転送の仕組み
リモートマシンで、SSH接続を確立した後、シェルの環境を確認します。
[email protected]:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342
ここで重要なのはSSH_AUTH_SOCKで、これは現在/tmp内のファイルに設定されています。このファイルを調べると、それがUnixドメインソケットであり、接続したsshの特定のインスタンスに接続されていることがわかります。重要なのは、これは接続するたびに変わることです。
ログアウトするとすぐに、その特定のソケットファイルはなくなります。ここで、tmuxセッションにアクセスして再接続すると、問題が発生します。 tmuxが最初にリリースされたときからの環境があります—それは数週間前だったかもしれません。その特定のソケットは死んでから長いです。
関連:複数行の文字列の最後の行に指定されたパターンが含まれているかどうかのシェルテスト?解決策
問題は現在稼働中のSSH認証ソケットがどこにあるかを知ることに関係していることがわかっているので、予測可能な場所に配置しましょう!
リモートマシンの.bashrcまたは.zshrcファイルに、次を追加します。
# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
rm -f /tmp/ssh-agent-$USER-screen
ln -sf $SSH_AUTH_SOCK $SOCK
export SSH_AUTH_SOCK=$SOCK
fi
tmux.confに「update-environmentコマンド」を入れる必要すらないと思います。マニュアルページによると、SSH_AUTH_SOCKはすでにデフォルトでカバーされています。
クレジット
私の回答は、画面の同じ問題を説明しているMark‘xb95’Smithによるこのブログ投稿の抜粋です。