我正在制作一个 GUI 应用程序来管理 Linux 中的用户和组!
我已经完成了创建新用户的部分,但仍坚持为新创建的用户提供新密码的部分。我的应用程序所做的只是通过 GUI 获取所需的输入(用户名、组列表和密码),并运行一个将此信息作为参数传递的脚本。假设我们有一个用户帐户 xyz。如果我想更改该帐户的密码,那么我只需运行以下命令:
passwd xyz
这将要求输入新密码。现在我可以使用脚本创建一个新帐户,因为所有必需的信息都在命令行中传递。
useradd -m -G users -g "groups" -s /bin/bash "UserName"
我可以通过 Qt 应用程序运行脚本并创建用户,但在 中passwd cmd
,在另一行中要求输入。人们如何处理这个问题?
答案1
我认为正确的答案是:不要使用命令行工具 - 使用库调用。这将使您更好地处理错误,并避免在命令行上传递密码的风险。
您可以使用的一个库是库用户,它相对简单并且具有 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
在第一个终端更改密码后:
[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
在标准输入上向其提供新密码。
答案4
chpasswd 命令从命令行读取用户名/密码对列表以更新一组现有用户。每行的格式如下
user_name:password
此命令旨在用于一次性创建多个帐户的大型系统环境。要了解此命令的更多选项,请键入
man chpasswd