두 번째 방법

두 번째 방법

같은 디렉토리에 있는 똑같은 파일을 사용하여 다른 md5sum을 얻었기 때문에 이상하다고 생각합니다. 출력은 다음과 같습니다.

[root@testlabs Config]# ls  
Backup_Files  
hostname1-config.uac  
hostname2-config.uac  
hostname3-config.uac  
[root@testlabs Config]# ls hostname1-config.uac | md5sum  
2a52f0eb11f6478a4f8aeee1c0ac90dd  -      
[root@testlabs Config]# md5sum hostname1-config.uac  
d41d8cd98f00b204e9800998ecf8427e  hostname1-config.uac  

올바른 md5sum 결과를 얻을 수 있는 방법을 알 수 있습니까? 감사해요.

두 파일(원본 파일과 백업 복사본 파일)의 MD5를 비교하기 위해 이 작업을 수행하고 있습니다. 원래 파일 이름 지정 규칙은 호스트 이름1-config.uac이고 백업 파일 이름은 호스트 이름1-201411071649.uac이지만 복사본일 뿐입니다(cp -p).

첫 번째 방법

(작동하지 않음)

 #!/bin/bash
 # ...
 #
 ls hostname1-config.uac | md5sum hostname1-config.uac > /tmp/md5sum.tmp
 ARCHIVE_DIR="/tmp/Archive"
 FULL_HOSTNAME=`/bin/sort -d /tmp/full_hostname.tmp`
 TIMESTAMP=`/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME`

 for HOSTNAME in `/bin/sort -d /tmp/hostname.tmp`
 do
     ls $ARCHIVE_DIR | grep -i --text $HOSTNAME-$TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp
 done

두 번째 방법

(명령줄에서는 완벽하게 작동하지만 스크립트에서는 작동하지 않음)

명령줄에서

[root@testlabs Config]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Config]# md5sum hostname1-config.uac > md5.tmp
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Archive]# echo 'Tampered!' > hostname1-config.uac
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -     c /Network_Backup/Config/md5.tmp
hostname1-config.uac: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@testlabs Archive]# rm -f hostname1-config.uac
[root@testlabs Archive]# cd /tmp/Config
[root@testlabs Config]# cp -p hostname1-config.uac /tmp/Archive
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -c /Network_Backup/Config/md5.tmp
hostname1-config.uac: OK

스크립트에서

#!/bin/bash
# ...
#
CONFIG_DIR="/tmp/Config"
ARCHIVE_DIR="/tmp/Archive"
HOSTNAME=`/bin/sort -d /tmp/hostname.tmp`
FULL_HOSTNAME=`/bin/sort -d /tmp/full_hostname.tmp`
TIMESTAMP=`/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME`

cd $CONFIG_DIR
md5sum $FULL_HOSTNAME > /tmp/md5sum.tmp
cd $ARCHIVE_DIR
cat $HOSTNAME-$FILE_TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp

/tmp/md5sum2.tmp에 반환된 결과:
호스트 이름1-config.uac: 열기 또는 읽기 실패

답변1

후자의. 이것을 실행하면 파일 내용의 md5sum이 아니라 ls file | md5sum문자열의 md5sum을 얻습니다 .file\n

일반적으로 귀하는안 돼요통과 파일을 사용하여 ls file | command요구 사항을 충족할 수 있는 경우는 거의 없습니다 . 명령에 대한 파일 이름을 지정하고 해당 명령이 파일에 대해 일부 작업을 수행할 것으로 예상하는 경우 해당 명령을 인수로 제공할 수 있습니다.

command file

따라서 이 경우에는 md5sum다음을 실행해야 합니다.

$ md5sum hostname1-config.uac

답변2

FAILED 열기 또는 읽기 응답은 md5 체크섬 파일(귀하의 경우 md5sum.tmp)에 지정된 파일이 존재하지 않을 때 발생합니다.

예를 들어.

[user@localhost tmp]$ cd /tmp/testfolder
[user@localhost testfolder]$ touch dog
[user@localhost testfolder]$ md5sum dog > /tmp/md5sum.tmp
[user@localhost testfolder]$ md5sum -c /tmp/md5sum.tmp
dog: OK
[user@localhost testfolder]$ cd ..
[user@localhost tmp]$ md5sum -c /tmp/md5sum.tmp
md5sum: dog: No such file or directory
dog: FAILED open or read
md5sum: WARNING: 1 listed file could not be read

나는 md5sum 프로그램이 -c 옵션을 전달할 때 표준 입력을 보지 않는다고 생각합니다. -c 옵션으로 지정된 파일의 체크섬만 살펴봅니다. 존재하고 파일 이름이 일치하면 파일을 비교하고 모든 것이 정상입니다.

더 나은 방법이 있을 수 있지만 두 개의 별도 md5sum 결과를 변수에 저장한 다음 이를 if 문과 비교하는 것이 아마도 제가 취할 접근 방식일 것입니다.

이 같은.

#!/bin/bash
firstfile=`cat dog | md5sum `
# alternately could have used firstfile=$(md5sum < dog ) to ovoid UUOC
secondfile=`cat mouse | md5sum `
if [ "$firstfile" == "$secondfile" ]; then
    echo "They Match!"
else
    echo "They Don't Match!"
fi

관련 정보