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リモートホストから呼び出しなどを行う必要がある場合(そうでない場合は、実際にdoc-hereスクリプトを送信する理由がないか、呼び出すssh理由がまったくありません)、doc-hereを参照してください。を使用してこれを行うことができます<<'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_varprintfssh

関連情報