ssh는 스크립트에서 "command" 대신 "command"를 사용합니다.

ssh는 스크립트에서 "command" 대신 "command"를 사용합니다.

간단한 스크립트를 통해 클러스터의 다양한 노드에서 명령 실행을 자동화하려고 합니다. 나는 실행할 수 있음을 확인했습니다.

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 'echo Machine: $HOSTNAME;'
echo "Machine: "$HOSTNAME;

예상되는 결과를 얻습니다.

Machine: machine1
Machine: machine2
Machine: machine1

그러나 변수가 필요한 더 복잡한 명령을 실행하고 싶기 때문에 대신 를 사용해야 합니다 ". 그러나 이렇게 하면 ssh가 작동하지 않는 것 같습니다.'ssh

#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 "echo Machine: $HOSTNAME;"
echo "Machine: "$HOSTNAME;

반품:

Machine: machine1
Machine: machine1
Machine: machine1

나는 보았다다른 문제run 명령을 이런 방식으로 사용하라고 분명히 나와 있어서 "여기서 무슨 일이 일어나고 있는지 혼란스럽습니다.

답변1

당신이 요구하는 것은 로컬로 평가되는 변수와 원격으로 평가되어야 하는 변수를 혼합하고 일치시키는 방법이라고 생각합니다.

한 가지 옵션은 원격 작업을 위한 스크립트를 작성하여 로컬 변수에 대한 참조를 캡슐화하여 로컬 호스트의 따옴표가 확장되는 것을 볼 수 없도록 하는 것입니다.

매우 짧은 조각의 경우 또 다른 옵션은 다음과 같이 따옴표를 혼합하는 것입니다.

FRUIT=apples
ssh machine2 "echo Eating $FRUIT "'on $HOSTNAME'

ssh큰따옴표로 묶인 섹션 내의 변수는 로컬에서( 실행 전) 평가됩니다 . 작은따옴표로 묶인 단락 내의 모든 내용은 리터럴로 처리됩니다. 따옴표로 묶인 두 문자열을 연결하여 string 을 생성 echo Eating apples on $HOSTNAME하고 결과는 원격으로 평가할 수 있도록 리터럴로 전달됩니다.

답변2

직접 확인할 수 있습니다.

[user@bluepc ~]$ echo "$HOSTNAME;"
bluepc;
[user@bluepc ~]$ echo '$HOSTNAME;'
$HOSTNAME;

작은따옴표 안의 환경 변수는 문자열로 처리됩니다.

SSH의 경우 큰따옴표를 사용하는 경우:

  • 문자열은 로컬 서버에서 대체됩니다.
  • 명령은 원격으로 실행됩니다.

작은따옴표를 사용하는 경우:

  • 문자열은 있는 그대로 원격 서버에 전달됩니다.
  • 원격 교체
  • 명령이 실행됨

관련 정보