繁体   English   中英

通过 ssh 在 linux 服务器上更改密码的脚本

[英]Script to change password on linux servers over ssh

我们的 IT 环境中有许多 Red Hat linux 服务器。 我的团队成员要求我编写一个脚本(最好是 shell 脚本),以使用 SSH 一次性更改每个用户的密码。

我试图找到解决方案,但我发现的许多脚本都在使用 Expect。 我们的服务器上没有安装 Expect,系统管理员拒绝让我们安装它。 此外,用户没有 root 访问权限,因此无法使用passwd --stdinchpasswd

有什么方法可以编写脚本,以便用户可以运行它并在列表中的所有服务器上仅更改自己用户的密码?

远程机器不需要安装。 您可以在本地工作站或 VM(虚拟机)或任何 *nix 机器上安装 expect,并编写一个调用此 .ex(expect)脚本的包装器(从发行版到发行版可能会有小的变化,这在 CentOS 5/6 上进行了测试) ):

#!/usr/bin/expect -f
# wrapper to make passwd(1) be non-interactive
# username is passed as 1st arg, passwd as 2nd

set username [lindex $argv 0]
set password [lindex $argv 1]
set serverid [lindex $argv 2]
set newpassword [lindex $argv 3]

spawn ssh $serverid passwd
expect "assword:"
send "$password\r"
expect "UNIX password:"
send "$password\r"
expect "password:"
send "$newpassword\r"
expect "password:"
send "$newpassword\r"
expect eof

您不需要 root 访问权限即可使用passwd

这应该工作得很好。

passwd <<EOF
old password
new password
new password
EOF

您应该尝试pssh (同时使用并行 ssh)。

cat>~/ssh-hosts<<EOF
user100@host-foo
user200@host-bar
user848@host-qux
EOF

pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'

以壁球爱好者的例子为基础,我尝试了以下方法,这对我来说效果很好:

#!/bin/bash
for server in `cat hostlist`; do
echo $server;
ssh username@$server 'passwd <&ltEOF
old_password
new_password
new_password
EOF';
done

安全方面,可以改进以在不回显到屏幕或将明文保存到磁盘的情况下进行输入。

echo "name:password" | chpasswd

另一种可能性:在一台服务器上手动更改它。 从 /etc/shadow 中获取加密密码。 现在,做这样的事情:

for host in $HOST_LIST; do
    ssh $host "passwd -p 'encrypted_passwd' user"
done

当然,“encrypted_pa​​sswd”是您从 /etc/shadow 中手动更改密码的内容。而 $HOST_LIST 是您希望更改密码的主机列表。可以简单地创建:

export HOST_LIST="server1 server2 server15 server67"

或者也许是一个文件(正如其他人所建议的那样):

export HOST_LIST=`cat host_list.txt`

其中文件“host_list.txt”包含您希望更改密码的所有系统的列表。

编辑:如果您的 passwd 版本不支持 -p 选项,您可能有可用的“usermod”程序。 上面的示例保持不变,只需将 'passwd' 替换为 'usermod'。

此外,您可以考虑使用有用的工具 pdsh ,它将上面的示例简化为如下所示:

echo $HOST_LIST | pdsh -Rssh -w- "usermod -p 'encrypted_passwd' user"

要注意的最后一个“问题”:加密的密码可能包含美元符号字符 ('$') 作为字段分隔符。 您可能必须在 for 循环或 pdsh 命令中转义那些(即“$”变成“\\$”)。

  1. 在要执行脚本的任何服务器上安装sshpass

     yum -y install sshpass
  2. 准备一个文本文件,您必须在其中传递主机用户名密码端口等详细信息。 (根据您的要求)。

     192.168.1.2|sachin|dddddd|22
  3. 使用以下详细信息准备脚本文件。

     #!/bin/bash FILE=/tmp/ipaddress.txt MyServer="" MyUser="" MyPassword="" MyPort="" exec 3<&0 exec 0<$FILE while read line do MyServer=$(echo $line | cut -d'|' -f1) MyUser=$(echo $line | cut -d'|' -f2) MyPassword=$(echo $line | cut -d'|' -f3) MyPort=$(echo $line | cut -d'|' -f4) HOST=$MyServer USR=$MyUser PASS=$MyPassword sshpass -p $PASS ssh -p $MyPort -o StrictHostKeychecking=no $USR@$HOST \\ -T "echo 'sachin@patel' | passwd --stdin root" \\ < /dev/null | tee -a output.log done exec 0<&3

Expect 附带的passmass脚本(手册页)不需要在远程机器上安装 Expect。

我刚刚实现了一个小工具,可以一次更改许多用户/主机的密码。 它是基于 Java 的应用程序,因此它适用于 Windows 和 Linux。 它是免费的,享受:)

您可能希望向同行展示的另一种方法是让他们使用无密码身份验证。 他们会生成一个公钥/私钥对,并在他们登录的每个服务器上的 ~/.ssh/authorized_keys 文件中注册他们的公钥。

你会用 Perl 吗?

这里有一个脚本可以更改一组主机中的密码。

如果需要在运行脚本的本地机器上安装一些 Perl 模块( Net::OpenSSH::ParallelExpect及其依赖项),但在远程服务器上不需要更改密码。

你有没有试过App::Unix::RPasswd

如果你有 ssh,为什么首先要有密码? 将用户的公共 ssh 密钥推送到他们有权使用的所有服务器并完成使用。 这也让您可以轻松地授予和撤消您想要的所有访问权限。

在之前的 $dayjob 中,我们实际上拥有数万台服务器,他们有一个数据库,其中允许工程师使用哪些服务器,并且 ssh 密钥的安装是一个自动化过程。 几乎没有人在任何机器上都有密码。

echo -e "wakka2\\nwakka2\\n" | 密码根

cat /tmp/passwords | ssh $server sudo chpasswd -e

如果密码已加密,或

cat /tmp/passwords | ssh $server sudo chpasswd

如果密码未加密。

/tmp/passwords 的格式应该是“user:password”

以为我应该将我的解决方案放在答案字段中 - 不确定这是否应该成为问题的一部分。

好的,我已经使用丹尼斯的建议整理了一个部分可行的解决方案。

server.txt 看起来像:

server1
server2
server3
.
.
.

我在用:

for server in `cat servers.txt`; do
ssh $server -l user 'passwd <<EOF
old_pass
new_pass
new_pass
EOF';
done

这产生:

user@server1's password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.
user@server2's password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.

所以在这里,我仍然需要为每台服务器输入一次我的旧密码。 这可以避免吗?

真正的问题是他们为什么不使用某种名称服务? NIS/黄页或 LDAP,您不必在一堆服务器上手动更改密码。 用户更改密码一次,并在域主机上完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM