Shell-Script
在 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)
在遠端呼叫中使用函式,但變數仍然是空的任何有關相同的指導將不勝感激。
here-document 未引用,這意味著在本地形成文件時會進行變數擴展和命令替換。在這種情況下,它不會產生預期的效果,因為它最終會像
queue=somevalue echo "Queue name : "
也就是說,它將擴展為設置
queue
變數值的腳本,但由於變數也在列印的字元串內擴展echo
,因此永遠不會顯示其正確值(在執行時)。請注意,此擴展甚至在
ssh
呼叫之前就已完成。如果
curl
呼叫等需要在遠端主機上進行(實際上沒有理由發送 here-document 腳本,或者根本沒有進行ssh
呼叫),然後引用 here-document。您可以使用<<'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
在 here-document 中分配一個值(並且期望能夠$local_var
與該值一起使用,原因與上述相同),但printf
呼叫將列印該變數在 here 時所具有的值-document 被擴展(就在呼叫之前ssh
)。