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