[ssh] SSH 세션에서 tmux를 자동으로 시작하는 방법은 무엇입니까?

정기적으로 SSH로 연결하는 서버가 10 개 정도 있습니다. 각각 내 로컬 컴퓨터의 ~/.ssh/config파일에 항목이 있습니다.

필연적으로 인터넷 연결이 끊어 질 때 실행중인 프로세스를 제어하지 않으려면 항상 tmux세션 내에서 작업합니다 . SSH 연결이 시작될 때마다 tmux가 자동으로 연결되도록하는 방법을 원하므로 SSH에 로그인 tmux attach || tmux new한 후 항상 입력 할 필요가 없습니다 .

불행히도 이것은 내가 원래 기대했던 것만 큼 간단하지 않습니다.

  • ~/.bashrc로컬 세션이 아닌 SSH 세션에만 필요하기 때문에 서버에 명령을 추가 하고 싶지 않습니다.
  • 추가 tmux attach || tmux new받는 ~/.ssh/rc서버에서 단순히 오류가 결과 not a terminal짝수 경우, 접속 후 발생되는 RequestTTY force옵션이 내 로컬 SSH 구성 파일에서 해당 서버의 라인에 추가됩니다.



답변

서버 측 구성 :

일반적으로 SSH (및 SSH 만)를 통해 로그인 할 때 원격 서버에서 tmux를 자동으로 시작하려면 원격 서버에서 ~/.bashrc사용자 또는 루트 (또는 둘 다)를 적절히 편집합니다.

if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]]; then
  tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi

이 명령은 ssh_tmux존재하지 않는 경우 호출되는 tmux 세션을 생성 하거나 해당 이름으로 이미 존재하는 세션에 다시 연결합니다. 연결이 끊어 지거나 몇 주 전에 세션을 잊어 버린 경우 모든 SSH 로그인이 자동으로 남겨둔 tmux-ssh 세션으로 돌아갑니다.

클라이언트에서 연결 :

특별한 것은 없습니다 ssh user@hostname.


답변

좋습니다. 대부분 만족스러운 해결책을 찾았습니다. 내 로컬 ~/.bashrc에서 함수를 작성했습니다.

function ssh () {/usr/bin/ssh -t $@ "tmux attach || tmux new";}

기본적으로 ssh 터미널 함수를 덮어 써 주어진 인수로 내장 ssh 프로그램을 호출 한 다음 "tmux attach || tmux new".

( $@은 명령 줄에 제공된 모든 인수를 나타내므로 ssh -p 123 user@hostname로 확장됩니다. ssh -t -p 123 user@hostname "tmux attach || tmux new")

( -t인수는 RequestTTY Forcetmux 명령과 동일하며 필수입니다.)


답변

잇다:

ssh user@host -t "tmux new-session -s user || tmux attach-session -t user"

세션 중 :

사용 Ctrl+d마무리 세션 (TMUX 창이 닫히고) 나 Ctrl+b d일시적으로 분리 세션과는 나중에 다시 연결합니다.

생각해 내다! 서버 재시작 세션이 손실 된 경우!

tmux 내부에 있으면 언제든지 세션 목록Ctrl+b s 을보고 현재를 다른 것으로 전환 하는 데 사용할 수 있습니다 .

.bashrc를 수정하십시오.

다음에서 범용 기능을 정의하는 것이 좋습니다 .bashrc.

function tmux-connect {
    TERM=xterm-256color ssh -p ${3:-22} $1@$2 -t "tmux new-session -s $1 || tmux attach-session -t $1"
}

22기본적으로 포트를 사용합니다 . 빠른 연결 별칭도 정의하십시오.

alias office-server='tmux-connect $USER 192.168.1.123'
alias cloud-server='tmux-connect root my.remote.vps.server.com 49281'

비밀번호없이 로그인 :

자동 로그인.ssh 키를 생성하는 것보다 매번 비밀번호를 입력하고 싶지 않은 경우 :

ssh-keygen -t rsa
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa

공개 키를 원격 호스트에 넣으십시오.

ssh-copy-id -p <port> user@hostname

추가 팁 :

당신이 사용하려는 경우 일시적으로 세션 ID 와 같은 지역의 bash 세션 사용에 해당 TMUX ID를 :

SID=$USER-$BASHPID
ssh user@host -t "tmux new-session -s $SID || tmux attach-session -t $SID"


답변

@kingmeffisto의 줄을 사용했으며 (그 대답에 대해 주석을 달 수 없습니다) 종료를 추가하여 tmux를 종료하면 ssh 연결도 종료됩니다. 그러나 이것은 SFTP 세션을 깨뜨 렸으므로 $SSH_TTY대신 확인해야했습니다 $SSH_CONNECTION.

2018 년 4 월 수정 : [[ $- =~ i ]]Ansible과 같은 도구가 작동 할 수 있도록을 통한 대화 형 터미널 테스트가 추가되었습니다 .

if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then
    tmux attach-session -t ssh || tmux new-session -s ssh
    exit
fi


답변

이 블로그 게시물에 설명 된대로 ssh를 수행 한 다음 단일 명령으로 기존 tmux 세션에 연결할 수 있습니다.

ssh hostname -t tmux attach -t 0


답변

원격 시스템의 tmux 3.1 이상 ¹

현지 ~/.ssh/config, put² :

Host myhost
  Hostname host
  User user
  RequestTTY yes
  RemoteCommand tmux new -A -s foobar

관련이 없지만 ASCII가 아닌 문자를 다루는 경우 tmux -u …적절한 환경 변수가 설정되지 않은 컴퓨터에서도 유니 코드 지원을 명시 적으로 활성화하기 위해 로 변경하는 것이 좋습니다 .

원격 컴퓨터의 tmux 3.0a 이상

위와 거의 동일하지만 마지막 줄을 ³ :

  RemoteCommand tmux at -t foobar || tmux new -s foobar

¹ 2020 년 10 월 29 일 현재 tmux 3.1 이상과 함께 제공되는 배포 목록 이미 상당히 깁니다.

² newnew-session.

³ atattach-session.


원격 authorized_keys파일을 사용하는 다른 방법 :

~/.ssh/config어떤 이유로 든 파일을 갖고 싶지 않거나 원격 시스템이 연결 시스템이 세션에 연결 / 열도록 강제하려면 다음을 원격 장치에 추가하십시오 ~/.ssh/authorized_keys.

command="tmux at -t foobar || tmux new -s foobar" pubkey user@client

물론 이것은 해당 개인 키가 설치된 모든 클라이언트 에서 작동하며 원하는 항목에 따라 위 또는 아래가 될 수 있습니다. 문제가 발생하면 더 이상 연결할 수없는 위험이 있습니다.


답변

byobu TMUX / 화면을위한 좋은 유용한 래퍼입니다. 존재하는 경우 기존 세션에 연결하거나 새 세션을 만듭니다.

ssh 세션을 정상적으로 다시 연결하는 autossh 와 함께 사용합니다 . 간헐적 인 연결 문제가있는 경우 적극 권장됩니다.

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}