2009-08-19 3 views
6

Любой знает, почему BSD md5 программа производит вывод хэш в этом формате ...BSD md5 vs GNU md5sum формат вывода?

MD5 (checksum.md5) = 9eb7a54d24dbf6a2eb9f7ce7a1853cd0 

... в то время как GNU md5sum производит гораздо более разумный формат, как это?

9eb7a54d24dbf6a2eb9f7ce7a1853cd0 checksum.md5 

Насколько я могу судить, формат md5sum намного проще разбирать и имеет больше смысла. Как вы делаете md5sum -check с md5? А что означают опции -p, -q, -r, -t, -x? man md5 ничего не говорит об этих вариантах! : |

+0

может идти либо на poweruser/serverfault, но на самом деле не принадлежит. – spender

+3

... или это суперпользователь? Я никогда не помню – spender

+0

'md5 -r' произведет нечто, похожее на' md5sum' (контрольная сумма, затем имя файла). Например, 'find. -тип f -print0 | xargs -0 md5 -r' перечисляет контрольные суммы md5 для всех ваших файлов. – Dave

ответ

4

Исторические причины, я думаю. Между тем, -q подавляет «MD5 (...) =» вывод, поэтому md5 -q checksum.md5 дает

9eb7a54d24dbf6a2eb9f7ce7a1853cd0

Это подразумевается, если md5 не дано никаких аргументов, и он читается из stdin. К сожалению md5sum в этом случае оставляет «-» за контрольную сумму («9eb7a54d24dbf6a2eb9f7ce7a1853cd0 -»), так что если вы ищете какой-то родовой функции вернуть контрольную сумму, вот что может помочь:

 
checksum() { 
     (md5sum <"$1"; test $? = 127 && md5 <"$1") | cut -d' ' -f1 
} 
checksum /etc/hosts 

страницу человека в FreeBSD говорит об аргументах

 -p  Echo stdin to stdout and append the checksum to stdout.

-q  Quiet mode ‐ only the checksum is printed out. Overrides the -r 
     option. 

-r  Reverses the format of the output. This helps with visual diffs. 
     Does nothing when combined with the -ptx options. 

-t  Run a built‐in time trial. 

-x  Run a built‐in test script. 

0

можно использовать GNU md5sum -c checksum.md5, которая будет искать checksum файл и проверить на содержание checksum.md5 файла.

md5sum -c checksum.md5 | grep "checksum: OK" -

Пример внутри системного вызова Ruby, чтобы проверить против BSD отформатирован .md5 файл:

system("md5sum -c checksum.md5 | grep \"checksum: OK\" -")

Это возвращает истину или ложь.

2

Я понимаю, что это старая страница, но я делаю контрольные суммы на FreeBSD и проверяю их на Linux, и я тоже натолкнулся на эту страницу. Эта страница не помогла мне решить эту проблему, так что я пришел с этим небольшими sed скриптом для создания контрольных сумм на FreeBSD, которые соответствуют выходу Linux md5sum:

md5 file [file ...] | sed -e 's#^MD5 [(]\(.*\)[)] = \(.*\)$#\2 \1#' > md5sums.txt 

Это будет использовать команду FreeBSD md5 и переставить вывод выглядит как GNU md5sum.

Тогда на Linux я могу просто использовать md5sum --check md5sums.txt

Вы также можете использовать выше sed сценарий с существующим файлом создаваемого md5 командой FreeBSD.

Я также поставил этот псевдоним в моем .cshrc файл FreeBSD:

alias md5sum "md5 \!* | sed -e '"'s#MD5 [(]\(.*\)[)] = \(.*\)$#\2 \1#'"'" 

теперь FreeBSD я могу только сказать, md5sum file1 file2 file3 ... и он просто работает.

+0

сценарий sed дал мне меньше места, чем GNU md5sum на centos6. NBD, но «diff» не работал, слегка не массируя его. –

3

В текущей системе OS X BSD вы можете указать команду md5 -r, чтобы получить ожидаемый результат.

[email protected]:/vms/DevOps-v3.4$ md5 vmware* 
MD5 (vmware-0.log) = 61ba1d68a144023111539abee08f4044 
MD5 (vmware-1.log) = 97bc6f22b25833c3eca2b2cc40b83ecf 
MD5 (vmware-2.log) = f92a281102710c4528d4ceb88aa0ac9b 
MD5 (vmware.log) = 1f7858d361929d4bc5739931a075c0ad 

Добавление md5 -r переключатель сделал выходной вид более, как я ожидал, и проще дифф с Linux md5 суммы, которые были произведены из машины Linux.

[email protected]:/vms/DevOps-v3.4$ md5 -r vmware* 
61ba1d68a144023111539abee08f4044 vmware-0.log 
97bc6f22b25833c3eca2b2cc40b83ecf vmware-1.log 
f92a281102710c4528d4ceb88aa0ac9b vmware-2.log 
1f7858d361929d4bc5739931a075c0ad vmware.log 

Это был самый простой подход для меня, чтобы сделать это легко дифф от вывода, генерируемого md5sum команды на поле Linux.