쉘 스크립트의 ssh 블록에 있는 환경 변수

쉘 스크립트의 ssh 블록에 있는 환경 변수

나는 다음과 같은 기능을 가지고 있습니다 :

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.EOFscp

bash-isms를 사용하고 있으므로 bash쉘을 사용하지 않는 사람이 실행하는 경우 이를 고려하는 것이 좋습니다.

또한 grep파일을 처리할 수 있기 때문에 파일을 넣을 필요가 없으며 블록 명령에 대상이 누락됩니다 cat.IS_NODE2scp

관련 정보