원격 서버의 파일에서 한 줄을 jq하는 방법은 무엇입니까?

원격 서버의 파일에서 한 줄을 jq하는 방법은 무엇입니까?

원격 서버의 특정 라인을 확인하고 싶습니다. 지금까지 파일이 존재하는지 확인할 수 있습니다. 하지만 jq와 같은 도구를 사용하여 특정 행을 색인화할 수 있나요?

if ssh -q -i $pathToPem $sshUsernameIp [ -f ${remote_serial} ];

        then

            echo "Serial number is found externally"
            serialNumber=$(cat serialNumber.json | jq '.serialNumber')

            if ssh -q -i $pathToPem $sshUsernameIp [ "$serialNumber" == "${remote_serial | jq '.serialNumber'}" ];
                then
                    echo "Serial number is same"
                else
                    echo "Serial number is not same"
            fi
fi

출력>

Serial number is found externally
./test.sh: line 127: ${remote_serial | jq '.serialNumber'}: bad substitution

{} 내부에 변수를 전달하는 방법은 무엇입니까? scp를 사용하지 않고 이러한 로컬 파일과 원격 파일을 비교할 수 있습니까?

답변1

일을 복잡하게 할 필요가 없습니다. 원격 호스트에서 JSON을 가져와 전달한 jq다음 로컬에서 동일한 작업을 수행하세요. 그런 다음 비교하십시오. 원격 파일이 손실되면 오류가 발생하고(폐기 가능) 일련 번호가 다르게 비교됩니다(로컬 일련 번호도 손실되지 않는 한).

r_serial=$( ssh -q -i "$pathToPem" "$sshUsernameIp" cat "$remote_serial" 2>/dev/null | jq -r '.serialNumber' )
l_serial=$( jq -r '.serialNumber' serialNumber.json )

if [ "$r_serial" = "$l_serial" ]; then
    echo 'same'
else
    echo 'different (or missing)'
fi

이것이 $remote_serial원격 시스템에 있는 JSON 문서의 경로 이름이라고 가정합니다.

또한 호출 시 변수 확장에 대한 참조를 참고하세요 ssh.


발생하는 실제 오류는 다음과 같은 사실에서 비롯됩니다.

"${remote_serial | jq '.serialNumber'}"

유효한 변수 확장이 아닙니다. 다음과 같은 것을 사용하고 싶을 수도 있습니다.

"$( printf '%s\n' "$remote_serial" | jq '.serialNumber' )"

그러나 이는 $remote_serialJSON 문서의 내용이 포함되어 있다고 가정합니다.

답변2

그래야 할 것 같습니다

"$(echo ${remote_serial} | jq '.serialNumber')"

바꾸다

"${remote_serial | jq '.serialNumber'}"

관련 정보