다시 연결할 때 tmux에서 env var를 다시 설정해야하는 이유는 무엇입니까?


37

나는 주로 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가 다시 연결하면 설정되지 않은 상태로 돌아갑니다.


이것은 전혀 SSH에 관한 것이 아닙니다. 새로운 쉘에 어떤 환경 변수가 env있습니까?
Hauke ​​Laging

Mac에서 어떤 쉘을 사용하고 있습니까? 세게 때리다?
slm

@HaukeLaging 그것은 tmux에 관한 것입니다.
Chris W.

@ slm zsh를 사용하고 있습니다.
Chris W.

기존 창은 어떻습니까? 그들은 여전히 ​​작동합니까?
Hauke ​​Laging

답변:


34

바운티를받은 후, 완전성을 위해 주요 의견을 다시 게시하고 동일한 문제가있는 방문자를 잘못된 길로 안내하지 않도록합니다.

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새 쉘에서 내 설정에 관한 것이 아니라 $SSH_AUTH_SOCK.bashrc / .zshrc가 소스되기 전에 새로운 tmux 창에서 설정 하는 것에 관한 것 입니다.
Chris W.

@ChrisW. 스크립트가 원격 시스템의 로그인 쉘의 rc 파일에 있어야한다고 가정했습니다. 로그인하면 새 셸이 생성되고 SSH_AUTH_SOCK가 변경되어 내보내집니다 . 그런 다음 tmux를 시작하면 상위 환경에서 SSH_AUTH_SOCK를 상속합니다. SSH_AUTH_SOCK의 값이 이제 고정되었으므로 tmux는 후속 로그인 작업을 계속해야합니다. 아마도 문제를 잘못 이해할 수 있습니다.
djf

내 혼란은 ssh가 새 창 (예 :)에서 tmux에 의해 실행되는 환경에 관한 것입니다 tmux neww ssh somehost.
Chris W.

이 접근 방식의 한 가지 문제점은 시스템에 대한 두 번째 SSH 연결이의 값을 겹쳐 쓰는 것입니다 SSH_AUTH_SOCK. 이 방법은 tmux 세션이 최신 SSH 연결을 통해 열려있는 동안에 만 작동합니다.
phylae

12

나는 이것을 알아 냈습니다. 짧은 대답,에서 제거해야 SSH_AUTH_SOCK했습니다 update-environment. 그것은 그 목록에 있었기 때문에, 내가 다시 붙일 때마다 그 가치가 날아가고있었습니다. 단서를위한 @djf에게 감사합니다. update-environment섹션 의 tmux (1) 매뉴얼 페이지의 현저한 비트 :

소스 환경에 존재하지 않는 모든 변수는 세션 환경에서 제거되도록 설정됩니다 (-r이 set-environment 명령에 제공된 것처럼).


1
@ChrisW. 좀 더 명확하게 해주시겠습니까? 나는 같은 문제가 있다고 생각합니다. 때때로 tmux 세션을 다시 연결할 때 에이전트가 작동을 멈 춥니 다. SSH 연결이 새로워 졌으므로 ssh를 사용하면 새 에이전트가 시작됩니다. 작동 시키려면 무엇을 변경해야합니까? 나는 ssh-ing하고있는 각 머신을 재구성 할 필요가 없기 때문에 이것이 실행될 수 있기를 바란다. -이제 tmux를 원격으로 시작하거나 기존 연결을 복원하는 ssh 래퍼가 있습니다. 아마도 tmux를 복원하기 전에 무언가를 할 수있을 것입니다.
sorin

@ChrisW. 짧은 답변은 때때로 좋지만 긴 답변을 해주시겠습니까? 이 작업을 수행하는 데 어려움을 겪고 있으며이 게시물의 아무것도 작동하지 않습니다.
redbmk

@sorin @redbmk 죄송합니다. 이것이 내가 .tmux.conf작동하게하기 위해 내가 바꿔야했던 유일한 줄 입니다. 일반적으로 환경 변수에 set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" 문제가 ssh있습니까?
Chris W.

2

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에 이것을 가지고 있으며 훌륭하게 작동합니다.


$SSH_AUTH_SOCK내 쉘에 올바르게 설정되어 있지만, 같은 것을 할 때 실행 하지 않으면tmux neww ssh somehost 개인 키를 잠금 해제하라는 암호 문구가 표시됩니다 . tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
Chris W.

1

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를 상속하지만 다른 세션에는 표시되지 않습니다.


0

djf의 설명은 내 마음에 또 다른 가능한 해결책을 제공합니다.

tmux/ screen실행 하기 전에 :

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

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


1
ssh-agentTTY에 바인딩하지 않습니다. 왜 logout (?)에서 종료해야 nohup합니까?
poige

@poige 맞습니다.
Hauke ​​Laging
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.