Изменение пароля пользователя через приложение с графическим интерфейсом

Изменение пароля пользователя через приложение с графическим интерфейсом

Я создавал приложение с графическим интерфейсом для управления пользователями и группами в Linux!

Я закончил с частью, где он создает нового пользователя, но застрял с частью, где он дает новому созданному пользователю новый пароль. Мое приложение просто принимает требуемые входные данные (имя пользователя, список групп и пароль) через GUI и запускает скрипт, передавая эту информацию в качестве аргумента. Допустим, у нас есть учетная запись пользователя xyz. Если я хочу изменить пароль для этой учетной записи, то все, что мне нужно сделать, это просто запустить команду:

passwd xyz

Это запросит новый пароль. Теперь я могу создать новую учетную запись с помощью скриптов, поскольку вся необходимая информация передается в командной строке.

useradd -m -G users -g "groups" -s /bin/bash "UserName"

Я могу запустить скрипт через приложение Qt и создать пользователя, но в passwd cmd, ввод запрашивается в другой строке. Как с этим бороться?

решение1

Я думаю, правильный ответ здесь такой:не подключайтесь к инструменту командной строки — используйте вызов библиотеки. Это позволит вам лучше обрабатывать ошибки и избежать рискованной передачи пароля в командной строке.

Одна из библиотек, которую вы можете использовать, этоlibuser, который относительно прост и имеет привязки к C и Python.

решение2

Как пользователь root вы можете систематически устанавливать пароль пользователя с помощью скрипта, используя следующий метод:

$ echo -n "$passwd" | passwd "$uname" --stdin

Генерация паролей

Мне нравится использовать командную строкуpwgenдля генерации паролей.

$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"

$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

Options supported by pwgen:
  -c or --capitalize
    Include at least one capital letter in the password
  -A or --no-capitalize
    Don't include capital letters in the password
  -n or --numerals
    Include at least one number in the password
  -0 or --no-numerals
    Don't include numbers in the password
  -y or --symbols
    Include at least one special symbol in the password
  -s or --secure
    Generate completely random passwords
  -B or --ambiguous
    Don't include ambiguous characters in the password
  -h or --help
    Print a help message
  -H or --sha1=path/to/file[#seed]
    Use sha1 hash of given file as a (not so) random generator
  -C
    Print the generated passwords in columns
  -1
    Don't print the generated passwords in columns
  -v or --no-vowels
    Do not use any vowels so as to avoid accidental nasty words

Но разве это не небезопасно?

Нет. Пароль передается через STDIN, поэтому, passwdхотя кто-то может шпионить за процессами через ps, даже это не должно позволить пользователю видеть процессы root, передача пароля passwdзаблокирована.

Пример

Допустим, я запускаю эту команду в одном терминале как пользователь root:

$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989

Затем я запускаю psв другом терминале:

$ ps -AOcmd | grep pass
14046 passwd samtest --stdin      R pts/11   00:00:00 passwd samtest --stdin

После смены пароля в 1-м терминале:

[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.

А как насчет эха для passwd?

Даже это не приводит к утечке пароля. Вот еще один тест, демонстрирующий это. Сначала мы запускаем эту команду во вторичном терминале. Это соберет вывод из ps.

$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt

Затем мы запускаем команду установки пароля:

$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.

[1]+  Done                    echo "supersecret" | passwd "samtest" --stdin

Проверка содержимого ps.txtпоказывает, что пароль не разглашается:

$ grep supersecret ps.txt
$

Изменение psиспользуемой нами команды ps -eafтакже не приводит к утечке.

решение3

passwd --helpна моем компьютере указывает, что rootможно запустить его, --stdinчтобы передать новый пароль на stdin.

решение4

Команда chpasswd считывает список пар имя пользователя/пароль из командной строки для обновления группы существующих пользователей. Каждая строка имеет формат

user_name:password

Эта команда предназначена для использования в больших системных средах, где одновременно создается много учетных записей. Чтобы узнать больше о параметрах этой команды, введите

man chpasswd

Связанный контент