다음 명령을 루트로 실행하는 실행 가능한 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-save
iptables-restore
sudo
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
세션이 만료된 경우 비밀번호를 묻는 메시지가 표시됩니다. 해당 세션 만료 창 내에서 실행되는 모든 명령에는 암호가 필요하지 않습니다. 따라서 sudo
2개를 동시에 실행하는 것은 어느 쪽도 메시지를 표시하지 않으므로 더 이상 문제가 되지 않습니다( -n
이를 보장하기 위해 추가했습니다. 시도하면 오류가 발생합니다).