Безопасный перезапуск служб на нескольких удаленных серверах

Мне нужно написать сценарий, чтобы я и мои коллеги могли перезапускать различные службы на нескольких серверах. Мы все подключаемся к серверам с помощью LDAP, поэтому я хотел бы, чтобы мой скрипт подключал наших пользователей LDAP к серверу, а затем использовал sudo для перезапуска служб (я могу написать скрипт на каждом сервере для перезапуска всех необходимых служб). Сейчас сценарий просто выполняет команду типа

ssh -t user@host "sudo service XXX restart" 

Проблема в том, что для каждого сервера сценарий запрашивает пароль пользователя дважды (один раз для ssh-соединения и два раза для команды sudo). Моей первой догадкой было запросить у пользователя логин и пароль с помощью read -s -p, а затем использовать переменную для автоматического входа по ssh. По-видимому, Expect является способом сделать это, но я не нашел способа безопасно запросить пароль в сценарии Expect или запросить его в сценарии bash и безопасно передать переменную в сценарии expect.

Я нашел такие решения, как pssh, кластерный ssh, которые, кажется, работают, но не с sudo. Я понимаю, что лучший способ сделать это с помощью ssh ключей, но поскольку скрипт должен использоваться несколькими пользователями, я хотел бы использовать логин/пароль LDAP.

0
задан 28 July 2021 в 12:48
1 ответ

Как предположил Гленн в комментариях, правильный способ сделать это — использовать stty :

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"
0
ответ дан 9 August 2021 в 12:35

Теги

Похожие вопросы