다음을 사용하여 원격 서버에서 명령을 실행할 수 있습니다.
ssh user@host 'the command'
그런데 따옴표 없이 명령을 실행할 수 있는 방법이 있나요?
(저는 BSD를 사용하고 OpenSSH를 사용합니다)
답변1
명령에 따라 다릅니다. 일반적으로 원격 컴퓨터에 명령을 전달할 때 일반적으로 로컬 셸에서 해석되는 명령의 모든 문자를 이스케이프해야 합니다. 과도하게 일반화할 위험이 있으므로 로컬 쉘이 해석하려는 문자가 없으면 따옴표가 필요하지 않을 가능성이 높습니다. 결과적으로 쉘 문자가 올바르게 이스케이프되면(로컬 쉘이 이를 해석하지 않도록) 따옴표가 필요한 명령을 다시 작성하여 따옴표가 필요하지 않게 될 수 있습니다.
date.out
원격 시스템의 날짜를 원격 시스템의 사용자 홈 디렉터리에 있는 파일에 캡처하는 것을 고려해 보십시오 . 따옴표를 사용하여 이를 달성하는 한 가지 방법은 다음과 같습니다.user
host
ssh user@remote 'date > date.out'
따옴표 없이 명령을 실행하려는 잘못된 시도는 다음과 같습니다.
ssh user@remote date > date.out
이로 인해 로컬 쉘 처리에서는 > date.out
원격 ssh 명령만 그대로 유지됩니다 date
. 명령은 date
원격으로 실행되지만 출력은 로컬에 저장됩니다. 이를 방지하려면 >
기호를 이스케이프해야 합니다.
ssh user@remote date \> date.out
이 명령을 실행한 후 두 번째 예를 계속할 수 있습니다. 인용된 명령을 사용하여 출력 파일 ls
과 해당 내용을 검사해 보겠습니다 cat
.
ssh user@remote 'ls -l date.out; cat date.out'
인용되지 않은 명령:
ssh user@remote ls -l date.out; cat date.out
원격으로 만 ls
명령을 실행하세요. cat
로컬 쉘은 세미콜론 문자를 두 명령 사이의 구분 기호로 해석하므로 명령은 로컬로 실행됩니다 .
따옴표 없이 명령을 올바르게 실행하려면 다음을 사용할 수 있습니다.
ssh user@remote ls -l date.out\; cat date.out
명령에서 변수 또는 매개변수 확장을 사용하려는 경우에도 비슷한 규칙이 적용됩니다. 변수가 로컬 환경에 정의된 경우 일반적으로 따옴표(또는 이스케이프)가 필요하지 않습니다. 로컬 사용자가 alex
명령을 실행하는 경우:
ssh user@remote echo $USER
alex
$USER의 로컬 값이 원격 호스트로 전송되기 전에 ssh 명령으로 확장되기 때문에 출력됩니다 . 명령이 다음과 같은 경우큰따옴표:
ssh user@remote "echo $USER"
로컬 쉘은 큰따옴표로 묶인 경우 변수를 확장하므로 결과는 동일합니다. 그러나 두 명령 중 하나는 다음과 같습니다.
ssh user@remote 'echo $USER'
또는
ssh user@remote echo \$USER
user
문자열 확장은 $USER
로컬 쉘이 아닌 원격 호스트에 의해 수행되기 때문에 인쇄됩니다 .
답변2
바로 여기에:
$ ssh host.example.com echo this is a test
this is a test