암호를 묻지 않고 스크립트에서 명령을 어떻게 sudo합니까?


107

매일 시스템을 자동으로 켜고 싶습니다. 그래서 파이썬 스크립트에서 아래 코드를 사용하지만 sudo매번 암호를 묻습니다.

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

sudo매번 비밀번호 를 묻지 않고이 스크립트를 어떻게 실행할 수 있습니까?


4
메인 보드 매뉴얼이나 BIOS에서이 동작을 지원하는지 확인해야합니다. 나는 그것이 질문을 회피한다는 것을 안다! =] 그러나 충분한 해결책 일 수 있습니다.
Alex Hirzel 2016 년

답변:


149

참고 : 로그인 비밀번호를 일반 텍스트, 명령 또는 파일로 입력하는 방법은 안전하지 않으므로 사용해서는 안됩니다!

올바른 방법은 설정에 그것을 할 수 sudo있도록 단지 즉 당신이 필요로하는 하나 개의 특정 명령이 echo date... > rtc...암호를 필요없이 실행할 수있다.

1 단계. 해당 명령만으로 쉘 스크립트 작성

  • gedit예를 들어, 좋아하는 편집기를 열고 스크립트를 작성하십시오.pydatertc.sh
  • 이 행만 삽입하고 예를 들어 홈 디렉토리에 저장하십시오.
    반향 날짜 \ '+ % s \'-d \ '+ 24 시간 \'> / sys / class / rtc / rtc0 / wakealarm
  • 편집기를 종료하고 터미널에서 스크립트를 실행 가능하게 하고 소유권을 root로 변경하십시오 . 그렇지 않으면 시스템에 액세스 할 수있는 다른 사용자가 암호없이 루트 로 원하는 명령을 편집하고 실행할 수 있습니다.
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

2 단계. pydatertc.sh비밀번호없이 실행할 수 있도록 sudo 설정

  • sudo visudo터미널에 입력 하여 sudo 권한 ( sudoers) 파일을여십시오.
  • 25 행 경에 다음 행이 표시됩니다. %sudo ALL=(ALL:ALL) ALL
  • 해당 행 아래에 다음 행 을 삽입 username하십시오. 사용자 이름은 다음과 같습니다 .
    username ALL = (ALL) NOPASSWD : /home/username/pydatertc.sh
  • 에디터 종료 ( 나노 인 경우 Ctrl+ )X

3 단계. 파이썬 스크립트를 수정하여 호출 pydatertc.sh

  • 줄을 다음과 같이 변경하십시오.
    os.system ( 'sudo /home/username/pydatertc.sh')

이제 스크립트는 암호를 요구하지 않고 실행해야 계정, 데이터 또는 시스템의 보안을 손상시키지 않고!


다음에 대한 대안 wakealarm(일반적인 용도는 아님) :

에서 이러한 특정 경우 이후, /sys/class/rtc/rtc0/wakealarm파일은 시스템의 모닝콜 알람을 제어하고, 그렇지 않으면 무해한, 또 다른 암호를 방지하는 것은 하나가와 해당 파일의 소유권을하는 것입니다 chown(당신이 알람을 설정하는 유일한 사용자 인 경우) 또는 chmod +666;로 세계 쓰기 가능하게 만드십시오 . 이 경우 단순히 sudo파이썬 호출에서 를 제거하고 sh -c "...."그대로 유지하십시오.


1
굉장한 방법입니다.
roadmr 2016 년

1
그러한 상세하고 유용한 답변과 정확히 어떻게 수행해야 하는가.
ArtOfCode

@RobertRosati, 제안 된 편집에 감사드립니다. 처음에는 그것을 잊어서는 안됩니다!
ish

1
@ m-ric이 줄 위에서 명령을 읽었습니까? "그렇지 않으면 시스템에 액세스 할 수있는 다른 사용자가 암호없이 루트로 원하는 명령을 편집하고 실행할 수 있습니다"
Tobias Kienzler

2
이 답변이 오래 되었다는 것을 알고 있지만 여전히 문제가 있습니다. 파일이 / home / username있으면 악의적 인 사용자 (또는 루트가 아닌 루트 로그인)가 해당 디렉토리를 쓸 수 있으면 시스템이 손상 될 수 있습니다 타협) . 파일을 제거하거나 이름을 바꾸고 다른 스크립트를 제자리에 놓고 비밀번호없이 스크립트를 실행할 sudo 있습니다. 따라서 / usr / sbin 또는 / root와 같이 루트 만 변경할 수있는 디렉토리에 스크립트를 배치하는 것이 훨씬 안전 합니다 . 그렇지 않으면 LGTM입니다.
NVRAM

