Вопрос или проблема
У меня возникли проблемы с приведенным ниже скриптом. Я пытаюсь заменить строку в файле /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
Разбор изменений
-
Исправление доступа к переменной
$pw
:- Замените
env(pw)
на$pw
для корректного доступа к переменной пароля.
- Замените
-
Корректное использование
expect
:- Поскольку
expect
является отдельной сущностью, она не имеет доступа к переменным окружения Bash. Убедитесь, что переменные, такие как$pw
, доступны внутри блокаexpect
.
- Поскольку
-
Использование
sudo
безsu
:- Ваша команда уже использует
sudo
, так что нет необходимости добавлятьsu -
. Это упрощает команду.
- Ваша команда уже использует
-
Правильное использование кавычек:
- Используйте одинарные кавычки для блока
EOF
, чтобы избежать интерпретации переменных, когда вы передаете их вexpect
.
- Используйте одинарные кавычки для блока
-
Безопасность:
- Обратите внимание, что хранение паролей в скриптах может подвергать вашу систему риску. Рекомендуется использовать более безопасные способы, такие как SSH-ключи, безпарольный доступ для
sudo
для соответствующих пользователей, или менеджеры паролей.
- Обратите внимание, что хранение паролей в скриптах может подвергать вашу систему риску. Рекомендуется использовать более безопасные способы, такие как SSH-ключи, безпарольный доступ для
Заключение
Ваш скрипт теперь должен работать без ошибок. Убедитесь, что вы тестируете его в безопасной среде перед развертыванием в настоящей системе. Замена строк в файле /etc/sudoers
может иметь критическое значение, поэтому всегда делайте резервные копии перед внесением изменений.