하나의 명령으로 su + sudo를 수행하는 방법은 무엇입니까?

하나의 명령으로 su + sudo를 수행하는 방법은 무엇입니까?

내 아들(sudoer 아님)이 로그인되어 있습니다.그의터미널, 가끔 인터넷 차단을 해제하고 싶은 경우가 있습니다 iptables(재부팅 후 다시 나타남 ;)).

son$ su dad
<enter password>
dad$ sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT
<re-enter password>

한 줄에 비밀번호를 한 번만 입력할 수 있는 방법이 있나요?

나는 비슷한 것을 시도했지만 su dad -c "sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT"성공하지 못했습니다 sudo: no tty present and no askpass program specified.

(아마도 .sh를 사용할 수도 있지만 비밀번호를 두 번 입력하는 문제는 해결되지 않습니까?)

답변1

@roaima의 의견 덕분에 방금 root에 대한 비밀번호를 만들었습니다(Ubuntu에서는 기본적으로 비활성화되어 있습니다). sudo passwd root그런 다음 다음과 같은 간단한 방법을 사용할 수 있습니다.

su -c "iptables -D OUTPUT -m owner --uid-owner son -j REJECT"
<enter password only once>

답변2

다음 expect스크립트를 사용하세요.

#!/usr/bin/expect 

log_user 0
spawn /bin/su - dad
expect "*: "
stty -echo
send_user "Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
send "$expect_out(1,string)\r"
send "sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT; echo done\r"
expect "*: "
send "$expect_out(1,string)\r"
expect "done\n"

man 1 expect자세히보다. stty -echo과 사이의 줄은 stty echo비밀번호를 읽는 역할을 담당합니다. 스크립트 자체에 비밀번호를 포함하는 것이 가능하지만 아마도 원하지 않을 것입니다. 비밀번호는 한 번 읽고 두 번 제공됩니다( send "$expect_out(1,string)\r").

스크립트는 멍청하며 제공된 비밀번호가 유효한지 상관하지 않습니다. 필요한 경우 개선하십시오.

관련 정보