当前位置:  开发笔记 > 编程语言 > 正文

在shell脚本中使用passwd命令

如何解决《在shell脚本中使用passwd命令》经验,为你挑选了4个好方法。

我正在编写一个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

请参阅原始帖子中的说明:通过脚本更改密码



1> 8jean..:

来自" 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"`
请不要使用echo ... | 密码!然后,密码将对运行ps的任何其他用户可见.密码通过的地方越多(不同的程序,文件,管道等),泄漏的可能性就越高.

2> Fernando Kos..:

唯一的解决方案适用于Ubuntu 12.04:

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

但第二个选项仅在我改变时才有效:

echo "password:name" | chpasswd

至:

echo "user:password" | chpasswd

请参阅原始帖子中的说明:通过脚本更改密码



3> lhunath..:

阅读以下智者:

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或者窃取密码.即使你认为你的盒子是安全的; 它的东西,你应该真正得到避免不惜一切代价的习惯(是的,做多一点麻烦完成工作的,甚至成本).


@JackTang您需要在参数扩展上加上引号。<<<相比具有良好权限的文件,其安全性不如<的原因,是因为<<<可能会隐式创建一个外部人员可读的临时文件。

4> 小智..:

如今:

echo "user:pass" | chpasswd


由于某种原因,我在尝试您的命令时收到以下错误:"身份验证令牌操作错误".在chpasswd之前添加sudo为我修复了这个问题.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有