#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
из командной строки