【问题标题】:Unable to use local and remote variables within a heredoc or command over SSH无法在 heredoc 或通过 SSH 的命令中使用本地和远程变量
【发布时间】:2020-06-02 18:00:15
【问题描述】:

以下是使用heredoc 的ssh 脚本示例(实际脚本更复杂)。是否可以在 SSH heredoc 或命令中同时使用本地和远程变量?

FILE_NAME 设置在本地服务器上以在远程服务器上使用。 REMOTE_PID 在远程服务器上运行时设置为在本地服务器上使用。 FILE_NAME 在脚本中被识别。 REMOTE_PID 未设置。

如果将EOF 更改为'EOF',则设置REMOTE_PID 而未设置`FILE_NAME。我不明白这是为什么?

有没有一种方法可以同时识别REMOTE_PIDFILE_NAME

正在使用 bash 的第 2 版。默认远程登录为cshell,本地脚本为bash。

FILE_NAME=/example/pdi.dat
ssh user@host bash << EOF
# run script with output...
REMOTE_PID=$(cat $FILE_NAME)
echo $REMOTE_PID
EOF
echo $REMOTE_PID

【问题讨论】:

    标签: linux bash ssh


    【解决方案1】:

    如果您不想扩展变量,则需要转义 $ 符号:

    $ x=abc
    $ bash <<EOF
    > x=def
    > echo $x   # This expands x before sending it to bash. Bash will see only "echo abc"
    > echo \$x  # This lets bash perform the expansion. Bash will see "echo $x"
    > EOF
    abc
    def
    

    所以在你的情况下:

    ssh user@host bash << EOF
    # run script with output...
    REMOTE_PID=$(cat $FILE_NAME)
    echo \$REMOTE_PID
    EOF
    

    或者你也可以只使用带单引号的herestring:

    $ x=abc
    $ bash <<< '
    > x=def
    > echo $x  # This will not expand, because we are inside single quotes
    > '
    def
    

    【讨论】:

    • 我认为如果您将Y 更改为X,差异会更明显。
    • 如果 echo $X 在第二个 EOF 之后运行,应该显示什么?是否可以在heredoc中设置变量并在外部使用?
    【解决方案2】:
    remote_user_name=user
    instance_ip=127.0.0.1
    external=$(ls /home/)
    
    ssh -T -i ${private_key}  -l ${remote_user_name} ${instance_ip} << END
      internal=\$(ls /home/)
      echo "\${internal}"
      echo "${external}"
    END
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。 From Review
    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2015-01-07
    • 1970-01-01
    • 2015-03-07
    • 2012-07-18
    • 2011-03-19
    相关资源
    最近更新 更多