在 shell 脚本中使用 passwd 命令
- 2024-10-31 08:38:00
- admin 原创
- 149
问题描述:
我正在编写一个 shell 脚本来自动添加新用户并更新他们的密码。我不知道如何让 passwd 从 shell 脚本中读取,而不是以交互方式提示我输入新密码。我的代码如下。
添加用户$1
密码$1
2美元
2美元
解决方案 1:
从 ” man 1 passwd
”:
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
所以你的情况
adduser "$1"
echo "$2" | passwd "$1" --stdin
您的passwd
命令可能没有--stdin
选项:chpasswd
按照ashawley的建议,使用实用程序。
如果你使用 bash 以外的 shell,echo
可能不是内置命令,shell 将调用/bin/echo
。这是不安全的,因为密码将显示在进程表中,并且可以使用 等工具查看ps
。
在这种情况下,您应该使用另一种脚本语言。以下是 Perl 中的一个示例:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
解决方案 2:
唯一的解决方案适用于 Ubuntu 12.04:
echo -e "new_password
new_password" | (passwd user)
但第二种选择仅当我从以下选项更改时才有效:
echo "password:name" | chpasswd
到:
echo "user:password" | chpasswd
请参阅原帖中的解释:通过脚本更改密码
解决方案 3:
现在,您可以以 root 身份使用此命令:
echo "user:pass" | chpasswd
或者以允许的用户身份使用 sudo:
echo "user:pass" | sudo chpasswd
解决方案 4:
阅读以下明智之言:
我引用一下:
你在 bash 中所做的一切都不可能奏效。passwd(1) 不会从标准输入读取。这是故意的。这是为了保护你。密码从来都不是用来输入程序的,也不是由程序生成的。它们只打算由一个有大脑的真人用手指输入,绝不会写在任何地方。
尽管如此,我们还是收到大量用户的询问,询问他们如何才能绕过 35 年的 Unix 安全机制。
它进一步解释了如何shadow(5)
正确设置密码,并向您展示了 GNU-我只关心安全如果它不会让我想太多 -的滥用方式passwd(1)
。
最后,如果您要使用愚蠢的 GNU passwd(1) 扩展--stdin
,请不要在命令行中传递密码。
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
最后这个是你用 GNU 能做到的最好的事情passwd
。尽管我仍然不推荐它。
在命令行上输入密码意味着任何有一点权限的人都可以监视ps
或窃取密码。即使你认为你的机器是安全的;你也应该养成不惜一切代价避免这种事情的习惯(是的,即使为了完成工作而多费点力气)。
解决方案 5:
如果您passwd
不支持--stdin
并且由于某种原因您不想(或不能)使用,则此处的文档chpasswd
会起作用。
例子:
#!/usr/bin/env bash
username="user"
password="pass"
passwd ${username} << EOD
${password}
${password}
EOD
在 Arch Linux 下测试。这passwd
是 的一个元素shadow-utils
,并从包中安装core/filesystem
,由于 需要该包,因此您通常默认拥有它core/base
。
解决方案 6:
对于那些需要通过脚本登录 sudoers 文件中的用户帐户来远程“以 root 身份运行”的人,我发现了一个邪恶的可怕黑客,毫无疑问这是非常不安全的:
sshpass -p 'userpass' ssh -T -p port user@server << EOSSH
sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
解决方案 7:
你可以使用 chpasswd
echo $1:$2 | chpasswd
解决方案 8:
我偶然发现了同样的问题,并且由于某种原因,该选项在我使用--stdin
的版本(Ubuntu 14.04 中发布)上不可用。passwd
chpasswd
如果您碰巧遇到同样的问题,可以像我一样使用以下命令解决问题:
echo "<user>:<password>" | chpasswd
解决方案 9:
对于我来说,在 Raspbian 上它只能以这种方式工作(添加了旧密码):
#!/usr/bin/env bash
username="pi"
password="Szevasz123"
new_ps="Szevasz1234"
passwd ${username} << EOD
${password}
${new_ps}
${new_ps}
EOD
解决方案 10:
我在 CentOS VMWare 映像上测试了这一点,我保留了该映像用于此类事情。请注意,您可能希望避免将密码作为命令行参数,因为整个机器上的任何人都可以通过“ps -ef”读取它们。
也就是说,这会起作用:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
解决方案 11:
对于 Teradata 节点管理员来说,这是明确的答案。
转到您的/etc/hosts
文件并在文本文件中创建 IP 或节点名称列表。
SMP007-1
SMP007-2
SMP007-3
将以下脚本放入文件中。
#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS
while read -r i; do
echo changing password on "$i"
ssh root@"$i" sudo echo "$MYUSERID":"$MYPASS" | chpasswd
echo password changed on "$i"
done< /usr/bin/setpwd.srvrs
好的,我知道我违反了 ssh 和 root 的基本安全规则,但我会让安全人员来处理它。
现在将其/usr/bin
与您的setpwd.srvrs
配置文件一起放入您的子目录中。
运行该命令时,它会提示您输入一次用户 ID,然后输入一次密码。然后脚本遍历setpwd.srvrs
文件中的所有节点,对每个节点执行无密码 ssh,然后在没有任何用户交互或二次密码验证的情况下设置密码。
解决方案 12:
您看过选项了-p
吗adduser
(据我所知,这只是 的另一个名称useradd
)?您可能还想看看使用纯文本密码-P
的选项,但我不知道它是否是标准命令(它可能是 SE Linux 的一部分,也可能只是 Fedora 的一个奇怪之处)。luseradd
`luseradd`
解决方案 13:
有时设置一个没人知道的密码很有用。这似乎有效:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
解决方案 14:
echo '你的密码' | sudo -S 你的命令
如果 -S 不起作用尝试 -kS
解决方案 15:
从所有图形字符自动生成随机密码
当密码可能包含字符时,@fernando-kosh 的最佳答案不易使用,因为会被解释为具有特殊含义。echo -e
由于我是从图形字符集自动生成密码的,该字符集可能也包含`,因此我采用了另一种方法,将新密码两次发送到 stdout,中间使用换行符。以下是使用
yes`命令的解决方案:
NEW_PASSWORD=$(tr -dc '[:graph:]' </dev/urandom | head -c "${PASSWORD_LENGTH:-30}")
yes "$NEW_PASSWORD" | \n head -n 2 | \n sudo passwd "$TARGET_USERNAME"
PASSWORD_LENGTH
如果未设置,将默认生成 30 个字符的随机密码。
解决方案 16:
您可以使用该expect
实用程序来驱动所有从 tty 读取的程序(与 passwd 执行的标准输入相反)。Expect 附带了可立即运行的各种交互式问题示例,例如 passwd 输入。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)