Скрипт для изменения пароля на серверах Linux через SSH - PullRequest
19 голосов
/ 23 ноября 2011

В нашей ИТ-среде есть несколько Linux-серверов Red Hat. Члены моей команды просят меня написать сценарий (предпочтительно сценарий оболочки) для изменения пароля пользователя на каждом из них за один раз, используя SSH.

Я пытался найти решение, но многие из найденных мной скриптов используют Expect. У нас не установлен Expect на наших серверах, и системные администраторы отказались разрешить нам установить его. Кроме того, пользователи не имеют корневого доступа, поэтому passwd --stdin или chpasswd нельзя использовать.

Есть ли способ написать сценарий, чтобы пользователь мог запустить его и изменить пароль только своего собственного пользователя на всех серверах в списке?

Ответы [ 16 ]

22 голосов
/ 11 ноября 2012

Удаленные машины не должны ожидаться установленными. Вы можете установить Expect на локальную рабочую станцию ​​или виртуальную машину (virtualbox) или любую другую * nix-коробку и написать оболочку, которая вызывает этот сценарий .ex (ожидаемый) (возможны небольшие изменения с дистрибутива на дистрибутив, это было проверено на CentOS 5/6). ):

#!/usr/bin/expect -f
# wrapper to make passwd(1) be non-interactive
# username is passed as 1st arg, passwd as 2nd

set username [lindex $argv 0]
set password [lindex $argv 1]
set serverid [lindex $argv 2]
set newpassword [lindex $argv 3]

spawn ssh $serverid passwd
expect "assword:"
send "$password\r"
expect "UNIX password:"
send "$password\r"
expect "password:"
send "$newpassword\r"
expect "password:"
send "$newpassword\r"
expect eof
12 голосов
/ 23 ноября 2011

Для использования passwd.

вам не нужен root-доступ.

passwd <<EOF
old password
new password
new password
EOF
10 голосов
/ 23 ноября 2011

Вы должны попробовать pssh (параллельно ssh одновременно).

cat>~/ssh-hosts<<EOF
user100@host-foo
user200@host-bar
user848@host-qux
EOF

pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'
6 голосов
/ 03 мая 2012

Опираясь на пример squashbuff, я попробовал следующее, которое хорошо сработало для меня:

#!/bin/bash
for server in `cat hostlist`; do
echo $server;
ssh username@$server 'passwd &lt&ltEOF
old_password
new_password
new_password
EOF';
done

Мудро с точки зрения безопасности, можно улучшить ввод данных без отображения на экране ИЛИ сохранения открытого текста на диск.

4 голосов
/ 04 июня 2013
echo "name:password" | chpasswd
3 голосов
/ 12 апреля 2012

Другая возможность: изменить его вручную на одном сервере. Получите зашифрованный пароль из / etc / shadow. Теперь сделайте что-то вроде этого:

for host in $HOST_LIST; do
    ssh $host "passwd -p 'encrypted_passwd' user"
done

Конечно, «encrypted_passwd» - это то, что вы получили из / etc / shadow, где вы вручную изменили пароль. А $ HOST_LIST - это список хостов, где вы хотите изменить пароль. Его можно создать просто с помощью: *

export HOST_LIST="server1 server2 server15 server67"

Или, возможно, с файлом (как предлагали другие):

export HOST_LIST=`cat host_list.txt`

Где файл "host_list.txt" содержит список всех систем, где вы хотите изменить пароль.

Редактировать: если ваша версия passwd не поддерживает опцию -p, у вас может быть доступна программа 'usermod'. Приведенный выше пример остается прежним, просто замените «passwd» на «usermod».

Кроме того, вы можете рассмотреть полезный инструмент pdsh , который упростил бы приведенный выше пример до следующего вида:

echo $HOST_LIST | pdsh -Rssh -w- "usermod -p 'encrypted_passwd' user"

Последнее, на что следует обратить внимание: зашифрованный пароль, скорее всего, содержит знак доллара ('$') в качестве разделителя полей. Вероятно, вам придется экранировать те, что есть в вашем цикле for или команде pdsh (т. Е. "$" Становится "\ $").

2 голосов
/ 26 июня 2013
  1. Установка sshpass на любой сервер, с которого вы хотите выполнить скрипт.

    yum -y install sshpass
    
  2. Подготовьте текстовый файл, в который необходимо передать такие данные, как Хост , Имя пользователя , Пароль и Порт, (По вашему требованию).

    192.168.1.2|sachin|dddddd|22
    
  3. Подготовьте файл сценария, используя следующую информацию.

    #!/bin/bash
    
    FILE=/tmp/ipaddress.txt
    
    MyServer=""
    MyUser=""
    MyPassword=""
    MyPort=""
    
    exec 3<&0
    exec 0<$FILE
    
    while read line
    do
        MyServer=$(echo $line | cut -d'|' -f1)
        MyUser=$(echo $line | cut -d'|' -f2)
        MyPassword=$(echo $line | cut -d'|' -f3)
        MyPort=$(echo $line | cut -d'|' -f4)
    
        HOST=$MyServer
        USR=$MyUser
        PASS=$MyPassword
    
        sshpass -p $PASS ssh -p $MyPort -o StrictHostKeychecking=no $USR@$HOST \
                -T "echo 'sachin@patel' | passwd --stdin root"                 \
                < /dev/null | tee -a output.log
    done
    
    exec 0<&3
    
1 голос
/ 15 мая 2014

Сценарий passmass ( man-страница ), который поставляется вместе с Expect, не требует установки Expect на удаленных компьютерах.

1 голос
/ 23 ноября 2011
1 голос
/ 23 ноября 2011

Можете ли вы использовать Perl?

Здесь есть скрипт, который меняет пароль в наборе хостов.

Если требуются некоторые модули Perl ( Net :: OpenSSH :: Parallel , Expect и их зависимости), установленные на локальном компьютере, на котором выполняется скрипт, но ничего на удаленных серверах, где пароль должен быть изменен.

...