Как создать исполняемый скрипт 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 чтобы быть абсолютно уверены в этом. Он будет вызывать ошибку, если попытается).

  • Sudoers: разрешить любую подкоманду для определенного аргумента
  • Какая потребность в команде `fakeroot` в Linux?
  • SFTP и sudo с использованием клиента Windows?
  • Отсутствуют параметры административной панели Webmin.
  • Как выполнить недавно установленное приложение с Sudo?
  • Как установить фреймворк на удаленном сервере без привилегий root
  • Политика корневого паролей и обновление
  • «Nohup sudo ...» не запрашивает passwd и ничего не делает
  • Как выполнить скрипты корневой команды от пользователя root не с использованием SUID?
  • Почему sudo openvpn не может работать здесь?
  • как получить доступ к другому пользователю может получить доступ к моей учетной записи?
  • Судо доступ к учетной записи другого пользователя
  • Linux и Unix - лучшая ОС в мире.