연결이 끊긴 tmux 세션을 다시 연결할 때 SSH 에이전트를 복원하는 좋은 방법을 찾으려고합니다.
원인은 SSH 에이전트 세션이 변경되었지만 tmux 세션의 환경 변수가 업데이트되지 않았기 때문인 것 같습니다.
세션 자체를 연결하기 전에 어떻게 자동화 할 수 있습니까? 내가 연결하는 세션에 항상 bash 프롬프트가있는 것은 아니기 때문에 그 안에 무언가를 입력 할 여유가 없습니다. tmux 세션을 생성하거나 연결하기 전에 실행해야합니다.
내가 실행중인 코드의 예는 https://gist.github.com/ssbarnea/8646491 에 있습니다. tmux를 사용하여 persistem ssh 연결을 만드는 작은 ssh 래퍼입니다. 이것은 꽤 잘 작동하지만 때때로 ssh 에이전트가 작동을 멈춰서 더 이상 다른 호스트에 연결하는 데 사용할 수 없습니다.
답변
Martijn Vermaat
의 훌륭한 요점 은 화면 사용자를위한 것이지만 문제를 깊이있게 해결하는 것이므로 여기에서 tmux에 맞게 조정합니다.
요약:
-
~/.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
-
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_SOCK
은 tmux
창 내부에서 업데이트하는 데 사용하는 것입니다 (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 )
export
SSH_AUTH_SOCK
의 출력에 대한 환경 변수 설정$()
명령 대체find
시작하는 파일/tmp
- 결과를 다음으로 제한
/ssh-
경로에있는 - 이름이 다음으로 시작하는 결과로만 결과를 제한합니다.
agent
- 현재 사용자와 일치하는 사용자 ID를 가진 결과로만 결과를 제한합니다.
- 모든 (권한 등) 오류 침묵
- 여러 개가있는 경우 마지막 결과 만 가져옵니다.
결과가 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
.