SSH를 통해 연결한 후 즉시 스크립트를 실행하려면 어떻게 해야 합니까?

SSH를 통해 연결한 후 즉시 스크립트를 실행하려면 어떻게 해야 합니까?

이 질문을 하기 시작했는데, 열어볼 때쯤에는 답이 나왔습니다. 이 질문을 게시하고 내 솔루션에 대한 후속 조치를 취하며 다른 잠재적인 솔루션을 열어 두겠습니다.

<배경 이야기>

저는 tmux와 vim 사용자입니다. 나는 Flash 영화에서 커널 패닉이 발생할 때 Ubuntu 개발 시스템이 충돌하는 것에 대해 걱정할 필요가 없기 때문에 원격 vim으로 작업하는 것을 좋아합니다. tmux를 실행한다는 것은 재부팅한 후에 열려 있는 파일이 나를 기다리고 있고 중단한 부분부터 계속할 수 있음을 의미합니다. 다음과 같이 연결할 때 tmux 세션에서 vim을 실행하는 데 문제가 있습니다.

ssh example.com -t 'tmux attach'

정상적으로 압축을 풀고 tmux 세션에 수동으로 연결할 때 발생하지 않는 UTF-8 문제가 발생합니다.

</배경 이야기>

.zshrc.bashrc그래서 내 개발 환경에 필요할 수 있는 내 구성(또는 여전히 bash를 사용하는 경우 사용자의 구성)에 영향을 주지 않는 ssh 로그인에서 무언가를 시작하는 재사용 가능한 방법을 원합니다. 때때로 이 컴퓨터에서 로컬로 작업합니다.

답변1

을 실행하면 ssh example.comssh 데몬이 로그인 셸을 시작하고 로그인 셸은 로그인 셸에 따라 ~/.profile또는 ~/.bash_profile를 읽습니다. 를 사용하거나 사용하지 않고 원격으로 실행할 명령을 지정하면 ssh 데몬은 일반 셸을 시작하므로 명령을 읽지 않습니다. 치료:~/.zprofile~/.login-t.profile

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

대부분의 ssh 데몬은 환경 변수 전송을 거부하도록 구성되어 있습니다 LC_*. 그러나 ssh 데몬이 example.com허용하는 경우 사용자 정의 LC_*변수를 남용하여 tmux를 자동 시작할 수 있습니다 ~/.profile.

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

LC_tmux_session= ssh example.com그런 다음 를 사용하거나 로그인하세요 LC_tmux_session=session_name ssh example.com.

이 답변SSH를 통해 환경 변수를 전달하는 방법에 대한 추가 정보가 있습니다.

답변2

PermitUserEnvironment yes이전 에 제안한 내용은 ~/.ssh/environment다음과 같습니다.엘리 헤디아래 댓글에서 더 나은 제안을 생각해 보세요.

.zlogin(bash: etc) 를 열고 .bash_profile다음을 입력하세요.

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

에서 영감을 받다:Linux 쉘 스크립트에서 입력을 요청하는 방법은 무엇입니까?

저는 이 파일을 사용했지만 .zlogin여러분은 여러분의 파일을 사용할 수 있습니다 .zshrc. 하지만 저는 도트 파일을 깔끔하게 분리하여 다른 컴퓨터에서 사용할 수 있도록 하고 싶습니다.

질문을 귀하에게 적합한 질문으로 바꾼 다음, MY_SSH_CONNECTION="yes" tmux attach그 때 실행하고 싶은 질문으로 바꾸십시오.

MY_SSH_CONNECTION="yes"tmux에 전달하기 전에 스크립트가 어떻게 설정되어 있는지 확인하세요. tmux attach위와 동일한 스크립트에 액세스하고 재귀를 방지하는 셸도 열리기 때문입니다.

답변3

이것을 .bash_profile 파일에 직접 추가했습니다.

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

이렇게 하면 다시 연결하거나 화면 세션 생성을 중단할 시간이 생깁니다. "ssh 시스템 명령" 형식에서는 작동하지 않습니다(~/.*profile을 호출하지 않음). 중단하면 다시 연결하도록 쉘 기능을 설정하십시오.

답변4

UTF-8 문제를 구체적으로 논의하려면 다음을 추가하세요.

SendEnv LANG

로컬 측에서도 $LANG비슷한 값으로 설정되어 있으며 en_US.UTF-8원격 측의 sshd는 이 SendEnv지시어를 허용하고( AcceptEnvin 사용 sshd_config), 반대편의 tmux는 이를 존중해야 합니다. 한동안 이 문제가 발생했는데 해결하기가 어렵습니다.

관련 정보