자주 필요한 명령을 실행하기 위해 쉘 스크립트를 작성하려고 합니다. SSH 로그인에 공개/개인 키 쌍을 사용하여 비밀번호 프롬프트를 건너뜁니다. 검색을 한 후 다음과 같은 코드를 실행할 수 있었습니다.
파일: ssh.sh
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c
EOF
하지만 다음과 같이 쓰면 아무런 차이가 없습니다.
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c &
EOF
다른 점이 없다 &
. 예 &
, 일반적으로 gedit가 실행된 후 백그라운드로 전송되고 프롬프트가 나타납니다. 하지만 gedit 후에 프롬프트가 표시되지 않습니다. (단, 다음 줄에 있는 내용은 모두 실행됩니다. 입력하자마자 echo "Hello"
표시됩니다 Hello
.)
어떻게 되어가나요? 다른 방법이 있나요? SSH를 수행하고 쉘 스크립트를 통해 일부 명령을 실행하고 싶습니다. 하지만 쉘 스크립트 실행이 완료된 후에는 로그아웃하고 싶지 않습니다. 위의 스크립트처럼 반복되지 않는 일부 명령을 실행한 후 수동으로 로그아웃하고 싶습니다.
답변1
그렇지 않은 경우 원격으로 실행된 스크립트는 "로 변경 한 다음 실행 하고 종료될 때까지 기다립니다"라고 &
말합니다 . 출구를 기다리지 않는다는 의미 의 변형입니다 . 어느 쪽이든 스크립트의 마지막 명령을 실행한 후 셸이 종료됩니다./root/myDir
gedit
&
gedit
스크립트를 실행한 다음 좀 더 대화형으로 입력된 명령을 실행하려면 마지막에 대화형 셸을 실행해야 합니다.
ssh -Xt [email protected] 'cd /root/myDir && gedit a.c b.c; exec bash'
이 옵션은 -t
SSH가 서버에 가상 터미널을 설정하도록 지시합니다. 실행할 원격 명령을 전달할 때는 기본적으로 이 작업이 수행되지 않습니다. exec bash
마지막으로 쉘에 새로운 bash 인스턴스로 교체하라고 지시합니다. 이 인스턴스는 입력이 터미널에서 오기 때문에 대화형 쉘(프롬프트 표시, 명령 수신 등)이 됩니다.
답변2
a를 정의한 function
다음 를 통해 실행할 수 있습니다 ssh
.
#!/bin/bash
ssh_func(){
cd /root/myDir
gedit a.c b.c
}
ssh -X [email protected] "$(typeset -f); ssh_func"
typeset -f
스크립트에 정의된 기능이 표시됩니다.