繁体   English   中英

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

[英]Unable to use variables in remote ssh command

想要通过从我的本地执行脚本在我的远程服务器中创建一个目录,但没有在远程 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功能。 对我来说,将本地定义的工作转移到远程上下文的最佳稳定且易于使用的功能是使用 function:

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检查您的脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM