Проверить пароль пользователя с помощью сценария оболочки

Буквально, используя только cut:

echo Login: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f1)
echo Id: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f2 | cut -d  ')' -f1)
echo Group: $(id | cut -d ' ' -f2 | cut -d '(' -f2 | cut -d ')' -f1)
5
12.12.2016, 20:09
3 ответа

Нет полностью портативного способа проверить пароль пользователя. Для этого требуется привилегированный исполняемый файл, так что это не то, что вы можете создать с нуля. PAM , который используется в большинстве невстроенных систем Linux, а также во многих встроенных системах и большинстве других вариантов Unix, поставляется с двоичным файлом setuid, но у него нет прямого интерфейса оболочки, вам нужно пойти через стек PAM.

Вы можете использовать привязку PAM в Perl, Python или Ruby .

Вы можете установить одну из нескольких реализаций checkpassword .

Если пользователю разрешено запускать sudo для чего-либо, тогда sudo -kv запросит аутентификацию (если это не было отключено в конфигурации sudo). Но это не сработает, если нет правила sudoers относительно пользователя.

Вы можете запустить su . Это работает в большинстве реализаций. Вероятно, это лучший вариант в вашем случае.

if su -c true "$USER"; then
  echo "Correct password"
fi
5
27.01.2020, 20:37

Вы можете проверить правильность заданного локального пароля для данного имени пользователя с помощью теневого файла.

В большинстве современных дистрибутивов хешированные пароли хранятся в теневом файле / etc / shadow (который доступен для чтения только root). Как root, вытащите строку из теневого файла для данного пользователя следующим образом:

cat /etc/shadow | grep username

Вы увидите что-то вроде этого:

username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::

После имени пользователя стоит $ 1. Это указывает на то, что это хеш MD5. После этого идет еще один $, затем (в данном случае) TrOIigLp, за которым следует еще один $. TrOIigLp - это соль. Далее идет хешированный пароль, который был хеширован с помощью соли - в данном случае PUHL00kS5UY3CMVaiC0 / g0.

Теперь вы можете использовать openssl для хеширования заданного пароля с использованием той же соли, например:

openssl passwd -1 -salt TrOIigLp

Введите заданный пароль при появлении запроса, команда openssl должна вычислить хеш MD5, используя предоставленную соль, и он должен быть точно то же, что и выше из теневого файла. -1 в приведенной выше команде предназначен для хеширования MD5.

3
27.01.2020, 20:37

Вот относительно надежное решение, которое работает как с локальными, так и с удаленными пользователями и пытается аутентифицироваться по полному стеку PAM как пользователь, о котором идет речь, а не просто сравнивать хеши паролей.

#!/usr/bin/env ruby

require 'rpam'

username = ARGV[0]
password = ARGV[1]

if Rpam.auth(username, password, service: 'system-auth')
  puts 'authentication successful'
  exit 0
else
  puts 'authentication failure'
  exit 1
end

Чтобы запустить его: сохраните его как ./ Authenticate_as.rb , chmod + x ./authenticate_as.rb и ./ Authenticate_as.rb $ username $ password . Требуется Ruby и гем rpam, если это не было очевидно.

2
27.01.2020, 20:37

Теги

Похожие вопросы