如何在附加到现有tmux会话时自动更新SSH代理环境变量

sor*_*rin 67 ssh-agent tmux

当我重新连接断开连接的tmux会话时,我试图找到一种恢复SSH代理的好方法.

原因似乎是SSH代理会话发生了变化,但tmux会话中的环境变量未更新.

在附加会话本身之前,如何自动执行此操作?因为我附加的会话并不总是有bash提示符,所以我无法在其中键入内容.它必须是在创建或附加tmux会话之前运行的东西.

我正在运行的代码示例位于https://gist.github.com/ssbarnea/8646491 - 一个使用tmux创建persistem ssh连接的小ssh包装器.这很有效,但有时ssh代理停止工作,所以我不再能够使用它连接到其他主机.

pym*_*kin 75

Martijn Vermaat 有一个很好的要点,它可以深入解决您的问题,虽然它是针对屏幕用户的,所以我在这里调整它的tmux.

总结一下:

  1. ~/.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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 让它在tmux中工作,将其添加到您的~/.tmux.conf:

    # fix ssh agent when tmux is detached
    setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
    
    Run Code Online (Sandbox Code Playgroud)

如果要启用X11转发,则需要额外的工作,请参阅要点.

  • 我必须在.tmux中添加一个`set -g update-environment -r`才能使这个过程正常工作.我还为套接字链接创建添加了一些命名空间:https://gist.github.com/bcomnes/e756624dc1d126ba2eb6 (6认同)
  • @Bret如果从t​​mux会话中分离,然后关闭SSH连接,则您的解决方案可以正常工作.但是,如果您强行关闭ssh连接,仍然连接到tmux会话(例如,当您突然松开网络连接并使用[Shift~] [Enter]关闭SSH连接时,它不起作用.任何想法可以解决这个问题? (2认同)
  • 不,我放弃了对不起。 (2认同)

Han*_*zel 33

虽然默认情况下tmux 更新 SSH变量,但没有必要

  • 更改/添加套接字路径
  • 改变SSH_AUTH_SOCKET变量

我喜欢Chris Down的解决方案,我改为添加功能

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

进入~/.bashrc.呼叫fixssh连接会话之后或之前ssh/ scp/ rsync.

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

eval $(tmux show-env -s |grep '^SSH_')
Run Code Online (Sandbox Code Playgroud)

是可能的.


use*_*062 20

这是我用于SSH_AUTH_SOCKtmux窗口内更新的内容(基于Hans Ginzel的脚本):

alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'
Run Code Online (Sandbox Code Playgroud)

或者为此tmux没有showenv -s:

alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)'
Run Code Online (Sandbox Code Playgroud)


Max*_*Max 6

这是我的解决方案,其中包括两种方法,当我重新连接到tmux会话时不需要额外的输入

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


Bru*_*sky 6

这里有很多很好的答案。但也有tmux show-environment看不到的情况SSH_AUTH_SOCK。在这种情况下,您可以使用find来明确定位它。

export SSH_AUTH_SOCK=$(find /tmp -path '*/ssh-*' -name 'agent*' -uid $(id -u) 2>/dev/null | tail -n1)
Run Code Online (Sandbox Code Playgroud)

这又长又复杂,所以我会分解它......

01  export SSH_AUTH_SOCK=$(
02    find /tmp \
03      -path '*/ssh-*'
04      -name 'agent*'
05      -uid $(id -u)
06      2>/dev/null
07    | tail -n1
08  )
Run Code Online (Sandbox Code Playgroud)
  1. exportSSH_AUTH_SOCK设置为$()命令替换输出的环境变量
  2. find 文件开始于 /tmp
  3. 将结果限制为仅包含/ssh-在路径中的结果
  4. 将结果仅限于名称以 agent
  5. 将结果限制为仅具有与当前用户匹配的用户 ID 的结果
  6. 消除所有(权限等)错误
  7. 如果有多个,则只取最后一个结果

如果您知道只有 1 个结果并且您不关心 stderr 垃圾,那么您可以省略 6 和 7。

  • 在这里列出的所有解决方案中,只有这个在 mac 上有效。 (2认同)