로그인이 항상 화면 세션에 다시 연결되도록 SSH 및 화면을 구성하고 싶습니다. 이상적으로는 Cd를 누르면 세션이 종료되지 않고 분리됩니다. 이것이 어떻게 달성 될 수 있습니까? SSH 수명을보다 쉽게하기 위해 어떤 유용한 설정이 있습니까?
로그인이 항상 화면 세션에 다시 연결되도록 SSH 및 화면을 구성하고 싶습니다. 이상적으로는 Cd를 누르면 세션이 종료되지 않고 분리됩니다. 이것이 어떻게 달성 될 수 있습니까? SSH 수명을보다 쉽게하기 위해 어떤 유용한 설정이 있습니까?
답변:
SSH를 통해 연결할 때 자동으로 스크린 세션에 들어가도록 모든 서버에서 다음을 수행했습니다.
사용자 계정의 ~ / .bashrc에 다음을 추가하십시오.
# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session. Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
STARTED_SCREEN=1 ; export STARTED_SCREEN
screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]
main이라는 스크린 세션이 존재하지 않으면 시작되거나 다시 연결됩니다. 이것은 다양한 서비스를 위해 분리 된 다른 여러 세션이 있고 연결하고 싶지 않기 때문에 수행되었습니다.
원격 서버의 .bash_profile에 다음이 있습니다.
if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
reattach() {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
이것은 두 가지 작업을 수행합니다. 먼저, 셸을 교체하고 ssh-agent 연결을 전달하는 셸 기능을 설정하고, 두 번째로 몇 초 동안 일시 정지 한 후 (화면을 시작하지 않으려는 경우) 기능을 호출합니다.
if
아직 실행 중이 아닌 화면 ( -z "${STY}"
)이 터미널 ( -t 0
)에 연결되어 있고 sudo를 실행하지 않는 경우 (때로는 변경되지 않는 경우) 첫 번째 절이 적용됩니다 $USER
.
이 reattach
기능은 먼저 ssh-agent 포트가 활성화 된 상태에서 ssh가 호출되었는지 확인합니다 ( -n "${SSH_AUTH_SOCK}"
). 그런 다음 ~/.ssh/agent-script
현재 활성화 된 소켓 파일을 사용하여 환경 변수 ( $SSH_AUTH_SOCK
)를 새 값으로 바꿉니다. 그런 다음 스크립트는 현재 쉘을 단일 screen
세션으로 바꿉니다 (하나만 존재해야 함). 함수에 대한 모든 인수 reattach
는 명령 ( ${1:+"$@"}
)으로 전달됩니다 .
마지막 부분은 먼저 사용 불능 세션 ( screen -wipe
)을 제거 하고 사용자 (me)에게 화면이 곧 시작될 것임을 알리고 대신 Ctrl- 을 눌러 쉘로 돌아갈 수 있습니다 C. 그런 다음 5 초 동안 기다렸다가 reattach
함수를 호출합니다 .
먼저 byobu를 사용하는 경우 항상 byobu를 자동으로 시작하도록 새 셸 세션을 구성 할 수 있습니다 (최신 화면에서는 tmux를 백엔드로 사용할 수 있지만 기본적으로 멋진 화면 구성입니다). byobu를 정말로 원하지 않는다면, .profile
또는 다른 쉘 구성 스크립트를 exec screen
if 로 편집하여 화면을 수동으로 연결하도록 설정할 수 있습니다 TERM != "screen"
.
마음에 들지 않으면 authorized_keys
파일을 사용하여 특정 키와의 연결을위한 특정 명령을 실행할 수 있습니다 (원하는만큼의 키를 가질 수 있음). 자세한 내용 man sshd
을 참조하십시오. 화면이 실행 중이고 연결되어 있는지 확인하거나 새 세션을 시작하는 스크립트를 명령으로 실행하도록 제안합니다.
Ctrl-D의 연결 해제와 관련하여 화면에서의 키 매핑을 설정할 수 있습니다 .screenrc
. 자세한 내용 man screen
을 참조하십시오. "bindkey"를 찾고 있습니다.
아마도 귀하의 질문과 전혀 관련이 없지만 TMUX 사용을 고려한 적이 있습니다. 그것은 당신이 즉시 찾고있는 많은 기능을 수행합니다.
예 : TMUX에있을 때 SSH 세션에서 연결을 끊는 경우 "tmux a"를 ssh back하고 실행하여 세션에 연결하기 만하면됩니다. TMUX를 사용하기 시작한 이래로 nohup / disown 명령이 무엇인지 잊었습니다. 무언가를 실행하고 로그 아웃해야하는 경우 tmux 내에서 실행하고 분리하십시오. 명령 출력이 버퍼링되므로 나중에 검토 할 수 있습니다.
자동으로 첨부하려면 .bashrc에 다음과 같은 것을 추가 할 수 있습니다.
[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a
또는 더 쉬운
tmux a 2>/dev/null
메모리 사용량이 적고 전체 IMHO 옵션이 훨씬 우수합니다.
meta-d 단축키는 TMUX에서 분리하기위한 기본 맵핑입니다.
screen -dAr default || screen -AS default
나를 위해 작동합니다. ~ / .bashrc에 추가합니다 .
스위치를 간단히 설명하십시오.
d
-다른 세션에서 화면이 여전히 연결되어 있으면 분리하십시오.A
-화면의 창을 새로운 터미널 크기에 맞 춥니 다.r default
-기본이라는 화면에 연결하십시오.첫 번째 화면 명령 (이전의 명령 ||
)이 성공하지 못하면 두 번째 화면 명령 이 실행됩니다.
A
-위에서 설명한대로 ...S default
-이름이 default 인 새 화면 세션을 만듭니다 .