나는 다음과 같은 기능을 가지고 있습니다 :
GetHostName () {
NODE01_CHECK=`cat /etc/hosts | grep -w "node01" | awk '{print $1}'`
NODE02_CHECK=`cat /etc/hosts | grep -w "node02" | awk '{print $1}'`
IS_NODE1=`ifconfig -a | grep -w $NODE01_CHECK`
IS_NODE2=`ifconfig -a | grep -w $NODE02_CHECK`
if [[ ! -z $IS_NODE1 ]]; then
echo "This is NODE 1"
fi
if [[ ! -z $IS_NODE2 ]]; then
echo "This is Node 2"
fi
}
스크립트는 클러스터의 일부인 두 노드 중 하나에 특정 IP가 구성되어 있는지 식별합니다. 로컬에서는 잘 작동하지만 클러스터 VIP만 알고 있는 서버에서 원격으로 실행해야 합니다. 목표는 일부 파일을 두 개의 노드로 전송하는 것입니다.
그래서 내가 실행할 때 :
scp -r /tmp/files CLUST_VIP
ssh CLUST_VIP <<EOF
NODE01_CHECK=`cat /etc/hosts | grep -w "node01" | awk '{print $1}'`
NODE02_CHECK=`cat /etc/hosts | grep -w "node02" | awk '{print $1}'`
IS_NODE1=`ifconfig -a | grep -w $NODE01_CHECK`
IS_NODE2=`ifconfig -a | grep -w $NODE02_CHECK`
if [[ ! -z $IS_NODE1 ]]; then
scp -r /tmp/files node02
fi
if [[ ! -z $IS_NODE2 ]]; then
scp -r /tmp/files node01
fi
EOF
그러나 이제 ssh 블록 내에서 동일한 명령을 실행하면 다음 메시지가 나타납니다.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh -t
위에서 언급한 오류를 사용하고 제거해 보았지만 grep
환경 변수가 작동하지 않는 것 같습니다.
SSH 블록을 통해 환경 변수를 사용하는 방법이 있습니까?
답변1
man bash
:
이 문서의 형식은 다음과 같습니다.
<<[-]word
here-document
delimiter
매개변수 및 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장을 수행하지 않습니다.단어. 그 안에 문자가 있으면단어따옴표가 붙은 경우 구분 기호는 따옴표를 제거한 단어의 결과이며 이 문서의 줄은 확장되지 않습니다. 만약에단어 따옴표가 없으면 여기에 있는 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 거치며 문자 시퀀스 \<newline>은 무시되며 \는 \, $ 및 ` 문자를 인용하는 데 사용해야 합니다..
답변2
변수와 하위 쉘은 SSH를 통해 전송되기 전에 실행됩니다. ssh
명령 을 cat
.EOF
scp
bash-isms를 사용하고 있으므로 bash
쉘을 사용하지 않는 사람이 실행하는 경우 이를 고려하는 것이 좋습니다.
또한 grep
파일을 처리할 수 있기 때문에 파일을 넣을 필요가 없으며 블록 명령에 대상이 누락됩니다 cat
.IS_NODE2
scp