30

경고!

로그인 비밀번호를 일반 텍스트, 명령 또는 파일로 입력하는 것은 매우 안전하지 않으며 개인 데이터 및 시스템을 손상시킬 수 있습니다. 이되어 적극 추천 당신이 당신의 시스템이 "개인"또는 "안전한 장소"로 생각하는 경우에도이 작업을 수행 결코!

스크립트가 개인적인 용도로만 사용되며 안전한 곳에 보관하고 계정 도난을 두려워하지 않는 경우 간단한 해결책은 다음과 같습니다.

echo LOGINPASSWD | sudo -S COMMAND HERE

여기서 LOGINPASSWD는 로그인 비밀번호 (예 : iloveponies)이고 COMMAND HERE는 sh -c "echo da.와 같이 sudo 뒤에 오는 명령입니다.


13
@Viswa, 비밀번호를 일반 텍스트로 표시하는 것은 매우 위험합니다. 그렇게하지 말 것을 강력히
Anwar

3
-1 이것이 좋은 생각처럼 보인다면, 루트 계정에 암호를 설정하고 z7sg의 솔루션을 사용하는 것이 좋습니다. 그것은 쉽고 간단하며이 위험한 보안 문제를 일으키지 않습니다.
브라이스

4
하! 내 대답에 6 개의 공감대와 4 개의 공감대가있었습니다.하지만 왜 사람들은 '개인 사용', '안전한 장소'등을 지우지 않았습니까? 이 파일을 제공하지 않고 ssh 서버를 실행하지 않으면 보안 문제가 없습니다! 스크립트가 개인적인 용도로 안전한 장소에서 제공되는 보안 문제는 어디에 있습니까?
hytromo 2016 년

5
하향식으로, 이것은 어두운쪽으로가는 길이며 sudo 방법에는 필요하지 않습니다.
플로이드

4
해커가 계정에 간단한 사용자로 로그인 한 경우에도 / usr / share / help / lv / ubuntu-help에서 비밀번호를 사용하여 스크립트를 찾는 방법은 무엇입니까?
hytromo

21

한 시간 또는 낮에 특정 시간에 스크립트를 실행하지 않으려면 루트의 홈 디렉토리 ( /root) 안에 스크립트를 넣고 시스템 crontab ( /etc/crontab) 에서 스크립트를 루트로 실행하십시오 . 그러면 보안을 손상시킬 필요가 없습니다.

crontab에 스크립트를 추가하는 방법 은 https://help.ubuntu.com/community/CronHowto 를 참조 하십시오 .


4
anacron연중 무휴 24 시간 실행되지 않는 데스크톱 / 노트북 인 경우 사용하고 싶을 것입니다.
balki

예를 들어 스크립트를 작성하여 업데이트를 확인하고 해당 정보를 사용하여 필요한 업데이트에 대해 관리자에게 전자 메일을 보내는 경우 유용한 답변입니다. 개인적으로 많은 스크립트가 서버 자동화에 사용되므로 sudo crontab -e 만 사용하면됩니다. +1
Rab

11

위의 훌륭한 답변에서 언급되지 않은 sudo의 또 다른 멋진 기능은 'timestamp_timeout'변수입니다. 대화식 비밀번호 입력시 저장하기 위해 증가시킬 수있는 sudo 변수입니다.

예를 들어, / etc / sudoers (또는 그 안에 포함 된 파일 중 하나)에서 기본값을 수정할 수 있습니다.

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

'man sudoers'의 전체 설명 :

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

물론 이것은 cron에서 명령을 실행하는 특정 경우에 도움이 될 수 없습니다. 그러나 알고있는 것이 좋습니다.


0
export MY_SUDO_PASS="user_password_here"

작동 유형인지 테스트하려면 다음을 수행하십시오.

echo $MY_SUDO_PASS
> user_password_here

"sudo apt-get update"를 실행하고 이전에 작성한 환경 변수의 비밀번호를 승인하려면 다음을 수행하십시오.

echo $MY_SUDO_PASS | sudo -S apt-get update

파이썬에서 실행하십시오 (예 : 디렉토리 소유권을 재귀 적으로 username_here로 변경).

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS get 's password -S 스위치를 잡고 sudo에 암호를 전달


이것이 기존의 답변에 무엇을 추가하는지 잘 모르겠습니다. 최신 BIOS 지원 알람 발생시
Geek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.