微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在远程 ssh 命令中使用变量

如何解决无法在远程 ssh 命令中使用变量

想要通过从我的本地执行脚本在我的远程服务器中创建一个目录,但没有在远程 VM 上创建预期的目录,也没有给出错误消息。

我尝试使用 \ 对变量进行转义,将变量用单引号和双引号括起来,但没有成功..

我错过了什么?

#!/bin/bash

password="mypassword"
remote_ip="10.28.28.28"
dir_to_create="/home/rocket/DjangoDir"


sshpass -p ${password} ssh -q -tt user@${remote_ip} << 'EOT'
    mkdir -p \$dir_to_create
  exit
EOT

另外,尝试了 "\$dir_to_create"\"$dir_to_create"\"${dir_to_create}"

解决方法

在带有引号分隔符的 here 文档中不会执行变量扩展。使用不带引号的分隔符来允许扩展。

因为远程 shell 会重新解析表达式,所以请记住正确引用变量。远程可能不会在远程端执行 shell - 显式执行您的 shell 并从 stdin 读取。记得引用变量扩展:

ssh "user@${remote_ip}" 'bash -s' <<EOT
mkdir -p $(printf "%q" "$dir_to_create")
EOT

正确传递正确引用的变量是一项艰巨的工作。不要自己动手 - 使用 bash 功能。对我来说,将本地定义的工作传输到远程上下文的最稳定且易于使用的功能是使用函数:

func() {
    mkdir -p "$dir_to_create"
}
ssh "user@${remote_ip}" 'bash -s' <<EOT
$(declare -p dir_to_create) # transfer variables values
$(declare -f func)          # transfer function definition
func                        # call the function
EOT

请研究:在 shell 中引用 - 使用什么,它是什么意思,它的作用是什么。研究 declare - 它有什么作用。研究此处的文档 - 带引号的终止词 <<'EOT' 与不带引号的 <<EOT 有何不同。使用 http://shellcheck.net 检查您的脚本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。