【问题标题】:How to pass local variable to remote using ssh and bash script?如何使用 ssh 和 bash 脚本将本地变量传递给远程?
【发布时间】:2013-03-24 14:11:03
【问题描述】:
ssh remotecluster 'bash -s' << EOF
> export TEST="sdfsd"
> echo $TEST
> EOF

这不打印任何内容。

即使我将变量存储到文件中并将其复制到远程,它仍然不起作用。

TEST="sdfsdf"
echo $TEST > temp.par
scp temp.par remotecluster
ssh remotecluster 'bash -s' << EOF
> export test2=`cat temp.par`
> echo $test2
> EOF

仍然没有打印。

所以我的问题是如何将局部变量作为变量传递给远程机器?

答案已在this 中给出

【问题讨论】:

    标签: linux bash unix ssh cluster-computing


    【解决方案1】:

    这里文档中给出的变量赋值TEST="sdfsd"不是真正的变量赋值,即。 e.变量赋值实际上不会直接在 here 文档的声明/定义中执行(但稍后当 here 文档被 shell 评估时)。

    此外,未转义或未引用的此处文档中包含的$TEST 变量将在本地shell 执行ssh 命令之前由本地shell 展开。 结果是如果$TEST 没有在本地shell之前 ssh 命令或here 文档中分别定义,则$TEST 将被解析为空字符串。

    因此,这里文档中的变量赋值export TEST="sdfsd"在本地shell中不会生效,而是先发送到远程主机的shell,然后才展开,所以你的什么都不打印 经验。

    解决方案是使用转义或单引号的此处文档,&lt;&lt;\EOF&lt;&lt;'EOF';或者只转义此处文档中的\$TEST 变量;或者只是在ssh 命令之前定义$TEST 变量(以及此处的文档)。

    # prints sdfsd
    export TEST="sdfsd"
    ssh localhost 'bash -s' << EOF
    echo $TEST
    EOF
    
    # prints sdfsd
    ssh localhost 'bash -s' << EOF
    export TEST="sdfsd"
    echo \$TEST
    EOF
    
    # prints sdfsd
    ssh localhost 'bash -s' <<'EOF'
    export TEST="sdfsd"
    echo $TEST
    EOF
    

    【讨论】:

      【解决方案2】:

      导出变量,ssh 将导出的(环境)变量发送到服务器 导出 VAR=测试 ssh -v 127.0.0.1 echo $VAR 测试上述命令并查看结果

      【讨论】:

      • 远程服务器必须配置为允许本地环境发送到远程会话。
      猜你喜欢
      • 2011-10-08
      • 2012-07-18
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多