Shell-Script

在 SSH 呼叫中使用函式的輸出(本地定義)

  • March 3, 2018

我創建了一個函式

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)。

引用自:https://unix.stackexchange.com/questions/427845