[tmux] 기존 tmux 세션에 연결할 때 SSH 에이전트 환경 변수를 자동 업데이트하는 방법

연결이 끊긴 tmux 세션을 다시 연결할 때 SSH 에이전트를 복원하는 좋은 방법을 찾으려고합니다.

원인은 SSH 에이전트 세션이 변경되었지만 tmux 세션의 환경 변수가 업데이트되지 않았기 때문인 것 같습니다.

세션 자체를 연결하기 전에 어떻게 자동화 할 수 있습니까? 내가 연결하는 세션에 항상 bash 프롬프트가있는 것은 아니기 때문에 그 안에 무언가를 입력 할 여유가 없습니다. tmux 세션을 생성하거나 연결하기 전에 실행해야합니다.

내가 실행중인 코드의 예는 https://gist.github.com/ssbarnea/8646491 에 있습니다. tmux를 사용하여 persistem ssh 연결을 만드는 작은 ssh 래퍼입니다. 이것은 꽤 잘 작동하지만 때때로 ssh 에이전트가 작동을 멈춰서 더 이상 다른 호스트에 연결하는 데 사용할 수 없습니다.



답변

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
    
  2. tmux에서 작동하도록 만들고 다음을 추가하십시오 ~/.tmux.conf.

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

X11 전달을 사용하려면 추가 작업이 필요합니다 . 요점을 참조하십시오 .


답변

기본적으로 변수를 tmux 업데이트 하는 동안 SSH다음을 수행 할 필요가 없습니다.

  • 소켓 경로 변경 / 추가
  • SSH_AUTH_SOCKET변수 변경

기능을 추가하기 위해 변경 한 Chris Down 의 솔루션이 마음에 듭니다.

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

~/.bashrc. fixssh세션 연결 후 또는 ssh/ scp/ 전에 호출하십시오 rsync.

에 대한 최신 버전의 tmux지원 -s옵션 show-env이므로

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

가능합니다.


답변

다음 SSH_AUTH_SOCKtmux창 내부에서 업데이트하는 데 사용하는 것입니다 (Hans Ginzel의 스크립트를 기반으로 함).

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

또는 다음 tmux이 없습니다 showenv -s.

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


답변

다음은 두 가지 방법을 모두 포함하고 tmux 세션에 다시 연결할 때 추가 입력이 필요하지 않은 솔루션입니다.

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


답변

여기에 좋은 답변이 많이 있습니다. 그러나 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)

길고 복잡 하니까 나눠 보겠습니다 …

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  )
  1. exportSSH_AUTH_SOCK의 출력에 대한 환경 변수 설정 $()명령 대체
  2. find 시작하는 파일 /tmp
  3. 결과를 다음으로 제한 /ssh-경로에있는
  4. 이름이 다음으로 시작하는 결과로만 결과를 제한합니다. agent
  5. 현재 사용자와 일치하는 사용자 ID를 가진 결과로만 결과를 제한합니다.
  6. 모든 (권한 등) 오류 침묵
  7. 여러 개가있는 경우 마지막 결과 만 가져옵니다.

결과가 1 개 뿐이고 stderr 쓰레기에 대해 신경 쓰지 않는다면 6과 7을 생략 할 수 있습니다.


답변

이전 답변의 변형을 사용합니다.

eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"

외부 환경에서 시작된 ssh 에이전트를 수행했다고 가정합니다. 같은 다른 환경 변수도 마찬가지 DISPLAY입니다.


답변

TMUX 등을 구성하지 않고 모든 것을 순수하게 ~/.ssh/ . 온 원격 시스템 :

창조하다 ~/.ssh/rc :

#!/bin/bash

# Fix SSH auth socket location so agent forwarding works within tmux
if test "$SSH_AUTH_SOCK" ; then
  ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

~/.ssh/config더 이상 의존하지 않도록 다음에 추가$SSH_AUTH_SOCK . 분리 된 터미널에서는 오래되었습니다.

Host *
  IdentityAgent ~/.ssh/ssh_auth_sock

알려진 제한

  • ssh-add사용하지 않는 ~/.ssh/config등 통신 할 수 없습니다 ssh-agent. SSH를 통해 액세스되는 git remotes를 업데이트하는 것과 마찬가지로 잘 작동 ssh-add -l하더라도 같은 명령은 오류를 생성합니다 ssh user@host.