在 SSH 调用中使用函数的输出(本地定义)

在 SSH 调用中使用函数的输出(本地定义)

我创建了一个函数

function getqueue() {
    urlqueuename="urlcall"    
    ouput=`curl $urlqueuename`
    queue=$(echo $ouput | jq -r '.queueName')
    echo $queue
}

我正在使用脚本中的 ssh 调用,例如:

ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" $username@$IP<<EOF
queue=$(getqueue)
echo "Queue name : $queue"
EOF

但是队列为空,也尝试$(typeset -f)在远程调用中使用函数,但变量仍然为空

任何有关相同的指导将受到高度赞赏。

答案1

这里的文档没有被引用,这意味着变量扩展和命令替换是在文档形成时在本地进行的。在这种情况下,它不会达到预期的效果,因为它最终会像这样

queue=somevalue
echo "Queue name : "

也就是说,它将扩展为设置变量值的脚本queue,但由于变量也在 打印的字符串内扩展echo,因此它的正确值(在执行时)将永远不会显示。

ssh请注意,此扩展甚至在调用之前就已完成。

如果curl调用等需要在远程主机上进行(否则实际上没有理由发送此处文档脚本,或者ssh根本没有理由进行调用),然后引用此处文档。您可以通过使用来做到这一点<<'EOF'

然而,这也意味着该函数getqueue需要在远程脚本的环境中定义。您要么必须在此处文档中包含该函数,要么选择所需的部分。

由于该功能基本上只是做

curl urlcall | jq -r '.queueName'

你可以做

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

如果某些扩展需要在本地进行,而另一些则需要远程进行,那么引用此处文档,但转义$应远程扩展的内容。例如,

ssh user@server <<SCRIPT
remote_var=\$( something )

printf 'remote_var = "%s", local_var = "%s"\n' "\$remote_var" "$local_var"
SCRIPT

在上面的例子中,remote_var正在远程设置。我们无法在此处文档中分配值local_var(并且期望能够使用$local_var该值,原因与上面相同),但是调用printf将打印此处变量在此处时所具有的值-document 已展开(就在调用之前ssh)。

相关内容