셸 스크립트: SSH를 통해 원격 시스템으로 이동한 후 종료: 'exit'가 작동하지 않습니다.

셸 스크립트: SSH를 통해 원격 시스템으로 이동한 후 종료: 'exit'가 작동하지 않습니다.

다음 유형의 쉘 스크립트가 있습니다.

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

원격 서버에서 작업을 수행하기 위해 로컬로 실행합니다('echo "Hi"'로 표시됨). 그러나 실행하면 원격 서버에 프롬프트가 표시되므로 'exit' 명령이 실행되지 않습니다. 그런 다음 원격 프롬프트에 'exit'를 수동으로 입력하면 "myremotemachine.com에 대한 연결"이 닫히고그 다음에 "안녕". 올바르게 종료되고 내가 실행한 (로컬) 프롬프트가 표시되도록 쉘 스크립트를 어떻게 설정합니까?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-script그리고ssh를 통한 ssh 및 쉘 : 종료하는 방법?다소 관련이 있는 것 같지만 거기에 제시된 아이디어를 적용할 수 없었습니다./

업데이트

다음은 최소 버전이 아닌 Unmatched '..

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

이 코드 조각에서 큰따옴표를 제거하면 bash: -c: option requires an argument다음과 같은 결과를 얻습니다.date: Undefined variable.

답변1

이렇게 하면 문제가 해결될 것입니다.

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

또는 다음을 수행할 수 있습니다. 원격 호스트에서 실행하려는 모든 명령을 별도의 스크립트에 넣으십시오. Remote.sh와 같은 이름을 지정하십시오.

이제 다음을 실행하세요.

ssh [email protected] 'bash -s' < /path/to/remote.sh

Remote.sh가 포함된 곳입니다.

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

답변2

넌 할 수있어

$ssh user@comp echo abc<ENTER>

그런 다음 해당 명령을 실행하고(abc 출력) 종료됩니다.

답변3

어쩌면 스크립트 끝에 개행 문자가 없나요?

LF종료 후 빈 줄(정확히 줄 바꿈 문자) 이 없으면 스크립트는 프로그래밍 방식으로 "Enter 키를 누르지" 않습니다.

답변4

barlops의 답변은 정확하지만 더 명확하게 설명하기 위해 이를 확장할 수 있다고 생각합니다. 스크립트를 사용하는 것 같으므로 다음과 같은 것을 제안합니다.

#!/bin/bash

ssh [email protected] "echo Hi\!"

추가 정보: 또한 특수 문자를 살펴보고 이를 이스케이프해야 할 때 bash가 큰따옴표로 묶인 느낌표를 자동으로 구문 분석하므로 특수 문자도 살펴보는 것이 좋습니다. 작은따옴표나 백슬래시 문자를 사용하여 '이스케이프'하면 이 문제를 해결할 수 있습니다.

편집하다:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

단순화된 버전을 시도했을 때 날짜 변수는 문제 없이 작동합니다. 그러면 발생한 bash -c 문제가 해결될 수도 있습니다. 또한 마지막 명령이 실행되면 종료가 필요하지 않으며 ssh 세션이 자동으로 닫힙니다.

관련 정보