Aji*_*ran 4 ssh shell-script quoting here-document
我创建了一个函数
function getqueue() {
urlqueuename="urlcall"
ouput=`curl $urlqueuename`
queue=$(echo $ouput | jq -r '.queueName')
echo $queue
}
Run Code Online (Sandbox Code Playgroud)
我正在使用脚本中的 ssh 调用,例如:
ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" $username@$IP<<EOF
queue=$(getqueue)
echo "Queue name : $queue"
EOF
Run Code Online (Sandbox Code Playgroud)
但是队列为空,也尝试$(typeset -f)在远程调用中使用函数,但变量仍然为空
任何有关相同的指导将不胜感激。
here-document 未加引号,这意味着在本地形成文档时进行变量扩展和命令替换。在这种情况下,它不会产生预期的效果,因为它最终会像
queue=somevalue
echo "Queue name : "
Run Code Online (Sandbox Code Playgroud)
也就是说,它将扩展为设置queue变量值的脚本,但由于变量也在 打印的字符串内扩展echo,因此永远不会显示其正确值(在执行时)。
请注意,此扩展甚至在ssh调用之前就已完成。
如果curl调用等需要在远程主机上发生(否则真的没有理由发送 here-document 脚本,或者根本不进行ssh调用),然后引用 here-document。您可以通过使用<<'EOF'.
但是,这也意味着getqueue需要在远程脚本的环境中定义该函数。您要么必须在此处的文档中包含该功能,要么选择所需的位。
由于该功能基本上只是在做
curl urlcall | jq -r '.queueName'
Run Code Online (Sandbox Code Playgroud)
你可以
ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" "$username@$IP" <<'REMOTE_SCRIPT'
queue=$(curl urlcall | jq -r '.queueName')
printf 'The queue name is "%s"\n' "$queue"
REMOTE_SCRIPT
Run Code Online (Sandbox Code Playgroud)
如果某些扩展需要在本地进行而其他扩展需要在远程进行,则不要引用此处的文档,而是转义$应该远程扩展的内容。例如,
ssh user@server <<SCRIPT
remote_var=\$( something )
printf 'remote_var = "%s", local_var = "%s"\n' "\$remote_var" "$local_var"
SCRIPT
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,remote_var是远程设置的。我们不能local_var在 here-document 中赋值(并期望能够使用$local_var该值,原因与上述相同),但printf调用将打印变量在 here 时的值-document 已扩展(就在调用 之前ssh)。
| 归档时间: |
|
| 查看次数: |
1171 次 |
| 最近记录: |