Скрипт для изменения аутентификации пароля root с учетной записью sudo с включенным паролем

Я хочу изменить корневой пароль нескольких серверов. Для этого я использовал оболочку с циклом for и утилитой chpasswd. Поскольку учетная запись sudo включена с паролем, она запрашивает пароль sudo каждый раз, когда я выхожу из сценария.

Ниже приведен скрипт bash, написанный на bash. Но всегда просит пароль.

#!/bin/bash
pass="PASSWORD"

for i in $(cat serverlist)

do

ssh -t sudouser@$i "sudo chpasswd <<EOF

root:"$pass"

EOF" ;

done

Полностью автоматизированный bash для смены пароля root.


person Paul Jany Godwin    schedule 15.07.2019    source источник
comment
Пожалуйста, правильно отформатируйте код, используя обратные кавычки.   -  person BakaKuna    schedule 15.07.2019
comment
В другом ответе предлагается использовать expect для этого сценария: stackoverflow.com/questions/8236699/   -  person BakaKuna    schedule 15.07.2019


Ответы (2)


Я также думаю, что вы должны использовать expect. Сценарий, который я написал, не полностью протестирован, так как у меня нет сервера, на котором я могу менять пароли :-)

#!/bin/bash

read -p "Server username? " USERNAME
read -sp "Server password for ${USERNAME}? " PASSWORD

echo
read -p "Name of file containing server list? " S_FILE
read -p "User to change on servers? " S_USERNAME
read -sp "New password for user ${S_USERNAME}?" S_PASSWORD
echo

while IFS= read -r SERVER; do
        [ ! -z "${SERVER}" ] || continue
        expect <<-EOF
                spawn ssh ${USERNAME}@${SERVER}
                expect "*: " { send "${PASSWORD}\r" }
                expect "*$ " { send "echo '${S_USERNAME}:${S_PASSWORD}' | sudo chpasswd\r" }
                expect "*: " { send "${PASSWORD}\r" }
                expect "*$ " { send "exit\r" }
EOF
        echo
done < ${S_FILE}
exit $?
person Bayou    schedule 15.07.2019

Написание скрипта для автоматического выполнения корневых задач опасно. Все, что вам нужно, это одна машина, которая будет вести себя не так, как вы ожидаете, и ваш автоматизированный подход не сработает. Хуже того, вы можете оказаться в плохом состоянии, возможно, даже не осознавая, что что-то пошло не так.

Похоже, это отлично подходит для csshx (или чего-то подобного). Используйте его, чтобы вручную применить любые изменения, которые вы хотите, параллельно на нескольких хостах. Например, вы можете подключиться к 16 хостам сразу следующим образом:

csshx host[1-16]

затем введите команды и посмотрите вывод для каждого хоста.

Если это кажется неосуществимым из-за количества имеющихся у вас машин, я бы возразил, что это намного безопаснее, чем скрипты, и — даже если «медленно» — общее время, затраченное на это, вполне может быть меньше, чем на попытку создать автоматизированное решение. ;)

person kaan    schedule 16.07.2019