Как создать сценарий входа на основе пароля root в дистрибутиве Linux Openwrt?

У меня есть веб-приложение в дистрибутиве Linux Openwrt, где я использую пароль root для входа пользователем. Я смог изменить пароль root на html-странице «изменение пароля», используя программу cgi на c, вызвав системную команду для изменения пароля root.

system("(echo 'newpassword'; sleep 1; echo 'newpassword') | passwd root");

Теперь проблема, с которой я столкнулся, заключается в том, что я не понимаю, как сделать страницу входа функциональной. есть в openwrt?) . Я нашел скрипт login.sh в папке /bin, но это скрипт входа в систему (сценарий приведен ниже)?

#!/bin/sh
if ( ! grep -qs '^root:[!x]\?:' /etc/shadow || \

 ! grep -qs '^root:[!x]\?:' /etc/passwd ) && \
[ -z "$FAILSAFE" ]

then

    echo "Login failed."
    exit 0


else

cat << EOF



=== IMPORTANT ============================
  Use 'passwd' to set your login password
  this will disable telnet and enable SSH
 ------------------------------------------

EOF
fi
exec /bin/ash --login

Как LuCI это делает?..

Надеюсь вопрос ясен.

Спасибо.


person user2723949    schedule 30.10.2013    source источник
comment
вероятно, вам следует использовать PAM (подключаемые модули аутентификации), он проверяет учетные данные пользователя ОС, которые можно использовать для любых служб или приложений.   -  person Ashish    schedule 30.10.2013


Ответы (1)


Лучше всего идти через PAM

/usr/share/doc/python-pam/examples/pamtest.py

Нажмите это на своей оболочке, и вы можете получить представление

Или, если вы ищете сценарий CGI, можете использовать эту ссылку

Или сценарий bash здесь ссылка

Это обсуждалось в unix и linux из stackEchange.

Вот скрипт на питоне

#!/usr/bin/env python

import sys
import PAM
from getpass import getpass

def pam_conv(auth, query_list, userData):

    resp = []

    for i in range(len(query_list)):
        query, type = query_list[i]
        if type == PAM.PAM_PROMPT_ECHO_ON:
            val = raw_input(query)
            resp.append((val, 0))
        elif type == PAM.PAM_PROMPT_ECHO_OFF:
            val = getpass(query)
            resp.append((val, 0))
        elif type == PAM.PAM_PROMPT_ERROR_MSG or type == PAM.PAM_PROMPT_TEXT_INFO:
            print query
            resp.append(('', 0))
        else:
            return None

    return resp

service = 'passwd'

if len(sys.argv) == 2:
    user = sys.argv[1]
else:
    user = None

auth = PAM.pam()
auth.start(service)
if user != None:
    auth.set_item(PAM.PAM_USER, user)
auth.set_item(PAM.PAM_CONV, pam_conv)
try:
    auth.authenticate()
    auth.acct_mgmt()
except PAM.error, resp:
    print 'Go away! (%s)' % resp
except:
    print 'Internal error'
else:
    print 'Good to go!'
person Ashish    schedule 30.10.2013