在 shell 脚本中使用 passwd 命令

2024-10-31 08:38:00
admin
原创
188
摘要:问题描述:我正在编写一个 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 输入。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用