我使用 putty 中的连接类型“SSH”从 Windows 连接到 8 个不同的 unix 服务器。我为每台服务器使用相同的用户名/密码。
目前当我需要更改密码时(每 60 天),我需要打开 putty,选择我要连接的会话,输入我当前的密码(在打开的 putty 窗口中),输入“passwd”,输入我的当前密码,然后输入我的新密码。
然后我退出并重复该过程 7 次。
如何将其转换为自动化过程,我只需要提供带有新旧密码的脚本/批处理过程?
我使用 putty 中的连接类型“SSH”从 Windows 连接到 8 个不同的 unix 服务器。我为每台服务器使用相同的用户名/密码。
目前当我需要更改密码时(每 60 天),我需要打开 putty,选择我要连接的会话,输入我当前的密码(在打开的 putty 窗口中),输入“passwd”,输入我的当前密码,然后输入我的新密码。
然后我退出并重复该过程 7 次。
如何将其转换为自动化过程,我只需要提供带有新旧密码的脚本/批处理过程?
以下是我如何自动化该过程:
下载并安装ActiveTCL 社区版(下载 32 位版本,即使您在 64 位 Windows 上,因为 64 位版本没有运行自动化脚本所需的“期望”)
打开安装创建的 tclsh85 可执行文件
运行此命令“teacup install Expect”(注意,这是区分大小写的。如果您收到错误和/或在 vpn 上或使用代理,您可能需要设置特殊的 http 设置)
下载 Putty 的“plink.exe”并将其放在 ActiveTCL 的 bin 目录中(默认安装目录为“C:\Tcl\bin”)或更改“Path”环境变量以包含此可执行文件的路径(无论您下载的位置plink.exe)。这是您的脚本将使用的 Putty 命令行版本。
在您的驱动器上的任何地方,创建一个名为“servers.txt”的文本文件,其中包含服务器列表(每行一个)。他们都应该共享相同的密码,因为脚本将使用相同的密码(您提供的密码)登录到所有这些人,并将密码更改为您提供的密码。
在与“servers.txt”相同的目录中创建一个名为“ChangePassword.tcl”的新文本文件(或任何您想调用的文件,但请确保其文件类型为“tcl”)。右键单击该文件并在记事本(或您喜欢的任何文本编辑器)中编辑并将此脚本粘贴到其中。
package require Expect
exp_log_user 0
set exp::nt_debug 1
proc changepw {host user oldpass newpass} {
spawn plink $host
log_user 0
expect {
"login as: " { }
}
exp_send "$user\r"
expect "sword: "
exp_send "$oldpass\r"
expect "\$ "
exp_send "passwd\r"
expect "sword: "
exp_send "$oldpass\r"
expect "sword: "
exp_send "$newpass\r"
expect "sword: "
exp_send "$newpass\r"
set result $expect_out(buffer)
exp_send "exit\r"
return $result
}
label .userlbl -text "Username:"
label .oldpasslbl -text "\nOld Password: "
label .newpasslbl -text "\nNew Password: "
set username "username"
entry .username -textvariable username
set oldpassword "oldpassword"
entry .oldpassword -textvariable oldpassword
set newpassword "newpassword"
entry .newpassword -textvariable newpassword
button .button1 -text "Change Password" -command {
set fp [open "servers.txt" r]
set file_data [read $fp]
close $fp
set data [split $file_data "\n"]
foreach line $data {
.text1 insert end "Changing password for: $line\n"
set output [changepw $line $username $oldpassword $newpassword]
.text1 insert end "$output\n\n"
}
}
text .text1 -width 50 -height 30
pack .userlbl .username .oldpasslbl .oldpassword .newpasslbl .newpassword .button1 .text1
保存脚本,然后启动 ChangePassword.tcl 文件。
这是打开 ChangePassword.tcl 文件时的样子:
其余的应该是不言自明的。请注意,当您的密码更改成功时,程序不会输出,但它会在失败时告诉您。另请注意,这是我的第一个 tcl 脚本(也是第一次使用 Expect),因此该脚本绝不是“优化”的,可能会有所改进,但它可以完成工作。随意编辑,或提出建议/改进。
好文章!仅详细说明第 3 步。请注意提供代理服务器信息的命令,以防“teacup install Expect”由于连接问题而失败:
%teacup install Expect
Resolving Expect ... Not found in the archives.
...
Aborting installation, was not able to locate the requested entity.
child process exited abnormally
% teacup list teacup
0 entities found
Problems which occurred during the operation:
* http://teapot.activestate.com :
{connect failed connection refused} {can't read
"state(sock)": no such element in array while executing
"fileevent $state(sock) writable {}"} NONE
% teacup proxy "abcproxy.mycorp.com" 8080
Proxying through abcproxy.mycorp.com @ 8080
% set http_proxy_user MyNetworkID
MyNetworkID
% set http_proxy_pass MyNetworkPassword
MyNetworkPassword
% teacup list teacup
entity name version platform
----------- ------ --------------- ----------
application teacup 8.5.16.0.298388 win32-ix86
----------- ------ --------------- ----------
1 entity found
% teacup install Expect
Resolving Expect ... [package Expect 5.43.2 win32-ix86 @ http://teapot.activestate.com]
Resolving Tcl 8.4 -is package ... [package Tcl 8.6.1 _ ... Installed outside repository, probing dependencies]
Retrieving package Expect 5.43.2 win32-ix86 ...@ http://teapot.activestate.com ...
Ok
Installing into C:/app/Tcl/lib/teapot
Installing package Expect 5.43.2 win32-ix86
%