저는 주로 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를 사용하여 클라이언트에 전달할 수 없지만 그렇게 해야 한다는 요구 사항은 없습니다.