ssh命令无法返回在远程计算机上执行的结果

时间:2017-05-19 03:28:26

标签: shell jenkins ssh

当我使用ssh在shell脚本中执行远程文件时,我可以在远程机器上执行结果,但是,遇到了无法识别用户定义变量的问题。

  1. 我像这样创建了一个shell脚本run.sh

    #!/bin/bash
    ssh jenkins@10.122.214.55 << EOF
    ./test.sh && ret=1 || ret=0 
    echo "before" 
    echo ${ret}
    echo "after"
    echo ${HOME}
    exit ${ret}
    EOF
    
  2. run.sh:

    调用的test.sh的内容
    #!/bin/bash
    echo "lala"
    exit 1
    
  3. 当我打电话给./run.sh 它像这样打印

    lala
    before
    
    after
    /home/jenkins
    
  4. 为什么它不回显${ret}?调用./run.sh后,回显$?是0这是意外的,我认为它应该在这里回应1。 谢谢!

1 个答案:

答案 0 :(得分:2)

因为heredoc中的变量在被发送到ssh的标准输入之前被本地脚本扩展。

换句话说,你的heredoc与

的行为相似
#!/bin/bash
string="echo \"before\"
echo ${ret}
echo \"after\"
echo ${HOME}
exit ${ret}
./test.sh && ret=1 || ret=0"
echo "$string" | ssh jenkins@10.122.214.55

这使得字符串具有内插变量更为明显。

有几种解决方法:要么你可以转义$符号(例如echo \${ret}),以便传递预期的字符串,或者你可以使用逐字的heredoc

#!/bin/bash
ssh jenkins@10.122.214.55 <<'EOF'
./test.sh && ret=1 || ret=0
echo "before"
echo ${ret}
echo "after"
echo ${HOME}
exit ${ret}
EOF

通过单引号分隔符,我们确保在heredoc内部不会发生扩展。