私は主にMacで作業し、Linuxマシンにssh/tmuxを接続して作業を行います。 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
is not set、it it is set of my local environment。これを上記のsetenv
コマンドを使用してtmuxの環境に配置すると、すべて正常に動作します。私の質問は、なぜsetenvコマンドを実行する必要があるのですか?
詳しくは:
既存のセッションにアタッチすると、$SSH_AUTH_SOCK
は、tmux環境(またはグローバル環境)では設定されません。
% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
手動で設定すると、次のように機能します。
% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
デタッチして再アタッチすると、$SSH_AUTH_SOCK
は未設定に戻ります。
私はこれを理解しました。簡単に言えば、SSH_AUTH_SOCK
からupdate-environment
を削除する必要がありました。そのリストにあったので、再装着する度にその価値は吹き飛ばされていました。手がかりを与えてくれた@djfに感謝します。 update-environment
セクションのtmux(1)マニュアルページからの重要なビット:
ソース環境に存在しない変数は、セッション環境から削除されるように設定されます(-rがset-environmentコマンドに指定された場合と同様)。
バウンティを受け取ったので、完全を期すためにキーコメントを再投稿します-間違ったトラックに同じ問題を持つ訪問者を設定することを避けるために:
Tmuxのマニュアルページには、update-environmentによって変数が削除されると記載されています"ソース環境に存在しない変数[...] -rがset-environmentコマンドに指定されたかのように" "
どうやらこれが問題の原因です。 以下のクリスの応答 を参照してください。ただし、変数が「ソース環境」に存在せず、新しく作成されたtmuxウィンドウで有効であることを想像することはできません...
以前の回答:
リモートマシンで、SSH接続を確立した後、シェルの環境を確認します。
user@remote:~$ 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
ここで重要なのは、現在/ tmp内のファイルに設定されているSSH_AUTH_SOCKです。このファイルを調べると、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コマンド」を追加する必要さえないと思います。 man page によると、SSH_AUTH_SOCKはデフォルトですでにカバーされています。
私の応答は このブログ投稿 の抜粋です screen について同じ問題を説明するMark 'xb95' Smithによる。
Tmuxを使用してssh-agentを処理する代わりに、bashで次のように処理します。
### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add;
}
## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
### End SSH Agent ### }}}
私はこれを〜/ bashrc に入れています。
StackOverflowで同様の質問に回答しました https://stackoverflow.com/a/49395839/241025 。このページはGoogle検索で最初に表示されたので、ここに要約バージョンを投稿したいと思いました。
各tmuxセッションに一連のカスタム環境変数を持たせるには、tmuxのセッションごとの環境変数に値を追加する必要があります。これを行う方法の例を次に示します。
tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'
現在のペインが環境変数を取得できるように、FOOを明示的にエクスポートする最後の手順が必要です。このtmuxセッション用に作成する後続のペインまたはウィンドウはFOOを継承しますが、他のセッションでは表示されません。
dJFの説明は私の心に別の可能な解決策をもたらします:
tmux
/screen
が実行される前:
ssh-agent
のインスタンスを起動します。ssh-agent
の環境変数を使用して、tmux
/screen
を開始します。これはクライアントへのSSH転送を使用できませんでしたが、要求されませんでした。