AppleScript и MD5

#shell #command #applescript #md5

#оболочка #команда #applescript #md5

Вопрос:

Я просто пытаюсь вычислить MD5 строки с помощью AppleScript:

 set hash_string to do shell script "echo -n hi | md5"
  

В приведенном выше коде я фактически заменил строку, переданную в оболочку, на «hi» в качестве теста. Отчеты AppleScript:

 tell current application
    do shell script "echo -n hi | md5"
        --> "5ea3a74c5a5c60abd09da8c5f85fa0a5"
end tell
  

Выполнение той же команды непосредственно в терминале приводит к:

 % echo -n hi | md5
49f68a5c8493ec2c0bf489821c21fc3b
  

Хотя команда идентична, вычисляемый хэш отличается. Очевидно, что в AppleScript передаются дополнительные символы, но, похоже, я не могу понять, что это такое. Я ценю любые рекомендации.

Ответ №1:

Вы можете увидеть, что происходит, если удалите | md5 . В случае с AppleScript вы увидите -n hi в качестве выходных данных. Это потому, что POSIX sh echo , который вызывается do shell script , не поддерживает, -n тогда как все встроенные элементы bash or csh echo или /bin/echo команда поддерживают -n .

 $ bash
$ echo -n hi
hi$ sh
$ echo -n hi
-n hi
  

Смотрите справочную страницу echo Mac OS X или документацию POSIX для echo получения дополнительной информации. Внимание, в POSIX соответствия требует, чтобы соответствующие реализации echo должны не поддерживать любые варианты, в том числе -n , для совместимости между орудий и систем, в POSIX редакторы предлагают использовать printf для подавления строки.

 tell current application
    do shell script "printf '%s' hi | md5"
end tell
--> "49f68a5c8493ec2c0bf489821c21fc3b"
  

Комментарии:

1. Большое спасибо. Это имеет полный смысл.

2. Рад, что это помогло. Кстати, добро пожаловать в SO. Если вы задаете вопрос здесь, ожидается, что вы либо отметите ответ как принятый, либо пересмотрите свой вопрос, пока не получите приемлемый ответ.

Ответ №2:

Если вы удалите -n из команды echo, то она должна работать нормально. Не совсем уверен, почему… но это, кажется, все исправит!

Ответ №3:

это работает

 set passwordPlain to "hi"
set foo to do shell script "/sbin/md5 -qs" amp; passwordPlain
return foo
  

это приводит к тому же, что и

  echo -n hi | md5 
  

из командной строки