Можно использовать command
команда для удаления специального поведения (посредством чего отказ заставляет оболочку выходить среди прочего) специального builtins в оболочках POSIX как ksh
или bash
.
Так:
if ! command . /my/file/source.ksh; then
echo >&2 ". failed"
exit 1
fi
Теперь, .
может перестать работать если /my/file/source.ksh
не может быть найден или не может быть открыт для чтения, или существует ошибка при чтении его или парсинге его, или последняя команда, выполненная в нем отказ возвратов.
Если Вы только хотите рассмотреть случай где source.ksh
не может быть открыто для чтения, можно использовать exec
(другое встроенное специальное предложение):
die() {
IFS=" "
printf >&2 'Error: %s\n' "$*"
exit 1
}
command exec 3< /my/file/source.ksh || die "Can't read the file"
command . /dev/fd/3
Или используйте eval
вместо .
:
code=$(cat /my/file/source.ksh) || die "Can't read the file"
eval "$code"
На Ubuntu/Debian mkpasswd
является частью пакета whois и реализуется в mkpasswd. c
, которая на самом деле является всего лишь сложной оберткой вокруг функции crypt()
в glibc, объявленной в unistd.h
. crypt() принимает два аргумента: пароль и соль. Пароль является "test" в данном случае, соль префиксована на "$6$" для SHA-512 хэша (см. SHA-крипт), поэтому в crypt() передаётся "$6$Zem197T4".
Возможно, вы заметили -R
опцию mkpasswd
, которая определяет количество раундов. В документе вы найдете 5000 раундов по умолчанию. Это первая подсказка, почему результат никогда не будет равен простому соединению соли и пароля, он не хэшируется только один раз. На самом деле, если вы пройдете -R 5000
, то получите тот же результат. В этом случае в crypt() передаётся "$6$ rounds=5000$Zem197T4", а реализация в glibc (это libc Debian/Ubuntu) извлекает из этого метода и количество раундов.
То, что происходит внутри crypt(), сложнее, чем просто вычислить один хэш, и в результате получается base64, закодированный в конце. Поэтому показанный результат содержит все виды символов после последнего '$', а не только [0-9a-f], как в типичной шестнадцатеричной строке хэша SHA-512. Алгоритм подробно описан в уже упомянутом SHA-Crypt документе.
Вся идея использования соленого пароля заключается в том, что каждый раз, когда вы генерируете хэш для одного и того же пароля, вы получаете другой результат. Это делается для того, чтобы избежать проблем с радужными таблицами.
Предположим, что один из ваших пользователей использует слабый пароль, скажем, 123456, ваш файл /etc/shadow был раскрыт. Теперь все, что нужно сделать злому хакеру, — это использовать радужную таблицу, чтобы вычислить слабый пароль и снова использовать его в других местах.