간단한 스크립트를 통해 클러스터의 다양한 노드에서 명령 실행을 자동화하려고 합니다. 나는 실행할 수 있음을 확인했습니다.
#!/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의 경우 큰따옴표를 사용하는 경우:
- 문자열은 로컬 서버에서 대체됩니다.
- 명령은 원격으로 실행됩니다.
작은따옴표를 사용하는 경우:
- 문자열은 있는 그대로 원격 서버에 전달됩니다.
- 원격 교체
- 명령이 실행됨