如何在一个脚本/批处理文件中更改多个unix密码?

时间:2012-10-22 15:50:26

标签: unix scripting batch-file ssh putty

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

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

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

如何将此转换为自动流程,我只需要使用旧密码和新密码提供脚本/批处理流程?

3 个答案:

答案 0 :(得分:2)

以下是我自动化流程的方法:

  1. 下载并安装ActiveTCL Community Edition(下载32位版本,即使您使用的是64位版本,因为64位版本没有“Expect”,这是运行自动化所需的脚本)

  2. 打开由安装

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

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

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

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

  9. 以下是打开ChangePassword.tcl文件时的图片: Change Password TCL program with servers.txt open in the background

    其余的应该是自我解释的。请注意,当密码更改成功时,程序不会输出,但会在失败时告诉您。另请注意,这是我的第一个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
 %