У меня была такая же ошибка на моем Mac.
paste -sd,
уход:
cut -f"$(grep -wFf LIST.TXT TMP | cut -f1 | paste -sd,)" DATA.TXT
Но используйте решение awk, оно намного аккуратнее и не использует файл tmp, а также гораздо более щадяще относится к пробелам:
awk -v OFS='\t' '
NR == FNR {header[$1] = 1; next}
FNR == 1 {for (i=1; i<=NF; i++) if ($i in header) column[i] = 1}
{for (i in column) printf "%s" OFS, $i; print ""}
' headers file
Немного поигравшись, работающий конвейер (whiteout, требующий tmp-файла ), это
cut -f"$(head -1 DATA.TXT | tr '\t' '\n' | nl | grep -Fwf LIST.TXT | awk '{print $1}' | paste -sd,)" DATA.TXT
mkpasswd
требует также соли , в противном случае она генерируется для вас каждый раз, когда вы ее запускаете. Если вы деконструируете исходную строку, используя $ в качестве разделителей, вы увидите метод хэширования6 и nxIRLUXhRQlj
как соль.
Если мы добавим соль к mkpasswd
во время работы, вы получите правильный результат за один раз.
$ mkpasswd -m sha-512 "test" "nxIRLUXhRQlj"
$6$nxIRLUXhRQlj$t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.
Использование соли предотвращает атаку радужной таблицы , поскольку она добавляет к паролю случайную часть перед его хешированием.
Хэш пароля (, подобный тому, который вы ввели в myhash
), содержит некоторые метаданные, указывающие, какая хеш-функция используется и с какими параметрами, такими как стоимость, соль и выходные данные хеш-функции. В современном формате хэша пароля Unix части разделены$
:
6
указывает на Unix итерированный метод SHA -512 (, который похож, но не идентичен PBKDF2). nxIRLUXhRQlj
— соль. t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU.
— ожидаемый результат. При каждом запуске mkpasswd -m sha-512
создается хэш пароля со случайной солью. Таким образом, каждый запуск этой команды производит другой вывод.
Когда вы вводите пароль, система вычисляет iterated_sha512(default_cost, "nxIRLUXhRQlj", typed_password)
и проверяет, соответствует ли результат "t29nGt1moX3KcuFZmRwUjdiS9pcLWpqKhAY0Y0bp2pqs3fPrnVAXKKbLfyZcvkkcwcbr2Abc8sBZBXI9UaguU."
.
То, что делает ваша программа, отличается :вы генерируете случайную соль, затем сравниваете ее и вывод функции хеширования пароля с myhash
. Это срабатывает только в том случае, если вам удалось сгенерировать одну и ту же соль, что имеет пренебрежимо малую вероятность (того, что ваш компьютер не сгенерирует одну и ту же соль дважды в течение вашей жизни ). Но вам не нужно угадывать соль :, она находится прямо в хэше пароля.
Рекомендуем прочитать:Как безопасно хэшировать пароли?