Подтвердить что ты не робот

Script для изменения пароля на серверах linux через ssh

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

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

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

4b9b3361

Ответ 1

Удаленный компьютер не нуждается в ожидании установки. Вы можете установить ожидание на локальную рабочую станцию ​​или виртуальную машину (виртуальный бокс) или в любом поле "nix" и написать оболочку, которая вызывает этот .ex(ожидаемый) script (могут быть небольшие изменения от дистрибутива до дистрибутива, это проверено на 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

Ответ 2

Вам не нужен root-доступ для использования passwd.

Эта работа отлично работает.

passwd <<EOF
old password
new password
new password
EOF

Ответ 4

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

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

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

Ответ 5

echo "name:password" | chpasswd

Ответ 6

Другая возможность: изменить его вручную на одном сервере. Получите зашифрованный пароль из /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 (т.е. "$" Становится "\ $" ).

Ответ 7

  • Установите sshpass на любом из серверов, из которых вы хотите выполнить script.

    yum -y install sshpass
    
  • Подготовьте текстовый файл, в котором вы должны передавать данные, такие как Host, User Name, Password и Port. (Исходя из вашего требования).

    192.168.1.2|sachin|dddddd|22
    
  • Подготовьте файл script, используя приведенные ниже сведения.

    #!/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 [email protected]$HOST \
                -T "echo '[email protected]' | passwd --stdin root"                 \
                < /dev/null | tee -a output.log
    done
    
    exec 0<&3
    

Ответ 8

Альтернативой, которую вы, возможно, захотите представить своим сверстникам, было бы заставить их использовать аутентификацию без пароля. Они будут генерировать пару открытых и закрытых ключей и регистрировать свой открытый ключ в файле ~/.ssh/authorized_keys на каждом из серверов, в которые они входят.

Ответ 9

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

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

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

Ответ 12

Думаю, что я должен поместить свое решение в поле ответа - не уверен, что это должно быть частью вопроса..

Хорошо, я собрал частично работающее решение, используя предложение Дениса.

server.txt выглядит так:

server1
server2
server3
.
.
.

Я использую:

for server in `cat servers.txt`; do
ssh $server -l user 'passwd <<EOF
old_pass
new_pass
new_pass
EOF';
done

Это дает:

[email protected] password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.
[email protected] password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.

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

Ответ 13

Если у вас есть ssh, почему у вас есть пароли? Нажмите общедоступный ключ ssh пользователя на все серверы, которые они разрешили использовать, и сделайте с ним. Это также позволяет вам легко предоставлять и отзывать доступ, который вы хотите.

В предыдущем $dayjob, где у нас было буквально десятки тысяч серверов, у них была база данных, из которых инженеры были разрешены на каких серверах, а установка ключей ssh ​​была автоматизированным процессом. Почти у NOBODY был пароль на ЛЮБОЙ машине.

Ответ 14

echo -e "wakka2\nwakka2\n" | passwd root

Ответ 15

cat /tmp/passwords | ssh $server sudo chpasswd -e

если пароль зашифрован, или

cat /tmp/passwords | ssh $server sudo chpasswd

если пароль не зашифрован.

/tmp/пароли должны иметь формат "user: password"

Ответ 16

Реальный вопрос: почему они не использовали какие-то службы имен? NIS/Желтые страницы или LDAP, и вам не нужно вручную изменять пароли через кучу серверов. Пользователь меняет свой пароль один раз, и это делается через мастер домена.