shell脚本中ssh块上的环境变量

shell脚本中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

不执行参数和变量扩展、命令替换、算术扩展或路径名扩展单词。如果其中有任何字符单词被引用,分隔符是word去除引号的结果,并且这里文档中的行不被扩展。 如果单词 不加引号,此处文档的所有行都经过参数扩展、命令替换和算术扩展,字符序列 \<newline> 被忽略,并且必须使用 \ 来引用字符 \、$ 和 `

答案2

您的变量和子 shell 在通过 SSH 发送之前会被执行。您可以看到,如果将ssh命令替换为cat.您可以引用EOF以防止这种扩展(如 AlexP 的答案中突出显示的那样),或者,由于您已经scp在该步骤的上方执行了操作,因此您可以将其放入脚本中并在另一侧执行。

由于您在其中使用了 bash-isms,因此您可能需要考虑这一点,以防万一它被不使用bashshell 的人执行。

另外,grep可以处理文件,因此您不需要将文件放入其中,并且您的块命令cat上缺少目标。IS_NODE2scp

相关内容