다시 연결할 때 tmux에서 env var를 다시 설정해야하는 이유는 무엇입니까? 원격 시스템에서 쉘을 여는 쉘

나는 주로 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_SOCKtmux 환경 (또는 글로벌 환경)에서 설정되지 않습니다.

% 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실행 하기 전에 :

  1. 로그인.
  2. 의 인스턴스를 시작하십시오 ssh-agent.
  3. 시작 tmux/ screen이에 대한 환경 변수 (들) ssh-agent.

클라이언트에 SSH 전달을 사용할 수 없지만 요청하지 않았습니다.


답변