Shell-Script

shell腳本中ssh塊上的環境變數

  • December 8, 2016

我有以下功能:

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 塊上使用環境變數?

man bash:

這里文件的格式是:

         <<[-]word
                 here-document
         delimiter

不會對word執行參數和變數擴展、命令替換、算術擴展或路徑名擴展。如果word中的任何字元被引用,則分隔符是 word 上去除引號的結果,並且 here-document 中的行不展開。 如果word 不帶引號,則 here-document 的所有行都經過參數擴展、命令替換和算術擴展,字元序列 <newline> 被忽略,並且必須使用 \ 來引用字元 \、$ 和 ` .

引用自:https://unix.stackexchange.com/questions/328913