รันสคริปต์บางส่วนในรูปแบบ sudo ป้อนรหัสผ่านเพียงครั้งเดียว


14

ฉันกำลังเขียนสคริปต์ (จริง ๆ แล้วเป็นการรวมกันของสคริปต์และ makefile) ที่ติดตั้งการอ้างอิงภายนอก: apt-getคำสั่งบางอย่างการgitโคลนการสร้างการติดตั้งการเพิ่มผู้ใช้ในกลุ่ม ...

การดำเนินการบางอย่างในสคริปต์เหล่านี้ต้องได้รับอนุญาตจากผู้ใช้ขั้นสูง

จนถึงตอนนี้ฉันได้ดำเนินการขั้นตอนการสร้างทั้งหมดด้วย sudo แต่มีข้อเสีย:

  • gitRepos ผมโคลนได้รับrootในฐานะเจ้าของซึ่งหมายความว่าฉันไม่สามารถแก้ไขได้ในภายหลังโดยไม่ต้องsudoหรือchown
  • สคริปต์ที่เพิ่มผู้ใช้ไปยังกลุ่มไม่ทราบว่าจะเพิ่มผู้ใช้รายใดตั้งแต่whoamiกลับมาroot

เป็นวิธีที่ดีที่สุดในการทำงานเป็น superuser เฉพาะคำสั่งที่ต้องการหรือไม่ โดยหลักการแล้วกระบวนการยังต้องการให้ฉันป้อนsudoรหัสผ่านของฉันแต่เพียงครั้งเดียวเมื่อเริ่มต้นกระบวนการติดตั้ง จากนั้นมันจะลืมมันในตอนท้าย แต่เก็บไว้ตลอดเวลาจนกว่าจะถึงตอนนั้น (อาจใช้เวลาหลายชั่วโมง)

โซลูชันที่ฉันพบทางออนไลน์ ได้แก่ :

  • sudo -vตอนที่สคริปต์ แต่ถ้าฉันเข้าใจอย่างถูกต้องหมดเวลานี้ สคริปต์ของฉันสามารถทำงานได้สองสามชั่วโมง
  • การเรียกใช้สคริปต์ที่มีsudoแต่คำสั่งที่ทำไม่ได้ต้องใช้ super sudo -u $(logname) <command>กับ นี่คือสิ่งที่ฉันทำตอนนี้ แต่มันรู้สึกเหมือนมันควรจะเป็นวิธีอื่น ๆ

เป็นการดีที่ฉันต้องการสคริปต์ของฉันไปที่:

  1. ขอข้อมูลประจำตัวของ superuser
  2. เรียกใช้คำสั่งปกติในฐานะผู้ใช้ที่เข้าสู่ระบบ
  3. รันคำสั่ง sudo โดยป้อนข้อมูลประจำตัวที่ขั้นตอนที่ 1
  4. sudo -k เพื่อปิดเซสชัน superuser

2
คุณยังสามารถเรียกใช้ทุกอย่างเป็น sudo และสคริปต์ของคุณสามารถตรวจสอบSUDO_USERตัวแปรสภาพแวดล้อม หากปัจจุบันจะมีชื่อผู้ใช้ของผู้ใช้ที่เรียกใช้ sudo ดังนั้นคุณสามารถ (เป็นรูท) chown $ SUDO_USER: $ SUDO_GID $ your_files ในทำนองเดียวกันคุณสามารถตรวจสอบตัวแปรเหล่านี้เพื่อให้คำสั่งผู้ใช้รู้ว่าจะต้องเพิ่มผู้ใช้รายใด
roadmr

... หรือเรียกใช้ทุกอย่างในฐานะรูทและใช้su $SUDO_USER -c commandสำหรับคำสั่งที่รันในฐานะผู้ใช้ปกติ
Rmano

คำตอบ:


7

เนื่องจากคุณมีสิทธิ์เข้าถึง sudo ให้สร้างไฟล์ sudoers ด้วยตัวคุณเองแล้วลบทิ้งเมื่อสคริปต์เสร็จสิ้น:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

วิธีการหนึ่งที่ว่าเราจะไม่ได้โดยทั่วไปแนะนำคือการอ่านรหัสผ่านด้วยตัวเองและการใช้งานsudoของ-Sตัวเลือกที่จะผ่านรหัสผ่านเป็นและเมื่อมีความจำเป็น:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

จากman sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
ปลอดภัยไหม echo "$password"??
αғsнιη

@KasiyA echo "$password"จะไม่เป็นเช่นนั้น แต่ heredocs และ herestrings นั้นปลอดภัยกว่าเล็กน้อย พวกเขาไม่สามารถมองเห็นได้ในบรรทัดคำสั่งที่แสดงโดยเครื่องมือปกติ
muru

1
ฉันคิดว่าการพูดอย่างเคร่งครัดecho "$password"ทางด้านซ้ายของไปป์นั้นปลอดภัยในสคริปต์ทุบตี echoเป็นตัวเชลล์ /bin/echoไม่ทำงานเมื่อเรียกว่าง่ายecho ...ๆ เชลล์อื่นบางตัวมีechobuiltin ( dashตัวอย่างเช่น) แต่เชลล์สไตล์ Bourne ไม่จำเป็นต้องมีหนึ่งตัว ดังนั้นฉันคิดว่าecho "$password" |เป็นที่ยอมรับในการทุบตี แต่อาจหลีกเลี่ยงได้ดีที่สุดในกรณีที่มีคนพอร์ตสคริปต์ไปยังเชลล์อื่นโดยไม่สังเกตเห็นปัญหา ผมใช้ไม่ใช่แบบพกพา[[แทน[ในสคริปต์ที่จะหลีกเลี่ยงประเภทเดียวกันของปัญหา @KasiyA
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.