我有以下功能:
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,因此您可能需要考虑这一点,以防万一它被不使用bash
shell 的人执行。
另外,grep
可以处理文件,因此您不需要将文件放入其中,并且您的块命令cat
上缺少目标。IS_NODE2
scp