Как создать исполняемый скрипт bash для этих команд?

Я хочу создать исполняемый скрипт bash, который будет запускать следующие команды как root, то есть, используя sudo su

iptables-save | awk '/^[*]/ { print $1 } /^:[AZ]+ [^-]/ { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | iptables-restore 

Моя первая попытка создания сценариев bash заключается в следующем:

 #!/bin/bash sudo su iptables-save | awk '/^[*]/ { print $1 } /^:[AZ]+ [^-]/ { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | iptables-restore sleep 3; exit 0 

Может ли кто-то исправить вышеизложенное и сделать его работоспособным?

One Solution collect form web for “Как создать исполняемый скрипт bash для этих команд?”

Сценарии оболочки не совсем то же самое, что печатать на терминале.
Что произойдет, так это то, что iptables-save будет ждать завершения sudo su , а затем запустится. Вы хотите запустить iptables-save внутри sudo .

Во-вторых, sudo su относится к числу примеров «бесполезного использования». Соответствующий эквивалент
sudo -i .

Есть два подхода, которые вы можете предпринять для решения этого.

Способ 1

 sudo -i <<'EOF' iptables-save | awk '/^[*]/ { print $1 } /^:[AZ]+ [^-]/ { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | iptables-restore EOF 

Это в основном запускает корневую оболочку и отправляет эту команду через оболочку.
Причина, по которой мы не просто добавляем sudo перед командами iptables-save и iptables-restore заключается в том, что он одновременно запускает 2 sudo s. Это не работает, если они оба пытаются запросить пароль.
Таким образом, это решение работает вокруг проблемы, только запустив один sudo .

Одна линия
В соответствии с запросом в вашем комментарии вы можете сделать это в одной строке, но читать его становится гораздо труднее.

 sudo -i sh -c 'iptables-save | awk '\''/^[*]/ { print $1 }; /^:[AZ]+ [^-]/ { print $1 " ACCEPT" ; }; /COMMIT/ { print $0; }'\'' | iptables-restore' 

Способ 2

 sudo -v sudo -n iptables-save | awk '/^[*]/ { print $1 } /^:[AZ]+ [^-]/ { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | sudo -n iptables-restore 

Это решение выполняется sudo в первый раз, без какой-либо команды, просто -v . Это приводит к тому, что sudo запрашивает пароль, если ваш сеанс истек. Тогда любые команды, запускаемые в этом окне срока действия сеанса, не требуют пароля. Таким образом, запуск 2 sudo s в то же время уже не является проблемой, так как ни один из них не будет запрашивать (мы добавляем -n чтобы быть абсолютно уверены в этом. Он будет вызывать ошибку, если попытается).

  • Как скрипт может выполнять привилегированные команды на удаленной системе без паролей sudo или ssh?
  • Как получить простые скрипты, которые, как представляется, нуждаются в корневых привилегиях для запуска через пользователя www-data?
  • как указать редактор для `sudo netctl edit`?
  • Это плохая идея добавить себя в группу sudo?
  • Как заставить / dev / fd запускать сценарии оболочки в sudo safe?
  • Как дать пользователю такую ​​возможность, как root с visudo?
  • переключиться на пользователя sudo с командой AND не работает
  • Как автоматически ввести льготный период sudo при входе в CLI?
  • отключить запрос пароля sudo для сценария загрузки
  • Как предоставить кому-то еще доступ к моему серверу linux
  • Что отличает «su - username», а затем команда и команда «sudo -u username»,
  • Linux и Unix - лучшая ОС в мире.