정기적으로 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 Force
tmux 명령과 동일하며 필수입니다.)
답변
잇다:
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 이상과 함께 제공되는 배포 목록 이미 상당히 깁니다.
² new
는 new-session
.
³ at
는 attach-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'
}