Script для изменения пароля на серверах linux через ssh
В нашей ИТ-среде есть несколько серверов Linux Red Hat. Мои члены моей команды просят написать script (желательно оболочку script), чтобы изменить пароль пользователя на каждый из них за один проход, используя SSH.
Я попытался найти решение, но многие из скриптов, которые я нашел, используют Expect. У нас нет Expect, установленного на наших серверах, и администраторы системы отказались нам его установить. Кроме того, у пользователей нет корневого доступа, поэтому passwd --stdin
или chpasswd
не могут быть использованы.
Можно ли записать script, чтобы пользователь мог запустить его и изменить пароль только своего пользователя на всех серверах в списке?
Ответы
Ответ 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
Ответ 3
Вы должны попробовать pssh (параллельно ssh одновременно).
cat>~/ssh-hosts<<EOF
[email protected]
[email protected]
[email protected]
EOF
pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'
Ответ 4
Основываясь на примере squashbuff, я попробовал следующее, которое хорошо сработало для меня:
#!/bin/bash
for server in `cat hostlist`; do
echo $server;
ssh [email protected]$server 'passwd <<EOF
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, но ничего на удаленных серверах, где необходимо изменить пароль.
Ответ 10
Вы пробовали App:: Unix:: RPasswd
Ответ 11
passmass script (справочная страница), который поставляется с Expect, не требует установки Expect на удаленных компьютерах.
Ответ 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, и вам не нужно вручную изменять пароли через кучу серверов. Пользователь меняет свой пароль один раз, и это делается через мастер домена.