
Мне нужно написать скрипт, чтобы мои коллеги и я могли перезапускать различные службы на нескольких серверах. Мы все подключаемся к серверам с помощью LDAP, поэтому я хочу, чтобы мой скрипт подключал наших пользователей LDAP к серверу, а затем использовал sudo для перезапуска служб (я могу написать скрипт на каждом сервере, чтобы перезапустить все необходимые службы). Сейчас скрипт просто запускает команду типа
ssh -t user@host "sudo service XXX restart"
Проблема в том, что для каждого сервера скрипт дважды запросит пароль пользователя (один раз для соединения ssh и два раза для команды sudo). Моей первой догадкой было запросить у пользователя логин и пароль с помощью read -s -p, а затем использовать переменную для автоматического входа с помощью ssh. По-видимому, Expect — это способ сделать это, но я не нашел способа безопасно запросить пароль в скрипте Expect или запросить его в скрипте bash и безопасно передать переменную в скрипте expect.
Я искал решения, такие как pssh, cluster ssh, которые, кажется, работают, но не с sudo. Я понимаю, что лучший способ сделать это — с ключами ssh, но поскольку скрипт должен использоваться несколькими пользователями, я бы хотел использовать логин/пароль LDAP.
решение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"