따옴표 없이 SSH 명령 실행

따옴표 없이 SSH 명령 실행

다음을 사용하여 원격 서버에서 명령을 실행할 수 있습니다.

ssh user@host 'the command'

그런데 따옴표 없이 명령을 실행할 수 있는 방법이 있나요?

(저는 BSD를 사용하고 OpenSSH를 사용합니다)

답변1

명령에 따라 다릅니다. 일반적으로 원격 컴퓨터에 명령을 전달할 때 일반적으로 로컬 셸에서 해석되는 명령의 모든 문자를 이스케이프해야 합니다. 과도하게 일반화할 위험이 있으므로 로컬 쉘이 해석하려는 문자가 없으면 따옴표가 필요하지 않을 가능성이 높습니다. 결과적으로 쉘 문자가 올바르게 이스케이프되면(로컬 쉘이 이를 해석하지 않도록) 따옴표가 필요한 명령을 다시 작성하여 따옴표가 필요하지 않게 될 수 있습니다.

date.out원격 시스템의 날짜를 원격 시스템의 사용자 홈 디렉터리에 있는 파일에 캡처하는 것을 고려해 보십시오 . 따옴표를 사용하여 이를 달성하는 한 가지 방법은 다음과 같습니다.userhost

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

관련 정보