我正在编写一个Shell脚本,以自动添加新用户并更新其密码。我不知道如何获取passwd来从shell脚本中读取,而不是交互式地提示我输入新密码。我的代码如下。
adduser $ 1 密码$ 1 2美元 2美元
Answers:
来自“ 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外壳,则“ echo”可能不是内置命令,外壳将调用/bin/echo
。这是不安全的,因为该密码将显示在进程表中,并且可以通过诸如之类的工具查看ps
。
在这种情况下,您应该使用另一种脚本语言。这是Perl中的示例:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
passwd "$1" <<< "$2"
唯一的解决方案适用于Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
但是第二个选项仅在我更改为时才有效:
echo "password:name" | chpasswd
至:
echo "user:password" | chpasswd
请参阅原始帖子中的说明:通过脚本更改密码
echo 'user:newpassword' | sudo chpasswd
,或者没有sudo作为root。
my@secret\npasword123
echo password | sed 's/.*/\0\n\0/' | sudo passwd -q $USER 2> /dev/null
阅读以下明智的话:
我引用:
在bash中您无能为力。passwd(1)不会从标准输入中读取。这是故意的。这是为了保护您。密码绝不打算放到程序中或由程序生成。它们只能由具有功能性大脑的实际人类的手指输入,并且永远都不会写下来。
尽管如此,我们还是吸引了很多用户问他们如何规避35年的Unix安全性。
它接着解释你如何可以设置您的shadow(5)
正确密码,并为您展示GNU-只有I-护理有关的安全性,如果-IT-doesn't-MAKE-ME-觉得太太多滥用的三通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
或窃取密码。即使您认为自己的盒子很安全;这是您应该真正养成避免不惜一切代价避免的习惯(是的,即使付出更多的麻烦才能完成工作)。
对于那些需要通过脚本登录到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
有时设置一个没人知道的密码很有用。这似乎可行:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
这是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,然后设置密码而无需任何用户交互或辅助密码验证。
/usr/bin
只是一个可怕的想法。
我偶然发现了相同的问题,由于某种原因,该--stdin
选项在passwd
我使用的版本中不可用(在Ubuntu 14.04中提供)。
如果您碰巧遇到相同的问题,可以使用以下chpasswd
命令像我一样解决此问题:
echo "<user>:<password>" | chpasswd
您可以使用该expect
实用程序来驱动从tty读取的所有程序(与stdin相反,passwd就是这样做的)。Expect附带有可以立即运行的示例,用于处理各种交互式问题,例如passwd输入。