在shell脚本中使用passwd命令

我正在编写一个shell脚本来自动添加一个新用户并更新他们的密码。 我不知道如何从shell脚本获取密码,而不是交互式地提示我input新的密码。 我的代码如下。

  adduser $ 1
 passwd $ 1
 $ 2
 $ 2 

源自“ 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选项:请按照ashawley的build议使用chpasswd实用程序。

如果你使用的不是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 

唯一的解决scheme适用于Ubuntu 12.04:

 echo -e "new_password\nnew_password" | (passwd user) 

但是,第二个选项只适用于我改变:

 echo "password:name" | chpasswd 

至:

 echo "user:password" | chpasswd 

请参阅原始文章中的解释: 通过脚本更改密码

阅读下面的智慧词汇:

我引用:

没有什么你可以在bash中做的可能工作。 passwd(1)不从标准input读取。 这是故意的。 这是为了您的保护。 密码从未打算被放入程序或由程序生成。 他们只打算用一个真正的人类的手指进入,用一个function性的大脑,永远不会在任何地方写下来。

尽pipe如此,我们有大量的用户问他们如何能够绕过35年的Unix安全。

它继续解释如何正确设置你的shadow(5)密码,并向你展示GNU -I-only-care-about-security-if-it- does not -make-me-think-too-much滥用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

在CentOS VMWare映像上testing了这个东西。 请注意,您可能希望避免将密码作为命令行参数,因为整个机器上的任何人都可以从“ps -ef”中读取它们。

这就是说,这将起作用:

 user="$1" password="$2" adduser $user echo $password | passwd --stdin $user 

你可以使用chpasswd

echo $1:$2 | chpasswd

你看过adduser-p选项(哪个AFAIK只是useradd另一个名字)? 你可能也想看看luseradd-P选项,它需要一个纯文本密码,但是我不知道luseradd是一个标准命令(它可能是SE Linux的一部分,或者可能只是Fedora的一个奇怪的部分)。

您可以使用expect实用程序来驱动所有从tty读取的程序(而不是stdin,这是passwd所做的)。 Expect随时准备运行各种交互式问题的例子,比如passwd入口。

有时设置一个没有人知道的密码是有用的。 这似乎工作:

 tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user 

我偶然发现了同样的问题,出于某种原因,“ – stdin”选项在我使用的(在Ubuntu 14.04上发布的) passwd版本上不可用。

如果你们中的任何一个碰巧实验过一样的话,你可以像我一样使用chpasswd命令:

echo "<user>:<password>" | chpasswd

这是Teradata节点pipe理员的权威答案

1:转到/ etc / hosts文件,并在文本文件中创build一个IP或节点名称列表

——————configuration文件服务器开始————
SMP007-1
SMP007-2
SMP007-3
——结束文件从cfg文件中省略这些注释—

现在的脚本

在所有节点上设置密码

printf“用户名:”
读MYUSERID
printf“新密码:”
阅读MYPASS

因为我在` cat /usr/bin/setpwd.srvrs`中

回声在$我更改密码
ssh root @ $我sudo echo“$ MYUSERID”:“$ MYPASS”| chpasswd的
在$ i上更改回显密码
DONE

好吧我知道我已经打破了ssh和root的基本安全规则,但我会让你的安全人员处理它

_________________________________
把它和你的setpwd.srvrsconfiguration文件放在你的/ usr / bin子目录中

当你运行这个命令时,它会提示你一次用户ID
然后一次input密码。 然后脚本遍历所有节点
在setpwd.srvrs文件中为每个节点做一个无密码的ssh
然后设置密码而不需要任何用户交互或次要的
密码validation。 现在你有多less次想这样做
但不知道如何? 非常需要,来创新。

想想像这样有用的是一个有数百个pipe理员
的服务器。

对于那些需要通过login到sudoers文件中的用户帐户的脚本远程运行的人来说,我发现了一个邪恶的可怕的黑客,这无疑是非常不安全的:

 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