私は主に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
$SSH_AUTH_SOCK
新しいtmuxウィンドウを正しく設定するには、次の手順を実行します。むしろこのようなことをする必要はありません。どんなアイデアがありますか?
修正する
私はこの部分をよく説明していないようです。これはリモートシステムでシェルを開くシェル関数です。
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
tmuxがこのsshコマンドを実行すると、$SSH_AUTH_SOCK
次のようになります。いいえ設定してもはい私のローカル環境で設定します。上記のコマンドを使用してtmux環境に配置すると、setenv
すべてがうまく機能します。私の質問はなぜ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
設定解除状態に戻ります。
答え1
賞金をいただきましたので、完全性のために批判的レビューを再度投稿いたします。同じ問題を抱えている訪問者が間違ったパスに置かないようにするには:
Tmuxは環境変数を削除します
Tmuxのマニュアルページには、アップデート環境が変数を削除することが示されています。"[...] は、-r が set-environment コマンドで指定されたようにソース環境には存在しません。"
明らかにそれが問題の原因です。バラよりChrisの答えは次のとおりです。。しかし、変数が「ソース環境」には存在しませんが、新しく作成されたtmuxウィンドウではどのように有効であるかはまだ想像できません。
前の答え:
SSH配信の仕組み
リモートコンピュータで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に「環境更新コマンド」を追加する必要さえないと思います。 ~によるとマニュアルページ、SSH_AUTH_SOCK がデフォルトで適用されました。
クレジット取引
答え2
私はこれを理解しています。簡単に答えると、SSH_AUTH_SOCK
から削除する必要がありますupdate-environment
。そのリストにあるため、再接続するたびにその値が消去されます。ヒントをくれた@djfに感謝します。 tmux(1) マニュアルページの重要なセクションupdate-environment
:
ソース環境に存在しないすべての変数は、セッション環境から削除されるように設定されます(set-environmentコマンドに-rが指定されているかのように)。
答え3
SSHエージェントを処理するためにtmuxを使用する代わりに、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、非常にうまく動作します。
答え4
djfの説明は別の可能な解決策を提示しました。
操作前tmux
/screen
操作中:
- ログイン。
- インスタンスを起動します
ssh-agent
。 tmux
screen
これの環境変数は/で始まりますssh-agent
。
これはSSHを使用してクライアントに渡すことはできませんが、そうする必要はありません。