проверьте имя пользователя и пароль unix в шеллскрипте - PullRequest
5 голосов
/ 22 сентября 2009

Я хочу проверить в сценарии оболочки, правильно ли переданы имя пользователя и пароль локального пользователя unix. Какой самый простой способ сделать это?

Единственное, что я обнаружил, когда гуглял, использовал «ожидание» и «су», а затем как-то проверял, успешно ли «су» или нет.

Ответы [ 4 ]

8 голосов
/ 22 сентября 2009

имя пользователя и пароли записываются в файл /etc/shadow. просто получите оттуда пользователя и хэш пароля (sed поможет), хешируйте свой пароль и проверьте.

используйте mkpasswd для генерации хеша. Вы должны посмотреть, какую соль использует ваша версия. самая новая тень использует sha-512, поэтому:

mkpasswd -m sha-512 password salt

man-страницы могут вам сильно помочь.

Проще было бы использовать php и модуль pam-aut. там вы можете проверить vie php на групповом доступе пользователя pwd.

4 голосов
/ 01 октября 2009

Хорошо, теперь это сценарий, который я использовал для решения своей проблемы. Сначала я попытался написать небольшую c-программу, предложенную Аароном Дигуллой, но это оказалось слишком сложным.

Возможно, этот скрипт пригодится кому-то еще.

#!/bin/bash
#
# login.sh $USERNAME $PASSWORD

#this script doesn't work if it is run as root, since then we don't have to specify a pw for 'su'
if [ $(id -u) -eq 0 ]; then
        echo "This script can't be run as root." 1>&2
        exit 1
fi

if [ ! $# -eq 2 ]; then
        echo "Wrong Number of Arguments (expected 2, got $#)" 1>&2
        exit 1
fi

USERNAME=$1
PASSWORD=$2

# Setting the language to English for the expected "Password:" string, see http://askubuntu.com/a/264709/18014
export LC_ALL=C

#since we use expect inside a bash-script, we have to escape tcl-$.
expect << EOF
spawn su $USERNAME -c "exit" 
expect "Password:"
send "$PASSWORD\r"
#expect eof

set wait_result  [wait]

# check if it is an OS error or a return code from our command
#   index 2 should be -1 for OS erro, 0 for command return code
if {[lindex \$wait_result 2] == 0} {
        exit [lindex \$wait_result 3]
} 
else {
        exit 1 
}
EOF
4 голосов
/ 22 сентября 2009

В Linux вам нужно написать небольшую программу на C, которая вызывает pam_authenticate(). Если вызов возвращает PAM_SUCCESS, то логин и пароль верны.

0 голосов
/ 22 сентября 2009

Частичным ответом будет проверка имени пользователя, определено ли оно в файле passwd / shadow в / etc затем вычислите пароли MD5 с солью. Если ваш пароль пользователя отправлен через SSL (или хотя бы какой-нибудь серверный терминал).

Это просто намек, потому что я не знаю, что тебе на самом деле нужно. Потому что "su" в основном для аутентификации.

Другие темы, на которые вы можете обратить внимание, - это службы Kerberos / LDAP, но это сложные темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...