【问题标题】:How do I change multiple unix passwords in one script/batch file?如何在一个脚本/批处理文件中更改多个 unix 密码?
【发布时间】:2012-10-22 15:50:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: unix scripting batch-file ssh putty


    【解决方案1】:

    这是我如何自动化流程:

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

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

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

    4. Download Putty's "plink.exe" 并将其放在 ActiveTCL 的 bin 目录中(默认安装目录为“C:\Tcl\bin”)或更改“路径”环境变量以包含此可执行文件的路径(无论您下载了 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 文件时的样子:

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

    【讨论】:

    • 如何修改 TCL 脚本,以便在设置新密码之前执行“SUDO SU -”?在某些系统上,您首先需要将您的权限/访问权限提升到根级别,然后才能更改密码。请记住,当运行“SUDO SU -”(当然不带引号)时,您有时需要重新输入当前密码。 PS- 很好的说明!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您能否提供更多关于使用 except/TCL 的详细信息?我已经下载了 ActiveState ActiveTCL,它在我的任务栏中转储了 Tclsh85、tkcon、vfs explorer 和 wish85。我使用哪一个以及如何使用它来下载/使用 Expect?活动的 TCL 文档在这些简单的步骤中不是很有帮助,只是说“使用茶壶来获取 Expect”。
    • @Droid 抱歉,我从未在 Windows 上使用过 TCL。我想我在“unix”之后完全错过了你问题中的“腻子”。无论如何,我怀疑您可以编写一个 Expect 脚本驻留在您的 Unix 服务器上,该脚本将通过命令行获取参数。然后你只需指示 Putty 通过 SSH 发送远程命令。
    【解决方案3】:

    好文章!仅详细说明第 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
     %
    

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多