Как запустить sudo с параллельным ssh

Как запустить sudo с параллельным ssh

Linux: Ubuntu 14.04.3 LTS

cat /tmp/passfile
ABCxyz123

sshpass -f /tmp/passfile parallel-ssh -I -A -h hostlist.txt "sudo -S ls -l /root" < /tmp/passfile

и метод, описанный здесь в обсуждении Googleгруппы.google выводит ошибку как:

[1] 01:07:25 [FAILURE] 10.0.4.194 Exited with error code 255
[2] 01:07:25 [FAILURE] 10.0.4.205 Exited with error code 255

на удаленном сервере, когда я пытаюсь подключиться, в его /var/log/auth.log есть следующее сообщение

Sep 24 19:20:52 ubu1401 sshd[5765]: Accepted password for ubuntu from 10.0.4.1 port 55019 ssh2
Sep 24 19:20:52 ubu1401 sshd[5765]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
Sep 24 19:21:26 ubu1401 sshd[5765]: pam_unix(sshd:session): session closed for user ubuntu
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): conversation failed
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): auth could not identify password for [ubuntu]
Sep 24 19:22:25 ubu1401 sshd[5791]: Connection closed by 10.0.4.1 [preauth]

решение1

Чтобы обеспечить максимальную безопасность пароля, попробуйте эту версию ( psshна CentOS, Fedora и parallel-sshUbuntu, Debian):

stty -echo; printf "Password: "; read PASS; stty echo; echo "${PASS}" | \ ssh <USER>@localhost "sudo -S dmesg"

Обновление (спасибо @chutz):

read -s -p "Password: "; echo "${REPLY}" | \ ssh <USER>@localhost "sudo -S dmesg"

а затем адаптируйте его к pssh вот так (обновлено соответствующим образом):

read -s -p "Password: "; echo "${REPLY}" | \ pssh -H <USER>@localhost -o /tmp/output -I "sudo -S dmesg"

Я использую то же самое для ad hoc сбора дампов с нескольких серверов. Остановите его с помощью Ctrl+ C, как обычно. Он покажет [FAILURE] <HOST> Interrupted, но это только потому, что tcpdump в противном случае будет работать бесконечно — вывод все еще будет в обычном месте. Опция -t 0заключается в том, чтобы соединение не прерывалось по тайм-ауту. Я также мог бы использовать tmux или screen и собрать дампы позже.

read -s -p "Password: "; echo "${REPLY}" | \ pssh -h <HOSTFILE> -o /tmp/output -t 0 -I "sudo -S tcpdump -l -nn -vv -i any not port 22"

Убедитесь, что вы указали правильного пользователя ssh и что вы подключались к этим серверам ранее. Локальное тестирование обычно предотвращает отключение всего парка серверов. Вы можете использовать адреса 127.0.0.X вместо localhost для аппроксимации нескольких хостов.

решение2

Вы пробовали запустить это, выведя пароль в оболочке?

echo "echo 'yourpassword'; sudo -S -c 'ls -l /root'"|pssh -I -H hostlist.txt

решение3

Я хотел бы порекомендовать свой простой инструмент "spssh.sh" (https://github.com/tangruize/spssh) , который прост (всего 36 sloc), но достаточно полезен. В отличие от parallel-ssh, spssh.sh интерактивен и поддерживает параллельное/отдельное выполнение cmd. Надеюсь, это поможет!

решение4

Я согласен с @satch_boogieкомментарийвыше - используйте ansible, когда вам это нужно, SUDOи используйте, psshкогда вам это не нужно - на мой взгляд, это более понятно, SUDOхотя ansibleпервоначальная настройка более сложна.

Короткий ответ:Пример обновления и модернизации пакета с apt:

ansible myservers -a "sudo apt -y update" --become -K

ansible myservers -a "sudo apt -y upgrade" --become -K

Длинный ответ и настройка: В моей ситуации я использовал MacOS локально для управления удаленными машинами Linux. Я сделал следующее, что может немного отличаться, если вы используете Linux:

  1. убедитесь, что локально и на всех целевых машинах создан один и тот же пользователь:sudo adduser username
  2. добавьте пользователя в группу SUDO на каждой целевой машине:usermod -aG sudo username
  3. (возможно, необязательно) Настройкаssh без пароляхотя я не уверен, нужно ли это, но моя среда уже настроена с этим. Попробуйте сначала шаги ниже, так как это может быть не нужно для ssh без пароля.
  4. Установите ansible на локальную машину: brew install ansible(или Linux sudo apt install ansible)
  5. создайте файл hosts по умолчанию для ansible на локальном компьютере:sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
  6. редактировать файлsudo nano /etc/ansible/hosts
  7. Добавьте целевые машины в группу (IP-адрес или имя машины):
[myservers]
blah1.local
blah2.local
blah3.local
  1. (Необязательно) У меня был второй пользователь в группе SUDO на всех целевых машинах, поэтому мне пришлось временно удалить этого пользователя из группы SUDO, чтобы избежать запроса (например, когда он sudo systemctlпросит выбрать пользователя SUDO):ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. Теперь выполните нужную вам команду SUDO. Пример:ansible myservers -a "sudo apt -y update" --become -K
  3. (Необязательно) повторно добавьте другого пользователя обратно в группу SUDO:ansible myservers -a "sudo adduser otheruser sudo" --become -K

Теперь каждый раз, когда мне нужно выполнить команду SUDO на нескольких машинах, я просто повторяю шаги 8–10.

Связанный контент