Я создавал приложение с графическим интерфейсом для управления пользователями и группами в 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