나는 주로 Mac에서 작업하고 Linux 시스템에 ssh / tmux 첨부 작업을 수행합니다. 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
새로운 tmux 창이 $SSH_AUTH_SOCK
올바르게 설정되었습니다. 나는 이것을하지 않을 것을 선호합니다. 어떤 아이디어?
최신 정보
나는 이것을 잘 설명하고 있지 않다고 생각합니다. 원격 시스템에서 쉘을 여는 쉘 기능은 다음과 같습니다.
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
TMUX이 SSH 명령을 실행하면 $SSH_AUTH_SOCK
됩니다 하지 그것이 비록 설정 되어 내 로컬 환경에서 설정합니다. setenv
위 의 명령 으로 tmux 환경에 이것을 넣으면 모든 것이 잘 작동합니다. 내 질문은 왜 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
가 다시 연결하면 설정되지 않은 상태로 돌아갑니다.
답변
바운티를받은 후, 완전성을 위해 주요 의견을 다시 게시하고 동일한 문제가있는 방문자를 잘못된 길로 안내하지 않도록합니다.
Tmux는 환경 변수를 제거합니다
Tmux의 매뉴얼 페이지에 update-environment는 “-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
여기서 중요한 것은 SSH_AUTH_SOCK이며 현재 / tmp의 일부 파일로 설정되어 있습니다. 이 파일을 살펴보면 해당 파일이 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는 이미 기본적으로 적용됩니다.
신용
내 답변은 Mark ‘xb95’Smith 가이 블로그 게시물 에서 발췌 한 내용으로 screen 과 동일한 문제를 설명합니다 .
답변
나는 이것을 알아 냈습니다. 짧은 대답,에서 제거해야 SSH_AUTH_SOCK
했습니다 update-environment
. 그것은 그 목록에 있었기 때문에, 내가 다시 붙일 때마다 그 가치가 날아가고있었습니다. 단서를위한 @djf에게 감사합니다. update-environment
섹션 의 tmux (1) 매뉴얼 페이지의 현저한 비트 :
소스 환경에 존재하지 않는 모든 변수는 세션 환경에서 제거되도록 설정됩니다 (-r이 set-environment 명령에 제공된 것처럼).
답변
sux 에이전트를 처리하기 위해 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에 이것을 가지고 있으며 훌륭하게 작동합니다.
답변
StackOverflow https://stackoverflow.com/a/49395839/241025 에서 비슷한 질문에 답변했습니다 . 이 페이지가 내 Google 검색에서 처음 표시되었으므로 여기에 요약 버전을 게시하고 싶었습니다.
각 tmux 세션에 사용자 정의 환경 변수 세트를 갖도록하려면 값을 tmux의 세션 별 환경 변수에 추가해야합니다. 방법은 다음과 같습니다.
tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'
현재 창에서 환경 변수를 선택하려면 FOO를 명시 적으로 내보내는 마지막 단계가 필요합니다. 이 tmux 세션에 대해 생성 한 모든 후속 창 또는 창은 FOO를 상속하지만 다른 세션에는 표시되지 않습니다.
답변
djf의 설명은 내 마음에 또 다른 가능한 해결책을 제공합니다.
tmux
/ screen
실행 하기 전에 :
- 로그인.
- 의 인스턴스를 시작하십시오
ssh-agent
. - 시작
tmux
/screen
이에 대한 환경 변수 (들)ssh-agent
.
클라이언트에 SSH 전달을 사용할 수 없지만 요청하지 않았습니다.