如何在连接到现有的tmux会话时自动更新SSH代理环境variables

我试图find一个很好的方式来恢复SSH代理,当我重新连接断开tmux会话。

原因似乎是SSH代理会话更改,但tmux会话中的环境variables未更新。

如何在附加会话之前自动执行此操作? 因为我附加的会话并不总是有bash提示符,所以我不能在其中input内容。 在创build或附加tmux会话之前,它必须先运行。

我正在运行的代码示例是https://gist.github.com/ssbarnea/8646491 – 一个使用tmux创buildpersistem ssh连接的小型ssh包装器。 这工作得很好,但有时ssh代理停止工作,所以我不能再使用它连接到其他主机。

Martijn Vermaat提供了一个很好的要点 ,尽pipe它是针对屏幕用户的,但是我们正在调整它在tmux中的地位。

总结:

  1. 如果它还不存在,创build~/.ssh/rc ,并添加以下内容:

     #!/bin/bash # Fix SSH auth socket location so agent forwarding works with tmux if test "$SSH_AUTH_SOCK" ; then ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock fi 
  2. 让它在tmux中工作,把它添加到你的~/.tmux.conf

     # fix ssh agent when tmux is detached setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock 

需要额外的工作,如果你想启用X11转发,请参阅要点 。

tmux默认更新 SSHvariables时,不需要

  • 更改/添加套接字path
  • 更改SSH_AUTH_SOCKETvariables

我喜欢Chris Down的解决scheme,我改变了添加function

 fixssh() { eval $(tmux show-env \ |sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p') } 

进入~/.bashrc 。 在连接会话之后或在ssh / scp / rsync之前调用fixssh

show-env更新版本的tmux支持-s选项,仅限show-env

 eval $(tmux show-env -s |grep '^SSH_') 

是可能的。

以下是我用于更新tmux窗口中的SSH_AUTH_SOCK内容(基于Hans Ginzel的脚本):

 alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)' 

或者对于没有showenv -s tmux

 alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)' 

这是我的解决scheme,包括两种方法,并且当我重新连接到tmux会话时不需要额外的input

 alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'