ожидайте скрипт внутри bash, выполняющего замену /etc/sudoers по удаленному ssh

Вопрос или проблема

У меня возникли проблемы с приведенным ниже скриптом. Я пытаюсь заменить строку в файле /etc/sudoers, но мне нужно сделать это с помощью sudo и либо ввести свой пароль, либо, как в данном примере, поместить его в переменную.

#!/bin/bash
#
pw=“P@ssword!20@$”
#
while IFS= read -r host
do
  echo "$host"
  ping -c1 "$host" > /dev/null 2>&1
  returncode=$?
    if [ $returncode -ne 0 ]
      then
        echo "$host недоступен";echo
      else
        echo "ping успешен на $host"
        echo "в данный момент изменяется файл /etc/sudoers"
        sleep 3
        export host
        expect <<'EOF'
        spawn ssh -t myuserid@$env(host) "sudo -S su - myuserid -c sed -i ‘/myuserid ALL=(ALL) ALL/c\myuserid ALL=(ALL) NOPASSWD: ALL/ /etc/sudoers'"
        expect "\[sudo] пароль для myuserid:”
        send "$env(pw)\n"
        expct eof
EOF

    fi
done < serverlist.txt

Вывод, который я получаю:

ping успешен на myserver.example.com в данный момент изменяется файл /etc/sudoers
spawn ssh -t [email protected] sudo -S su – myuserid -c
sed -i ‘/myuserid ALL=(ALL) ALL/c\myuserid ALL=(ALL) NOPASSWD: ALL/
/etc/sudoers’ [sudo] пароль для myuserid: переменной не существует
(чтение трассировки на “env(pw)”)
вызвано внутри “send “$env(pw)\n””

Спасибо за вашу помощь!!!

Ответ или решение

Решение проблемы со скриптом для замены строки в файле /etc/sudoers через SSH

Вы столкнулись с проблемой, связанной со скриптом на Bash, который должен выполнять замену строки в файле /etc/sudoers на удаленном сервере через SSH. Давайте рассмотрим вашу проблему и предложим несколько эффективных решений.

Проблема

Из вашего описания видно, что идет ошибка с переменной pw. Эта ошибка возникает из-за некорректного синтаксиса в строке, где вы пытаетесь использовать переменную. Вы используете env(pw) вместо $pw, что приводит к ошибке: "no such variable". Также важно заметить, что работа с файлом /etc/sudoers требует особой осторожности, так как неверное изменение может привести к потере доступа к системе.

Оптимизированный скрипт

Вот как может выглядеть ваш скрипт с внесенными исправлениями:

#!/bin/bash

pw="P@ssword!20@$"

while IFS= read -r host; do
  echo "$host"
  ping -c1 "$host" > /dev/null 2>&1
  returncode=$?

  if [ $returncode -ne 0 ]; then
    echo "$host is not reachable"; echo
  else
    echo "ping successful on $host"
    echo "modifying /etc/sudoers file now"
    sleep 3

    expect << 'EOF'
    spawn ssh -t myuserid@$host "sudo -S sed -i '/myuserid ALL=(ALL) ALL/c\\myuserid ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers"
    expect "[sudo] password for myuserid: "
    send "$pw\n"
    expect eof
EOF

  fi
done < serverlist.txt

Разбор изменений

  1. Исправление доступа к переменной $pw:

    • Замените env(pw) на $pw для корректного доступа к переменной пароля.
  2. Корректное использование expect:

    • Поскольку expect является отдельной сущностью, она не имеет доступа к переменным окружения Bash. Убедитесь, что переменные, такие как $pw, доступны внутри блока expect.
  3. Использование sudo без su:

    • Ваша команда уже использует sudo, так что нет необходимости добавлять su -. Это упрощает команду.
  4. Правильное использование кавычек:

    • Используйте одинарные кавычки для блока EOF, чтобы избежать интерпретации переменных, когда вы передаете их в expect.
  5. Безопасность:

    • Обратите внимание, что хранение паролей в скриптах может подвергать вашу систему риску. Рекомендуется использовать более безопасные способы, такие как SSH-ключи, безпарольный доступ для sudo для соответствующих пользователей, или менеджеры паролей.

Заключение

Ваш скрипт теперь должен работать без ошибок. Убедитесь, что вы тестируете его в безопасной среде перед развертыванием в настоящей системе. Замена строк в файле /etc/sudoers может иметь критическое значение, поэтому всегда делайте резервные копии перед внесением изменений.

Оцените материал
Добавить комментарий

Капча загружается...