Сценарий:
В сценарии bash я должен проверить, является ли пароль, заданный пользователем, допустимым паролем пользователя.
Предположим, у меня есть пользователь A с паролем PA .. В сценарии я попросил пользователя A ввести его пароль. Итак, как проверить, действительно ли введенная строка является его паролем? ... [!d3 ]
Вы можете использовать sudo для этого. sudo имеет опцию -l для проверки привилегий sudo, которые пользователь имеет, и -S для чтения в пароле из stdin. Однако независимо от того, какой уровень привилегий у пользователя есть, если он успешно прошел проверку подлинности, sudo возвращается с статусом завершения 0. Таким образом, вы можете принять любой другой статус выхода в качестве индикатора того, что аутентификация не сработала (если предположить, что sudo
Что-то вроде:
#! /bin/bash
IFS= read -rs PASSWD
sudo -k
if sudo -lS &> /dev/null << EOF
$PASSWD
EOF
then
echo 'Correct password.'
else
echo 'Wrong password.'
fi
Этот сценарий немного зависит от того, конфигурации sudoers. Я предполагал установку по умолчанию. Вещи, которые могут привести к сбою:
targetpw или runaspw установлено listpw is never и т. Д.Другие проблемы включают (спасибо Eliah):
targetpw или runaspw установлено sudo должно выполняться как пользователь, для которого вы аутентифицируетесь. Если у вас нет привилегий sudo, чтобы вы могли запускать sudo -u foo sudo -lS, это означает, что вам нужно будет запустить сценарий в качестве целевого пользователя.Теперь, причина, по которой я здесь использовал, - это препятствовать подслушиванию. Переменная, используемая как часть командной строки, легче обнаружить с помощью top или ps или других инструментов для проверки процессов.
Другой способ (возможно, более интересен для его теоретического содержания, чем для его пратических приложений).
Пользовательские пароли хранятся в /etc/shadow.
Пароли, хранящиеся здесь, зашифрованы, в последних выпусках Ubuntu с использованием SHA-512.
В частности, при создании пароля пароль в открытом тексте солен и зашифрован через SHA-512.
Одно из решений было бы тогда солить / зашифровать данный пароль и сопоставить его с зашифрованным паролем пользователя, хранящимся в записи /etc/shadow данного пользователя.
Чтобы быстро описать, как пароли хранятся в каждой записи пользователя /etc/shadow , вот пример /etc/shadow для пользователя foo с паролем bar:
foo:$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/:16566:0:99999:7:::
foo: имя пользователя 6: тип шифрования пароля lWS1oJnmDlaXrx1F: соль шифрования пароля [ f18]: SHA-512 засоленный / зашифрованный пароль Чтобы соответствовать данному паролю bar для данного пользователя foo, первое, что нужно сделать, это получить соль:
$ sudo getent shadow foo | cut -d$ -f3
lWS1oJnmDlaXrx1F
Затем следует получить полную соль ed / encrypted password:
$ sudo getent shadow foo | cut -d: -f2
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/
Затем данный пароль можно солить / зашифровать и сопоставить с паролем засоленного / зашифрованного пользователя, хранящимся в /etc/shadow:
$ python -c 'import crypt; print crypt.crypt("bar", "$6$lWS1oJnmDlaXrx1F")'
$6$lWS1oJnmDlaXrx1F$h4vuzZVBwIE1Z6vT7N.spwbxYig9e/OHOIH.VDv9JPaC3.OtTusPFzma7g.R/oSZFW5QOI7IDdDY01G0zTGQE/
Они совпадение! Все, что помещено в скрипт bash:
#!/bin/bash
read -p "Username >" username
IFS= read -p "Password >" password
salt=$(sudo getent shadow $username | cut -d$ -f3)
epassword=$(sudo getent shadow $username | cut -d: -f2)
match=$(python -c 'import crypt; print crypt.crypt("'"${password}"'", "$6$'${salt}'")')
[ ${match} == ${epassword} ] && echo "Password matches" || echo "Password doesn't match"
Выход:
$ ./script.sh
Username >foo
Password >bar
Password matches
$ ./script.sh
Username >foo
Password >bar1
Password doesn't match