ฉันจะ sudo คำสั่งในสคริปต์โดยไม่ถามรหัสผ่านได้อย่างไร


107

ฉันต้องการเปิดระบบอัตโนมัติทุกวัน ดังนั้นฉันจะใช้รหัสด้านล่างในสคริปต์ Python ของฉัน แต่sudoขอรหัสผ่านให้ฉันทุกครั้ง:

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

ฉันจะรันสคริปต์นี้โดยไม่sudoถามรหัสผ่านทุกครั้งได้อย่างไร


4
คุณควรดูในคู่มือเมนบอร์ดหรือไบออสของคุณเพื่อดูว่ารองรับพฤติกรรมนี้หรือไม่ ฉันรู้ว่ามันหลบคำถาม! =] แต่มันอาจเป็นทางออกที่เพียงพอ
Alex Hirzel

คำตอบ:


149

โปรดทราบ:วิธีการใด ๆ ที่เกี่ยวข้องกับการใส่รหัสผ่านการเข้าสู่ระบบของคุณเป็นข้อความธรรมดาในคำสั่งหรือในไฟล์ไม่ปลอดภัยและไม่ควรใช้!

วิธีที่ถูกต้องในการตั้งค่าsudoซึ่งมีเพียงคำสั่งเดียวที่คุณต้องการเช่นecho date... > rtc...ได้รับอนุญาตให้เรียกใช้โดยไม่ต้องใช้รหัสผ่าน

ขั้นตอนที่ 1 สร้างเชลล์สคริปต์ด้วยคำสั่งนั้น

  • เปิดขึ้นgedit(หรือตัวแก้ไขที่คุณชื่นชอบ) และสร้างสคริปต์เช่นpydatertc.sh
  • แทรกเฉพาะบรรทัดนี้และบันทึกไว้เช่นไดเรกทอรีบ้านของคุณ:
    echo date \ '+% s \' -d \ '+ 24 ชั่วโมง \'> / sys / class / rtc / rtc0 / wakealarm
  • ออกจากตัวแก้ไขและจากเทอร์มินัลทำให้สคริปต์ทำงานได้และเปลี่ยนความเป็นเจ้าของเป็นรูทมิฉะนั้นผู้ใช้รายอื่นที่สามารถเข้าถึงระบบของคุณอาจแก้ไขและรันคำสั่งใดก็ได้ที่พวกเขาต้องการในฐานะรูทโดยไม่ต้องใช้รหัสผ่าน
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

ขั้นตอนที่ 2 ตั้งค่า sudo เพื่ออนุญาตให้pydatertc.shดำเนินการโดยไม่ต้องใช้รหัสผ่าน

  • พิมพ์sudo visudoที่เทอร์มินัลเพื่อเปิดไฟล์ sudo Permissions ( sudoers)
  • ประมาณบรรทัดที่ 25 คุณจะเห็นบรรทัดนี้: %sudo ALL=(ALL:ALL) ALL
  • ด้านล่างบรรทัดนั้นให้แทรกบรรทัดต่อไปนี้โดยที่usernameชื่อผู้ใช้ของคุณอยู่ที่ไหน:
    ชื่อผู้ใช้ ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • ออกจากเครื่องมือแก้ไข ( Ctrl+ Xถ้าnano )

ขั้นตอนที่ 3 แก้ไขสคริปต์ python ของคุณเพื่อโทร pydatertc.sh

  • เปลี่ยนบรรทัดเป็น:
    os.system ('sudo /home/username/pydatertc.sh')

ตอนนี้สคริปต์ของคุณควรทำงานโดยไม่ต้องใช้รหัสผ่านและไม่ทำลายความปลอดภัยของบัญชีข้อมูลหรือระบบของคุณ!


ทางเลือกสำหรับwakealarm(ไม่ใช่สำหรับการใช้งานทั่วไป!):

ในกรณีเฉพาะนี้เท่านั้นเนื่องจาก/sys/class/rtc/rtc0/wakealarmไฟล์จะควบคุมการเตือนการปลุกสำหรับระบบเท่านั้นและไม่เป็นอันตรายเป็นอย่างอื่นทางเลือกอื่นเพื่อหลีกเลี่ยงรหัสผ่านก็คือการเป็นเจ้าของไฟล์นั้นด้วยchown(หากคุณเป็นผู้ตั้งค่าการเตือนเท่านั้น) หรือทำให้เป็นโลกที่เขียนได้ด้วยchmod +666; ในกรณีนี้ให้ลบการsudoเรียก Python ออกจากsh -c "...."เดิมโดยไม่ทำให้เสียหาย


1
เยี่ยมมากนี่เป็นวิธีที่ถูกต้องที่จะทำ
roadmr

1
คำตอบที่เป็นประโยชน์และมีรายละเอียดครบถ้วนและควรทำอย่างไร
ArtOfCode

@ RobertRosati ขอบคุณมากสำหรับการแก้ไขที่แนะนำของคุณ - ฉันไม่ควรลืมในตอนแรก!
ish

1
@ m-ric คุณอ่านคำสั่งด้านบนบรรทัดเหล่านี้หรือไม่? "ไม่เช่นนั้นผู้ใช้รายอื่นที่มีสิทธิ์เข้าถึงระบบของคุณอาจแก้ไขและดำเนินการคำสั่งใดก็ได้ที่พวกเขาต้องการในฐานะรูทโดยไม่ต้องใช้รหัสผ่านของคุณ"
Tobias Kienzler

