在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