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


24

나는이 질문을하기 시작했지만 열려있는 동안 대답했다. 이 질문을 게시하고 내 솔루션으로 후속 조치를 취하여 다른 잠재적 솔루션에 공개합니다.

<뒷이야기>

저는 tmux 및 vim 사용자입니다. 플래시 영화가 나에게 커널 패닉을 줄 때 우분투 개발 기계가 커질 까 걱정할 필요가 없으므로 원격 vim 작업을 좋아합니다. tmux를 실행한다는 것은 재부팅 후 열린 파일이 나를 기다리고 있다는 것을 의미하며 중단 한 곳부터 계속할 수 있습니다. 다음과 같이 연결할 때 tmux 세션에서 vim을 실행하는 데 문제가 있습니다.

ssh example.com -t 'tmux attach'

UTF-8 문제는 정상적으로 쉘링 할 때 자르지 않고 tmux 세션에 수동으로 연결할 때 잘리지 않습니다.

</ 백 스토리>

내가 ssh를 로그인에 뭔가를 시작하는 재사용 가능한 방법을 원하는 그래서, 그게 내가에서 구성한 다른 것들에 영향을주지 않는 내 .zshrc(또는를 .bashrc여전히 떠들썩한 파티를 사용하는 경우)하지 않는, 내 개발 환경에 필요한 될 수있다 내가 말한 기계에서 로컬로 작업 할 때 나타납니다.

답변:


13

당신이 실행하는 경우 ssh example.com, SSH를 데몬이 당신을 위해 로그인 쉘을 시작하고 로그인 쉘이 읽는 당신 ~/.profile(또는 ~/.bash_profile또는 ~/.zprofile또는 ~/.login로그인 쉘에 따라 다름). 원격으로 (을 포함하거나 포함하지 않고 -t) 실행할 명령을 지정 하면 ssh 데몬이 일반 쉘을 시작하므로 사용자 .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를 통해 환경 변수를 전달하는 방법에 대한 자세한 정보가 있습니다.


내가 사용 ssh example.com -t 'tmux attach'하지 않는 이유는 환경을로드하는 데 문제가 있기 때문이 아니라 UTF-8 문자 표시에 문제가 있기 때문입니다. 기존 방식으로 연결할 때는이 문제가 존재하지 않습니다. 그렇기 때문에이 질문은 SSH를 통해 연결 한 직후 스크립트를 실행하는 것입니다.
connrs

그래도 귀하의 솔루션을 좋아합니다. 우아함
connrs

@connrs : 실행해도 UTF-8에 문제가 .profile있습니까? 나는 문제가 당신의 대상 컴퓨터에 잘못 설정된 로케일 때문 가정 /etc/profile또는 .profile고정. 로케일 문제는 더 많은 정보로 해결 될 수 있습니다.
Gilles 'SO- 악마 중지'

나는 이것을 테스트하기 위해 사무실로 돌아가고 싶었다. / etc / profile을 소싱하면 적절한 동작이 트리거됩니다. 이제 실제로 더 일반적인 질문을 물어 내게 동기를 부여하는 문제를 해결 한
connrs

6

Eli Heady가 아래 의견에 더 나은 제안을 PermitUserEnvironment yes~/.ssh/environment때까지 환경 변수를 설정 하고 추가하는 것이 좋습니다 .

.zlogin(bash : .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

영감을 얻은 것 : 리눅스 쉘 스크립트에서 입력을 요청하는 방법은?

참고 내가 사용했던 것을 .zlogin파일을하지만 당신은 사용할 수있는 .zshrc파일을하지만 난 깔끔한 내 dotfiles을 유지하기 위해 좋아하고 내가 다른 컴퓨터에서 사용할 수 있도록 그것을 분리한다.

질문을 자신에게 적합한 것으로 바꾸고 MY_SSH_CONNECTION="yes" tmux attach그 시점에서 실행하려는 것으로 바꾸십시오 .

위의 동일한 스크립트에 액세스하고 재귀를 방지하는 쉘을 열 때 스크립트 가 tmux로 전달 MY_SSH_CONNECTION="yes"되기 전에 설정하는 방법에 유의하십시오 tmux attach.


2
일부 환경에서는 잠재적 보안 영향으로 인해 PermitUserEnvironment를 사용할 수 없습니다. SSH는 $ SSH_CONNECTION 변수를 설정합니다.이 변수는 .zlogin에서 $ SSH_LOGIN 대신 사용될 수 있으므로 ~ / .ssh / environment를 사용할 필요가 없습니다. 같은 뭔가 if [[ "$SSH_CONNECTION" != "" ]]를해야한다.
Eli Heady

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 system command'형식 (~ /.* profile을 호출하지 않음)에서는 작동하지 않습니다. 중단하면 쉘 기능이 다시 연결되도록 설정됩니다.


큰! 나는 대신 bashrc를 넣음으로써 이것을 f * 처리하고, 각각의 새로운 화면 창에서 .profile로 변경할 때 잘 작동했습니다.
휴고

0

당신은 실행을 고려할 수 있습니다

ssh remotehost -t screen -DR

거기서 터미널 세션을 실행하십시오. 그런 다음 분리하고 ( ^A^D) 나중에 다시 다른 클라이언트에서 다시 연결할 수 있습니다 . 화면이 완전한 대화식 터미널 세션 (선택적으로 로그온 셸, man screen(1) 또는 ^A?)을 유지함에 따라 비 대화식 초기화 문제가 사라집니다.


내 질문에서 언급했듯이 세션을 관리하기 위해 GNU 화면 대신 tmux를 사용하고 있습니다. 그리고로드 할 때 -t 'tmux attach'정상적으로 나타나지 않는 vim에 문제가 있습니다. 이것이 실제 질문이 화면 / 세션 관리가 아닌 ssh connect에서 스크립트를 실행하는 것에 대한 이유입니다. 내 질문에 명확하지 않은 것에 대한 사과
connrs

죄송합니다. tmux에 대해 언급했지만 아무런 의미가 없습니다. 그래도 새로운 도구를 언급 해 주셔서 감사합니다!
sehe

0

추가하면 UTF-8 문제에 대해 구체적으로 이야기하려면

SendEnv LANG

그리고 로컬 끝과 $LANG같은 것으로 설정되어 en_US.UTF-8있으며 원격 끝의 sshd는 SendEnv지시문을 허용합니다 ( AcceptEnvin in sshd_config), 다른 쪽 끝의 tmux는 그것을 준수해야합니다. 잠시 동안이 문제가 발생하여 문제를 해결하기가 어려웠습니다.


0

연결할 때마다 실행 하려면 원격 컴퓨터 tmux attach의 하단에 추가 하면 ~/.profile됩니다.

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