출력이 일치하면 다음 명령을 실행하여 조건을 작성하고 싶습니다.
diff -is <(echo 'curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256') \
<(shasum -a 256 teleport-v9.3.4-linux-amd64-bin.tar.gz)
위 명령의 출력은 다음과 같습니다
< 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
> 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
이 경우 체크섬이 일치하므로 조건에 추가할 각 출력을 어떻게 선언할 수 있습니까? 예: 출력 a==출력 b이면 체크섬이 일치합니다. 누구든지 도움을 줄 수 있다면 좋을 것입니다.
답변 주셔서 감사합니다. 다음 답변을 사용해 보았고 요청한 작업을 수행할 수 있었습니다.
답변1
나는 shasum 이 의 출력을 diff
-ing하는 대신 자체 내장 "체크" 옵션( )을 사용하도록 할 것입니다 .*.sha256
shasum
shasum -c
실행 중:
$ echo "This is a file" > file1
$ echo "This is another file" > file2
$ shasum -a 256 file* | tee files.sha256
0b7d91193b9c0f5cc01d40332a10cf1ed338a41640bd7f045f1087628c1d7a9b file1
0290013ed1662eda102bee144a282ffe03d226b4dd9134c251c6b3be6d69d6ec file2
$ shasum -c files.sha256
file1: OK
file2: OK
$ echo $?
0
$ echo "damaged file" > file1
$ shasum -c files.sha256
file1: FAILED
file2: OK
shasum: WARNING: 1 computed checksum did NOT match
$ echo $?
1
이 스크립트를 작성하면 shasum -c의 종료 코드를 통해 확인 성공 여부를 알 수 있습니다.
따라서 귀하의 경우에는 다음을 수행합니다.
wget https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
shasum -c teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
rm teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
또는
shasum -c <(curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256)
답변2
URL과 파일 이름을 바꾼 후 실제로 실행하는 명령은 다음과 같습니다.
diff -is <(echo `curl "$url"`) <(shasum -a 256 "$file")
^ ^
이는 echo `curl...`
게시물(*)과 같은 작은따옴표가 아닌 백틱입니다. 따옴표가 없는 명령 대체를 통해 전달된 출력은 curl
두 개의 개별 인수를 제공한 echo
다음 공백으로 연결하여 토큰화를 적용합니다. 파일의 이중 공백을 단일 공백으로 효과적으로 변경합니다.
curl https://...
(* 작은따옴표를 사용하면 명령으로 실행되지 않고 출력됩니다 )
바라보다:
이것이 출력이 제공되는 이유이기도 합니다 diff
. 행은 단일 공백만큼만 다릅니다.
쓸모없는 명령 대체를 제거하고 실행하면
diff -is <(curl "$url") <(shasum -a 256 "$file")
대신, 파일을 동일한 것으로 인식하고 -s
. 그런 다음 diff
인쇄된 출력에 신경 쓰지 않고 종료 상태를 직접 사용할 수 있습니다 .
if diff -iq <(curl "$url") <(shasum -a 256 "$file") > /dev/null; then
echo "hashes are the same"
else
echo "hashes differ"
fi
diff
대소문자를 무시하는 기능 외에는 필요하지 않지만 꼭 필요한 것은 아니라고 생각합니다. 출력을 쉘 변수에 저장하고 비교할 수 있습니다.
their=$(curl "$url")
mine=$(shasum -a 256 "$file")
if [[ "$their" == "$mine" ]]; then
echo "hashes match"
else
echo "hashes do not match"
fi
또는 초기 부분을 해시와 비교하려는 경우:
their=$(curl "$url")
their=${their%% *}
mine=$(shasum -a 256 "$file")
mine=${mine%% *}
if [[ "$their" == "$mine" ]]; then
...
아니면 심지어 같은 것
read -r hash1 filename1 < <(curl "$url")
etc.
출력의 두 필드를 별도의 변수로 읽습니다.