我正在编写一个shell脚本来自动添加新用户并更新他们的密码.我不知道如何让passwd从shell脚本中读取而不是以交互方式提示我输入新密码.我的代码如下.
adduser $1 passwd $1 $2 $2
8jean.. 85
来自" 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
如果bash然后`passwd'$ 1"<<<"$ 2"` (3认同)
请不要使用echo ... | 密码!然后,密码将对运行ps的任何其他用户可见.密码通过的地方越多(不同的程序,文件,管道等),泄漏的可能性就越高. (2认同)
Fernando Kos.. 50
唯一的解决方案适用于Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
但第二个选项仅在我改变时才有效:
echo "password:name" | chpasswd
至:
echo "user:password" | chpasswd
请参阅原始帖子中的说明:通过脚本更改密码
来自" 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
唯一的解决方案适用于Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
但第二个选项仅在我改变时才有效:
echo "password:name" | chpasswd
至:
echo "user:password" | chpasswd
请参阅原始帖子中的说明:通过脚本更改密码
阅读以下智者:
http://mywiki.wooledge.org/BashFAQ/078
我引用:
你在bash中所做的一切都无法奏效.passwd(1)不读取标准输入.这是故意的.这是为了你的保护.密码从未打算放入程序或由程序生成.它们只能由一个真实的人类的手指进入,具有功能性的大脑,并且永远不会在任何地方写下来.
尽管如此,我们仍有大批用户询问他们如何规避35年的Unix安全性.
它继续解释你如何shadow(5)
正确设置密码,并向你展示GNU -I-only-care-about-security-if-it-not-make-me-think-too-much-much of abuse 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
或者窃取密码.即使你认为你的盒子是安全的; 它的东西,你应该真正得到避免不惜一切代价的习惯(是的,做多一点麻烦完成工作的,甚至成本).
如今:
echo "user:pass" | chpasswd