다음 bash 스크립트가 있다고 가정해 보겠습니다.
#!/bin/bash
sudo command1
command2
sudo command3
command2
나는 루트로 실행하고 싶지 않기 때문에 sudo
. sudo command1
안타깝게도 command2
완료하는 데 약 2시간이 걸립니다. 따라서 sudo 자격 증명 타임스탬프가 시간 초과되고 스크립트가 도착하면 sudo command3
비밀번호를 다시 입력하라는 메시지가 표시됩니다.
에 설명된 대로 sudo 자격 증명 타임스탬프 시간 초과를 완전히 비활성화하고 싶지 않습니다.https://superuser.com/a/149740예를 들어. 제한 시간을 일시적으로 비활성화하여 이 bash 세션이 끝날 때까지 해당 세션에 대한 자격 증명을 효과적으로 유지하고 싶습니다.
답변1
sudo
최선의 선택은 sudo 타임스탬프를 새로 고치고 더 이상 권한이 필요하지 않을 때 종료하는 (백그라운드) 바쁜 대기 루프라고 생각합니다 . 다음은 sleep 6
two hour 대신 실행되고 및 대신 표시되는 명령을 command2
실행하는 샘플 스크립트입니다 ./bin/echo
command1
command2
#!/bin/sh
sudo /bin/echo command 1
while :; do sudo -v; sleep 1; done &
infiloop=$!
sleep 6
sudo /bin/echo command 3
kill "$infiloop"
실제 스크립트의 경우 보다 편안한 루프를 사용하는 것이 좋습니다.
#!/bin/sh
sudo command1
while :; do sudo -v; sleep 59; done &
infiloop=$!
command2
sudo command3
kill "$infiloop"
sleep 59
sudoers의 기존 설정을 기반으로 플레이버를 조정합니다 timestamp_timeout
. 타임스탬프 시간 제한이 60초인 경우 선택할 수 있는 방법을 보여주기 위해 59를 선택했습니다.
답변2
해결책이 매우 분명해 보이기 때문에 여기서 뭔가를 놓치고 있는 것 같습니다.
command2
루트로 실행하고 싶지 않으므로sudo
.
그러나 스크립트를 변경하면 sudo
루트로 실행하지 않고도 전체 스크립트를 실행할 수 있습니다.command 2
#!/bin/bash
command1
sudo -u ${SUDO_USER:-$USER} command2
command3
답변3
통과상쾌함백엔드 자격 증명:
#!/bin/bash
configurePermissions () {
sudo -v
refreshPermissions "$$" &
}
refreshPermissions () {
local pid="${1}"
while kill -0 "${pid}" 2> /dev/null; do
sudo -v
sleep 10
done
}
configurePermissions
답변4
뭐, 합쳐질 수도 있지명령을 실행한 후 sudo가 자동으로 비밀번호를 잊어버리게 만드는 방법은 무엇입니까?그리고"sudo -S"를 명시적으로 사용하는 목적은 무엇입니까?
- 사용자 비밀번호를 읽고 환경 변수에 저장합니다.
sudo
자격 증명을 무시하려면 플래그를 사용하여 실행하면-k
항상 비밀번호를 묻는 메시지가 표시됩니다.- 플래그를 통해
stdin
비밀번호를 전달합니다 .sudo
-S
- 비밀번호 환경 변수 제거
어떤 경우에는 유용할 수 있지만 사용자의 비밀번호를 환경 변수에 저장하는 것이 좋은 생각인지 잘 모르겠습니다.