서버에 SSH로 접속하고, 스크린 세션을 시작하고, 디렉터리를 변경하시겠습니까?

서버에 SSH로 접속하고, 스크린 세션을 시작하고, 디렉터리를 변경하시겠습니까?

서버에 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'"

관련 정보