ssh和环境变量远程和本地

时间:2013-07-10 18:20:56

标签: bash ssh

我需要在同一个远程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

当CASSANDRA_DIR不工作时,$ READ变量工作正常。以下适用于CASSANDRA_DIR

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

感谢, 迪安

3 个答案:

答案 0 :(得分:9)

应该在本地展开什么,保持原样$,例如$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

两者都有效。

答案 1 :(得分: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\"
"

答案 2 :(得分: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。

迪安