6

我使用 putty 中的连接类型“SSH”从 Windows 连接到 8 个不同的 unix 服务器。我为每台服务器使用相同的用户名/密码。

目前当我需要更改密码时(每 60 天),我需要打开 putty,选择我要连接的会话,输入我当前的密码(在打开的 putty 窗口中),输入“passwd”,输入我的当前密码,然后输入我的新密码。

然后我退出并重复该过程 7 次。

如何将其转换为自动化过程,我只需要提供带有新旧密码的脚本/批处理过程?

4

3 回答 3

2

以下是我如何自动化该过程:

  1. 下载并安装ActiveTCL 社区版(下载 32 位版本,即使您在 64 位 Windows 上,因为 64 位版本没有运行自动化脚本所需的“期望”)

  2. 打开安装创建的 tclsh85 可执行文件

  3. 运行此命令“teacup install Expect”(注意,这是区分大小写的。如果您收到错误和/或在 vpn 上或使用代理,您可能需要设置特殊的 http 设置)

  4. 下载 Putty 的“plink.exe”并将其放在 ActiveTCL 的 bin 目录中(默认安装目录为“C:\Tcl\bin”)或更改“Path”环境变量以包含此可执行文件的路径(无论您下载的位置plink.exe)。这是您的脚本将使用的 Putty 命令行版本。

  5. 在您的驱动器上的任何地方,创建一个名为“servers.txt”的文本文件,其中包含服务器列表(每行一个)。他们都应该共享相同的密码,因为脚本将使用相同的密码(您提供的密码)登录到所有这些人,并将密码更改为您提供的密码。

  6. 在与“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
    
  7. 保存脚本,然后启动 ChangePassword.tcl 文件。

这是打开 ChangePassword.tcl 文件时的样子: 后台打开servers.txt更改密码TCL程序

其余的应该是不言自明的。请注意,当您的密码更改成功时,程序不会输出,但它会在失败时告诉您。另请注意,这是我的第一个 tcl 脚本(也是第一次使用 Expect),因此该脚本绝不是“优化”的,可能会有所改进,但它可以完成工作。随意编辑,或提出建议/改进。

于 2012-10-23T16:08:39.090 回答
1

听起来您想要Expect,它是 TCL 的扩展,可以模拟在控制台应用程序的键盘上打字。请参阅示例以了解如何执行此操作。

现在有一些你写的让我担心的东西:

我使用 putty 中的连接类型“SSH”连接到 8 个不同的 unix 服务器。我为每台服务器使用相同的用户名/密码。

为什么不使用 SSH 密钥来自动登录?

于 2012-10-22T15:54:23.443 回答
0

好文章!仅详细说明第 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
 %
于 2014-08-29T20:28:49.813 回答