, я создал очень простой сценарий оболочки для отправки команд SSH на несколько хостов. Прямо сейчас я скопировал свой ssh id, поэтому мне не нужно использовать пароль для входа на серверы. Но если я хочу для примера выполнить apt-get update
, тогда мне нужно войти в систему как root, и я уверен, что это не лучший способ сделать это? Итак, вопрос в том, как лучше всего отправить несколько команд ssh нескольким клиентам? s с правами sudo?
#!/bin/bash
# Hosts
hostarray=(
"host1"
"host2"
"host3"
)
for i in "${hostarray[@]}"; do
ssh "$i" "command here"
done
Как было предложено выше, Ansible может справиться с этим более элегантно с помощью параметров «--become --become-method = sudo --ask-стать-пароль». Однако вы можете, например, поместить это в файл с именем /etc/sudoers.d/puppet (при условии, что ваш удаленный пользователь называется puppet - присвоение имени необязательно, но это помогает мне не усложнять задачу):
Defaults:puppet !requiretty
puppet ALL=(ALL) NOPASSWD: ALL
Это удаляет необходимость ввода пароля и необходимость в tty.
Вы получаете ошибку tty, потому что sudoers настроен на использование TTY. https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-password
Вы можете попробовать запустить ssh с опцией -tt
, которая принудительно выделяет tty. https://www.freebsd.org/cgi/man.cgi?query=ssh&sektion=1
ssh -tt user@host
вы также можете скопировать свой открытый ключ в ~ root / .ssh / authorized_keys
на каждом удаленном хосте, а затем
ssh root@"$i" "command"
Если безопасность не является проблемой, и это закрытая среда, это может облегчить вашу жизнь. В противном случае я не рекомендую это и бы установил значения по умолчанию в sudo на not requiretty или, возможно, принудительное выделение tty, как упомянуто выше с
ssh -tt "$i" "command"