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

관련 정보