이러한 명령에 대해 실행 가능한 bash 스크립트를 어떻게 만들 수 있습니까?

이러한 명령에 대해 실행 가능한 bash 스크립트를 어떻게 만들 수 있습니까?

다음 명령을 루트로 실행하는 실행 가능한 bash 스크립트를 만들고 싶습니다(예: sudo su 사용).

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

Bash 스크립트에 대한 첫 번째 시도는 다음과 같습니다.

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

누군가 위의 내용을 수정하고 작동하게 할 수 있습니까?

답변1

쉘 스크립트는 터미널에 입력하는 것과 완전히 동일하지 않습니다. 완료될 때
까지 iptables-save기다린 sudo su후 실행됩니다. 당신이 원하는 것은 iptables-save에 있습니다 sudo.

둘째, sudo su"쓸모없는 사용"의 예입니다. 올바른 값은 입니다
sudo -i.

이 문제를 해결하기 위해 취할 수 있는 접근 방식에는 두 가지가 있습니다.

방법 1

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

이것은 기본적으로 루트 쉘을 시작하고 해당 쉘을 통해 명령을 보냅니다. and 명령 앞에 a를 추가
하지 않는 이유는 동시에 2초 동안 시작되기 때문입니다. sudo이 접근 방식은 모두가 비밀번호를 묻는 메시지를 표시하려고 하면 제대로 작동하지 않습니다. 따라서 해결책은 하나만 시작하는 것입니다.iptables-saveiptables-restoresudo
sudo

한 줄
귀하의 의견에서 요청한 대로 이 작업을 한 줄로 수행할 수 있지만 읽기가 더 어려워집니다.

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

 

방법 2

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

솔루션은 sudo명령 없이 처음으로 실행됩니다 -v. sudo세션이 만료된 경우 비밀번호를 묻는 메시지가 표시됩니다. 해당 세션 만료 창 내에서 실행되는 모든 명령에는 암호가 필요하지 않습니다. 따라서 sudo2개를 동시에 실행하는 것은 어느 쪽도 메시지를 표시하지 않으므로 더 이상 문제가 되지 않습니다( -n이를 보장하기 위해 추가했습니다. 시도하면 오류가 발생합니다).

관련 정보