2
ฉันรู้ว่าคำตอบนี้เก่า - แต่ยังคงมีปัญหาที่นี่: หากไฟล์อยู่ใน/ home / ชื่อผู้ใช้แล้วระบบจะถูกทำลายหากไดเรกทอรีนั้นเขียนได้โดยผู้ใช้ที่เป็นอันตราย (หรือเข้าสู่ระบบที่ไม่ใช่รูทที่ ที่ถูกบุกรุก) พวกเขาสามารถลบหรือเปลี่ยนชื่อไฟล์วางสคริปต์อื่นไว้แทนที่และรันสคริปต์นั้นผ่านsudo- โดยไม่ต้องใช้รหัสผ่าน ดังนั้นมันเป็นเรื่องไกลที่ปลอดภัยเพื่อวางสคริปต์ไปยังไดเรกทอรีว่ารากเท่านั้นที่สามารถปรับเปลี่ยนเช่น: / usr / sbinหรือราก / มิฉะนั้นจะเป็น LGTM
NVRAM

30

คำเตือน!

การใส่รหัสผ่านการเข้าสู่ระบบเป็นข้อความธรรมดาในคำสั่งหรือไฟล์นั้นไม่ปลอดภัยอย่างยิ่งและสามารถทำให้ข้อมูลส่วนตัวและระบบของคุณด้อยลงได้ ขอแนะนำเป็นอย่างยิ่งอย่าทำเช่นนี้แม้ว่าคุณจะคิดว่าระบบของคุณเป็น "ส่วนตัว" หรือใน "สถานที่ปลอดภัย"!

หากสคริปต์นั้นมีไว้สำหรับการใช้งานส่วนตัวและคุณได้วางไว้ในที่ปลอดภัยและคุณไม่กลัวว่าบัญชีของคุณจะถูกขโมยและเช่นนั้นนี่เป็นคำตอบง่ายๆ

echo LOGINPASSWD | sudo -S COMMAND HERE

โดยที่ LOGINPASSWD เป็นรหัสผ่านการเข้าสู่ระบบของคุณ (ตัวอย่าง: iloveponies) และคำสั่งที่นี่คือคำสั่งของคุณที่มาหลังจาก sudo เช่น sh -c "echo da .. ฯลฯ


13
@Viswa โปรดทราบว่านี่เป็นอันตรายอย่างยิ่งที่จะเปิดเผยรหัสผ่านในรูปแบบข้อความล้วน คุณควรอย่างยิ่งที่จะไม่ทำเช่นนั้น
Anwar

3
-1 หากนี่เป็นความคิดที่ดีคุณควรจะดีกว่าเพียงแค่ตั้งรหัสผ่านในบัญชีรูทของคุณและใช้โซลูชันของ z7sg; นั่นเป็นเรื่องง่ายและไม่ได้สร้างปัญหาด้านความปลอดภัยที่อันตรายมาก
Bryce

4
ฮะ! ฉันมี 6 upvotes และ downvote 4 คำตอบของฉัน :) แต่ทำไมพวกฉันไม่ชัดเจน 'การใช้งานส่วนตัว', 'ที่ปลอดภัย' ฯลฯ ? ไม่มีปัญหาด้านความปลอดภัยเว้นแต่คุณจะให้ไฟล์นี้และคุณมีเซิร์ฟเวอร์ ssh ทำงานอยู่! คุณเห็นปัญหาความปลอดภัยที่สคริปต์มีไว้เพื่อการใช้งานส่วนตัวและในที่ปลอดภัยหรือไม่
hytromo

5
Downvoted นี่คือ Road to the dark side และไม่จำเป็นต้องใช้วิธี sudo
ฟลอยด์

4
ตกลงบอกฉันสิแม้ว่าแฮ็คเกอร์จะเข้าสู่ระบบในฐานะผู้ใช้ธรรมดาในบัญชีของคุณเขาจะหาสคริปต์พร้อมรหัสผ่านของคุณภายใต้ / usr / share / help / lv / ubuntu-help อย่างไร
hytromo

21

หากคุณไม่รังเกียจที่สคริปต์จะทำงานในเวลาที่ระบุในชั่วโมง (หรือระหว่างวัน) ให้วางไว้ในไดเรกทอรีหลักของรูท ( /root) และเรียกใช้สคริปต์จากระบบ crontab ( /etc/crontab) เป็นรูท จากนั้นคุณไม่ต้องทำเรื่องความปลอดภัย

ดูhttps://help.ubuntu.com/community/CronHowtoสำหรับวิธีเพิ่มสคริปต์ใน crontab


4
คุณอาจต้องการใช้anacronหากเป็นเดสก์ท็อป / แล็ปท็อปที่ไม่ทำงาน 24x7
balki

นี่เป็นคำตอบที่มีประโยชน์ตัวอย่างเช่นหากคุณกำลังเขียนสคริปต์เพื่อตรวจสอบการอัปเดตทำอะไรกับข้อมูลนั้นและส่งอีเมลถึงผู้ดูแลระบบเกี่ยวกับการอัปเดตที่จำเป็น โดยส่วนตัวแล้วสคริปต์ของฉันส่วนใหญ่ใช้สำหรับการทำงานอัตโนมัติของเซิร์ฟเวอร์ดังนั้นเพียงใช้ sudo crontab -e เป็นสิ่งที่ฉันมักจะทำ 1
ราบ

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

เรียกใช้จาก python (ตัวอย่างการเปลี่ยนความเป็นเจ้าของไดเรกทอรีซ้ำกับชื่อผู้ใช้):

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 - สลับการจับและส่งผ่านรหัสผ่านไปยัง sudo


ฉันไม่แน่ใจว่าสิ่งนี้จะเพิ่มคำตอบที่มีอยู่ในปัจจุบันส่วนใหญ่สนับสนุน BIOS ปลุกเมื่อตื่น ...
Elder Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.