내 스크립트에서는 다음과 같은 작업을 수행합니다.
command="some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;"
ssh_command="ssh root@$ip '$command'"
echo $ssh_command
exec $ssh_command
에코는 다음과 같은 출력을 제공합니다.
ssh [email protected] 'some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;'
"exec" 후에 출력을 얻습니다.
bash: some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;: No such file or directory
그러나 에코 출력에서 명령을 복사하고 터미널에서 직접 실행하면 매력처럼 작동합니다. 이유가 무엇인가요?
답변1
exec
셸을 프로그램으로 대체하고 제공된 인수로 이를 호출합니다. 쉘은 "exec" 및 "some/path/script.sh arg1 arg2; some/path/script2.sh arg1 arg2;"라는 2개의 토큰을 확인합니다. 두 번째 인수는 모든 공백과 세미콜론을 포함하여 실행할 프로그램의 경로로 해석됩니다. 오직 쉘만이 인수를 공백으로 분리하고 명령을 세미콜론으로 분리하는 방법을 알고 있습니다. 따라서 를 exec
와 같은 셸 호출로 바꿔야 합니다 sh -c "$ssh_command"
.
답변2
노웁당신에게 유용할 수 있습니다.
아래 링크에서 이와 같은 것을 통합해 보세요.
ssh -n -f 사용자@호스트 "sh -c'cd /어디든지; nohup ./whatever > /dev/null 2>&1 &'"