서버에 SSH로 접속하고, 스크린 세션을 시작하고, cd
들어가서 실행 path/to/my/script/
하고 test.sh
싶습니다.
초보자로서 나는 시도했다
ssh [email protected] screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
path/to/my/script/
에서 볼 수 있을 것으로 예상했지만 output.txt
거기에서 내 홈 디렉토리를 보았습니다. 이는 cd
명령이 실제로 작동하지 않으므로 bash가 실행되지 않음을 의미합니다 test.sh
.
이 문제를 어떻게 해결할 수 있나요?
답변1
짧은 대답: 다음과 같이 명령 주위에 추가 따옴표를 추가하십시오.
ssh [email protected] "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"
무슨 일이 일어나고 있는지 확인하려면 일부 디버깅 정보를 가져오는 옵션을 지정할 수 있습니다 -v
. ssh
이 경우 다음과 유사한 줄이 표시됩니다.원래 명령의 경우
debug1: Sending command: screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
그리고 추가 따옴표는 다음과 같이 변경됩니다.
debug1: Sending command: screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
따라서 ssh는 전달된 인수를 가져와 모두 연결한 다음 원격 끝에서 연결된 인수 목록을 다시 별도의 인수로 분할하는 것 같습니다. C에서와 마찬가지로 매개변수 목록을 사용하여 호출하면 argv
원래 버전에서는 다음과 같은 결과를 얻을 수 있습니다.
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen
argv[3] = -dm
argv[4] = bash
argv[5] = -c
argv[6] = cd path/to/my/script/; pwd > ~/output.txt
이제 원칙적으로 이는 별도의 매개변수로 상대방 에게 ssh
전달 될 수 있으며 , 이 경우 예상대로 작동할 수 있습니다. 그러나 디버그 라인에서 볼 수 있듯이(소스 코드에 따르면 동일해 보임) 매개변수는 문자열로 연결됩니다.argv[2]
argv[6]
screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
그런 다음 원격 측에서 해석됩니다. 여기에서 원하는 작업을 수행하지 않는 이유도 분명합니다. 이제 두 가지 작업을 순서대로 실행합니다. 먼저 홈 디렉터리에서 screen -dm bash -c cd path/to/my/script/
( screen
디렉터리만 변경하는 세션 시작) 다음에는 pwd > ~/output.txt
홈 디렉터리에서도 실행합니다.
완전성을 위해 큰따옴표가 있는 명령에 대한 인수는 다음과 같습니다.
argv[0] = ssh
argv[1] = [email protected]
argv[2] = screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
그러면 예상대로 작동하는 다른 쪽 끝(디버그 라인에 표시된 대로)으로 전송 됩니다 .
답변2
@brm님의 댓글이 정답입니다. 추가 큰따옴표를 추가하면 됩니다.
ssh [email protected] "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"