5

我需要在同一个远程 ssh 命令中使用远程变量和本地变量

export CASSANDRA_DIR=/opt/cassandra

ssh root@sdi-prod-02 <<\EOF
  export READ=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= '{print $2}')
  echo "listen_address: $READ" to directory "$CASSANDRA_DIR"
EOF

$READ 变量工作正常,而 CASSANDRA_DIR 不工作。以下内容适用于 CASSANDRA_DIR

ssh root@sdi-prod-02 echo "directory=$CASSANDRA_DIR"

谢谢,院长

4

3 回答 3

10

应该在本地扩展什么,保持$原样,比如$foobar

您想要远程扩展的内容,您可以使用反斜杠:\$foobar

默认情况下,在here-docs中,变量是展开的。

前任。:

cat<< EOF
$UID
EOF

为避免在here-doc中扩展,您可以使用以下形式:

cat<< 'EOF'
$variable_that_will_not_been_expanded
EOF

或者你的:

cat<< \EOF
$variable_that_will_not_been_expanded
EOF

两者都有效。

于 2013-07-10T18:25:05.090 回答
1

如果您不想使用 here-doc,您可以这样做:

export CASSANDRA_DIR=/opt/cassandra

ssh root@sdi-prod-02 "
   export READ=\$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= \'{print \$2}\')
   echo \"listen_address: \$READ\" to directory \"$CASSANDRA_DIR\"
"
于 2013-07-10T18:31:46.523 回答
1

因此,我的最终结果效果很好(注意我将 \EOF 改为 EOF !!!!!然后转义远程变量

export CASSANDRA_DIR=/opt/cassandra

ssh root@sdi-prod-02 <<EOF
  export READ=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F= '{print $2}')
  echo "listen_address: \$READ to directory $CASSANDRA_DIR"
EOF

这一切都很好,因为 READ 是远程生成的,而 CASSANDRA_DIR 是我原始机器上的 var。

院长

于 2013-07-10T20:31:17.513 回答