在 shell 脚本中使用 passwd 命令

2024-10-31 08:38:00
admin
原创
149
摘要:问题描述:我正在编写一个 shell 脚本来自动添加新用户并更新他们的密码。我不知道如何让 passwd 从 shell 脚本中读取,而不是以交互方式提示我输入新密码。我的代码如下。添加用户$1 密码$1 2美元 2美元解决方案 1:从 ” man 1 passwd”: --stdin ...

问题描述:

我正在编写一个 shell 脚本来自动添加新用户并更新他们的密码。我不知道如何让 passwd 从 shell 脚本中读取,而不是以交互方式提示我输入新密码。我的代码如下。

添加用户$1
密码$1
2美元
2美元

解决方案 1:

从 ” 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

解决方案 2:

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

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

但第二种选择仅当我从以下选项更改时才有效:

echo "password:name" | chpasswd

到:

echo "user:password" | chpasswd

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

解决方案 3:

现在,您可以以 root 身份使用此命令:

echo "user:pass" | chpasswd

或者以允许的用户身份使用 sudo:

echo "user:pass" | sudo chpasswd

解决方案 4:

阅读以下明智之言:

我引用一下:

你在 bash 中所做的一切都不可能奏效。passwd(1) 不会从标准输入读取。这是故意的。这是为了保护你。密码从来都不是用来输入程序的,也不是由程序生成的。它们只打算由一个有大脑的真人用手指输入,绝不会写在任何地方。

尽管如此,我们还是收到大量用户的询问,询问他们如何才能绕过 35 年的 Unix 安全机制。

它进一步解释了如何shadow(5)正确设置密码,并向您展示了 GNU-我只关心安全如果它不会让我想太多 -的滥用方式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或窃取密码。即使你认为你的机器是安全的;你应该养成不惜一切代价避免这种事情的习惯(是的,即使为了完成工作而多费点力气)。

解决方案 5:

如果您passwd不支持--stdin并且由于某种原因您不想(或不能)使用,则此处的文档chpasswd会起作用。

例子:

#!/usr/bin/env bash

username="user"
password="pass"

passwd ${username} << EOD
${password}
${password}
EOD

在 Arch Linux 下测试。这passwd是 的一个元素shadow-utils,并从包中安装core/filesystem,由于 需要该包,因此您通常默认拥有它core/base

解决方案 6:

对于那些需要通过脚本登录 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

解决方案 7:

你可以使用 chpasswd

echo $1:$2 | chpasswd

解决方案 8:

我偶然发现了同样的问题,并且由于某种原因,该选项在我使用--stdin的版本(Ubuntu 14.04 中发布)上不可用。passwd

chpasswd如果您碰巧遇到同样的问题,可以像我一样使用以下命令解决问题:

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

解决方案 9:

对于我来说,在 Raspbian 上它只能以这种方式工作(添加了旧密码):

#!/usr/bin/env bash

username="pi"
password="Szevasz123"
new_ps="Szevasz1234"

passwd ${username} << EOD
${password}
${new_ps}
${new_ps}
EOD

解决方案 10:

我在 CentOS VMWare 映像上测试了这一点,我保留了该映像用于此类事情。请注意,您可能希望避免将密码作为命令行参数,因为整个机器上的任何人都可以通过“ps -ef”读取它们。

也就是说,这会起作用:

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

解决方案 11:

对于 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,然后在没有任何用户交互或二次密码验证的情况下设置密码。

解决方案 12:

您看过选项了-padduser(据我所知,这只是 的另一个名称useradd)?您可能还想看看使用纯文本密码-P的选项,但我不知道它是否是标准命令(它可能是 SE Linux 的一部分,也可能只是 Fedora 的一个奇怪之处)。luseradd`luseradd`

解决方案 13:

有时设置一个没人知道的密码很有用。这似乎有效:

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

解决方案 14:

echo '你的密码' | sudo -S 你的命令

如果 -S 不起作用尝试 -kS

解决方案 15:

从所有图形字符自动生成随机密码

当密码可能包含字符时,@fernando-kosh 的最佳答案不易使用,因为会被解释为具有特殊含义。echo -e

由于我是从图形字符集自动生成密码的,该字符集可能也包含`,因此我采用了另一种方法,将新密码两次发送到 stdout,中间使用换行符。以下是使用yes`命令的解决方案:

NEW_PASSWORD=$(tr -dc '[:graph:]' </dev/urandom | head -c "${PASSWORD_LENGTH:-30}")

yes "$NEW_PASSWORD" | \n  head -n 2 | \n  sudo passwd "$TARGET_USERNAME"

PASSWORD_LENGTH如果未设置,将默认生成 30 个字符的随机密码。

解决方案 16:

您可以使用该expect实用程序来驱动所有从 tty 读取的程序(与 passwd 执行的标准输入相反)。Expect 附带了可立即运行的各种交互式问题示例,例如 passwd 输入。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用