Как создать исполняемый скрипт 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 и длительной задержкой
  • Запретить `apt-get`,` yum` устанавливать бинарные файлы setuid, когда они запускаются через sudo
  • QStandardPaths: XDG_RUNTIME_DIR не установлен, по умолчанию используется '/ tmp / runtime-root' при запуске sudo-команд
  • notify-send from root cron
  • У меня была папка с файлами, затем я использовал «sudo mount» для монтирования share samba Windows. Куда делись файлы?
  • Как получить имя пользователя, запустившего `sudo`
  • Как запустить программу GUI как другого пользователя (Debian)?
  • Как я могу заставить hostapd_cli работать в sudo на debian stretch?
  • Корневое разрешение - имя пользователя ALL = (ВСЕ) ALL не работает
  • Запустить nvm (функция bash) через sudo
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.