Как изменить несколько паролей unix в одном скрипте/пакетном файле?

Я подключаюсь к 8 различным серверам unix из Windows, используя тип подключения «SSH» в замазке. Я использую одно и то же имя пользователя/пароль для каждого сервера.

В настоящее время, когда мне нужно сменить пароли (каждые 60 дней), мне нужно открыть шпатлевку, выбрать сеанс, к которому я хочу подключиться, ввести мой текущий пароль (в открывшемся окне шпатлевки), ввести «passwd», ввести мой текущий пароль , а затем введите мой новый пароль.

Затем я выхожу и повторяю процесс 7 раз.

Как я могу преобразовать это в автоматизированный процесс, где мне просто нужно предоставить сценарий/пакетный процесс с моим старым и новым паролем?


person n00b    schedule 22.10.2012    source источник


Ответы (3)


Вот как я автоматизировал процесс:

  1. Загрузите и установите ActiveTCL Community Edition (загрузите 32-разрядную версию, даже если вы используете 64-разрядную версию). windows, так как в 64-битной версии нет «Ожидать», что вам нужно для запуска автоматизированного скрипта)

  2. Откройте исполняемый файл tclsh85, созданный при установке.

  3. Запустите эту команду «teacup install Expect» (обратите внимание, это чувствительно к регистру. Вам может потребоваться установить специальные настройки http, если вы получаете сообщение об ошибке и/или используете vpn или прокси-сервер)

  4. Загрузите "plink.exe" от Putty и поместите его в каталоге bin ActiveTCL (каталог установки по умолчанию — «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), поэтому сценарий ни в коем случае не является «оптимизированным» и, вероятно, может быть улучшен, но он выполняет свою работу. Не стесняйтесь редактировать или вносить предложения/улучшения.

person n00b    schedule 23.10.2012
comment
Как вы модифицируете сценарий TCL, чтобы он мог выполнять SUDO SU — перед установкой нового пароля? В некоторых системах вам сначала нужно повысить свои разрешения/доступ до корневого уровня, прежде чем вы сможете изменить свой пароль. Имейте в виду, что при запуске SUDO SU - (без кавычек, разумеется) иногда требуется повторно ввести текущий пароль. P.S. Отличная инструкция! - person Lizz; 10.03.2014

Похоже, вам нужен Expect, расширение TCL, которое может имитировать набор текста на клавиатуре. для консольного приложения. См. примеры, как это сделать.

А вот то, что вы написали, меня беспокоит:

Я подключаюсь к 8 различным серверам unix, используя тип подключения «SSH» в замазке. Я использую одно и то же имя пользователя/пароль для каждого сервера.

Почему вы не используете ключи SSH для автоматизации входа в систему?

person chrisaycock    schedule 22.10.2012
comment
Не могли бы вы предоставить более подробную информацию об использовании Except/TCL? Я скачал ActiveState ActiveTCL, который сбросил Tclsh85, tkcon, vfs explorer и wish85 на панель задач. Какой из них мне использовать и как его использовать для загрузки/использования Expect? Активная документация TCL не очень помогает в этих простых шагах, кроме как сказать «используйте чайник, чтобы получить Expect». - person n00b; 22.10.2012
comment
@Droid Извините, я никогда не использовал TCL в Windows. Думаю, я полностью пропустил замазку в вашем вопросе после Unix. В любом случае, я подозреваю, что вы могли бы просто написать сценарий Expect для размещения на ваших серверах Unix, который будет принимать аргументы через командную строку. Затем вы просто указываете Putty отправить удаленную команду через SSH. - person chrisaycock; 22.10.2012

Отличная статья! Просто уточняю шаг 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
 %
person Abdul M Gill    schedule 29.08.2014