SSH 및 Bash를 사용하여 명령을 실행하는 이상한 구문

SSH 및 Bash를 사용하여 명령을 실행하는 이상한 구문

저는 쉘/배시 스크립팅을 처음 접했고 상당히 지루한 작업을 자동화하기 위해 OSX에서 스크립트를 작성하고 있습니다. 을(를) 사용하여 원격 호스트에서 스크립트의 일부를 실행하려고 합니다 ssh. 두 시스템 모두에 호출할 공통 스크립트가 있습니다 ascript. 두 시스템 모두에서 스크립트는 /usr/local/bin에 있습니다.

ascript다음과 같이 실행하려면 원격 호스트의 전체 경로가 필요하다는 것을 알고 있습니다.

ssh user@otherHost bash -c "/usr/local/bin/ascript --FlagToDoSomething"

그러나 --FlagToDoSomething스크립트에 다음과 같이 작성해야만 올바르게 작동한다는 것을 알았습니다.

ssh user@otherHost bash -c " /usr/local/bin/ascript --FlagToDoSomething"

(즉, 여는 따옴표 뒤에 개행 문자가 필요합니다.) 터미널 창에 다음과 같은 메시지가 표시되지만 bash: -c: option requires an argument나머지는 계속 실행되어 예상한 출력을 얻습니다. 이 작업을 수행하지 않으면 방금 입력 ascript하고 Enter 키를 누른 것처럼 출력이 표시됩니다(따라서 사용법 정보).

제거하면 잘 작동 bash -c하지만, 어떤 이유로든 ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)" 이 함수를 localhost에서 실행하려고 하면 이상한 출력이 발생하기 때문에 이렇게 하는 것입니다. SSH 연결을 종료하기 전에 원격 호스트에서 여러 명령을 실행해야 합니다.

감사해요!

답변1

ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"

그렇다면 정확히 무엇을 해야 할까요? $outputecho가 에 있으므로 아직 설정되지 않았습니다 $(command substitution).

또한 $()큰따옴표 안의 셸로 확장됩니다. 이것이 로컬에서 실행되는 이유입니다. 이를 방지하려면 작은따옴표를 사용하세요.

아마도 당신은 원할 것입니다

output=$(ssh u@oh '/usr/local/bin/ascript --FlagToDoSomething')

답변2

"-c"를 제거하고 전체 shebang을 따옴표로 묶습니다.

output=$(ssh [email protected] "bash /usr/local/bin/ascript --testable=fly"); 

echo $output;

관련 정보