我使用putty中的连接类型“SSH”从Windows连接到8个不同的unix服务器。我为每个服务器使用相同的用户名/密码。
目前我需要更改密码(每60天),我需要打开putty,选择我要连接的会话,输入我当前的密码(在打开的putty窗口中),输入“passwd”,输入我当前的密码,然后输入我的新密码。
然后我退出并重复该过程7次。
如何将此转换为自动流程,我只需要使用旧密码和新密码提供脚本/批处理流程?
答案 0 :(得分:2)
以下是我自动化流程的方法:
下载并安装ActiveTCL Community Edition(下载32位版本,即使您使用的是64位版本,因为64位版本没有“Expect”,这是运行自动化所需的脚本)
打开由安装
运行此命令“teacup install Expect”(注意,这是区分大小写的。如果收到错误和/或使用vpn或使用代理,您可能需要设置特殊的http设置)
Download Putty's "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),因此脚本绝不是“优化的”,并且可能会得到改进,但它可以完成工作。随意编辑或提出建议/改进。
答案 1 :(得分:1)
听起来像你想要Expect,这是TCL的扩展,它可以模仿控制台应用程序的键盘输入。有关如何执行此操作,请参阅examples。
现在你写的东西让我担心:
我使用putty中的连接类型“SSH”连接到8个不同的unix服务器。我为每个服务器使用相同的用户名/密码。
为什么不使用SSH密钥自动登录?
答案 2 :(得分:0)
好文章!刚刚详细说明了第3步。请注意,如果“茶杯安装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
%