![SSH를 통해 연결한 후 즉시 스크립트를 실행하려면 어떻게 해야 합니까?](https://linux55.com/image/48348/SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%97%B0%EA%B2%B0%ED%95%9C%20%ED%9B%84%20%EC%A6%89%EC%8B%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
이 질문을 하기 시작했는데, 열어볼 때쯤에는 답이 나왔습니다. 이 질문을 게시하고 내 솔루션에 대한 후속 조치를 취하며 다른 잠재적인 솔루션을 열어 두겠습니다.
<
배경 이야기>
저는 tmux와 vim 사용자입니다. 나는 Flash 영화에서 커널 패닉이 발생할 때 Ubuntu 개발 시스템이 충돌하는 것에 대해 걱정할 필요가 없기 때문에 원격 vim으로 작업하는 것을 좋아합니다. tmux를 실행한다는 것은 재부팅한 후에 열려 있는 파일이 나를 기다리고 있고 중단한 부분부터 계속할 수 있음을 의미합니다. 다음과 같이 연결할 때 tmux 세션에서 vim을 실행하는 데 문제가 있습니다.
ssh example.com -t 'tmux attach'
정상적으로 압축을 풀고 tmux 세션에 수동으로 연결할 때 발생하지 않는 UTF-8 문제가 발생합니다.
<
/배경 이야기>
.zshrc
.bashrc
그래서 내 개발 환경에 필요할 수 있는 내 구성(또는 여전히 bash를 사용하는 경우 사용자의 구성)에 영향을 주지 않는 ssh 로그인에서 무언가를 시작하는 재사용 가능한 방법을 원합니다. 때때로 이 컴퓨터에서 로컬로 작업합니다.
답변1
을 실행하면 ssh example.com
ssh 데몬이 로그인 셸을 시작하고 로그인 셸은 로그인 셸에 따라 ~/.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
지시어를 허용하고( AcceptEnv
in 사용 sshd_config
), 반대편의 tmux는 이를 존중해야 합니다. 한동안 이 문제가 발생했는데 해결하기가 어렵습니다.