원격 서버의 특정 라인을 확인하고 싶습니다. 지금까지 파일이 존재하는지 확인할 수 있습니다. 하지만 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_serial
JSON 문서의 내용이 포함되어 있다고 가정합니다.
답변2
그래야 할 것 같습니다
"$(echo ${remote_serial} | jq '.serialNumber')"
바꾸다
"${remote_serial | jq '.serialNumber'}"