ไม่สนใจ sudo ในสคริปต์ทุบตี


9

ฉันมีสคริปต์ทุบตีขนาดเล็ก:

#!/bin/bash

touch dummy.txt

ถ้าผมรันสคริปต์นี้กับsudoแล้วมันจะสร้างdummy.txtซึ่งจะเป็นรากที่มีการป้องกัน

สิ่งที่ฉันต้องการจะทำคือ:

ไม่ว่าสคริปต์นี้จะถูกเรียกใช้โดยใช้sudoหรือผู้ใช้ปกติไฟล์ไม่dummy.txtควรได้รับการป้องกัน


4
สิ่งที่คุณหมายถึงโดย "ป้องกันราก" คุณสามารถใช้chownและchmodในสคริปต์ของคุณเพื่อตั้งค่าความเป็นเจ้าของและสิทธิ์ตามที่ต้องการ
fkraiem

1
ยังไม่ชัดเจนว่าคุณหมายถึงอะไรโดย "ป้องกันราก" คุณหมายความว่ามีเพียงผู้ใช้รูทเท่านั้นที่สามารถอ่าน / เขียน (เช่นการอนุญาตให้ตั้งค่าไฟล์เป็น 700) หรือผู้ใช้รูทเป็นเจ้าของไฟล์

1
@DoritoStyle ขออภัยในความสับสน ด้วยการป้องกันของรากฉันหมายความว่าผู้ใช้รูทเป็นเจ้าของไฟล์
ไม่ระบุชื่อ

คำตอบ:


22

คุณสามารถทดสอบว่าสคริปต์นั้นถูกเรียกใช้ผ่านการsudoใช้EUIDและSUDO_USERตัวแปรแล้วดำเนินการtouchราวกับSUDO_USERว่าเป็นจริง - บางอย่างเช่น

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
โปรดทราบว่า==ใช้สำหรับการเปรียบเทียบสตริง เนื่องจาก$EUIDควรจะส่งคืนค่าจำนวนเต็มฉันขอแนะนำให้คุณใช้-edการเปรียบเทียบ ช่องว่างได้รับอนุญาตในชื่อผู้ใช้ดังนั้นอาจอ้างอิง$SUDO_USERตัวแปร มิฉะนั้นคำตอบที่ดี - นี่คือสิ่งที่ฉันจะใช้ส่วนตัว
Sergiy Kolodyazhnyy

@steeldriver นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ !!
ไม่ระบุชื่อ

1
คุณสามารถเรียกใช้สคริปต์อีกครั้งด้วยตัวเองsudo -uหากตรวจพบว่าสคริปต์นั้นทำงานเหมือนรูท OP พูดคุยเกี่ยวกับการมีหลายคำสั่งในสคริปต์เดียว แต่ระวังเพื่อหลีกเลี่ยงการวนซ้ำไม่สิ้นสุดกับข้อผิดพลาด
Peter Cordes

1
ไม่มีการแยกคำว่าภายใน[[...]]จึงไม่จำเป็นอย่างเคร่งครัดในการอ้างอิงตัวแปรภายในถ้ามีคำสั่ง @Serg และฉันบร-edเป็น typo สำหรับ-eq
Arronical

ใช่ @Arronical ที่เป็น typo -eqสำหรับ ไม่รู้ว่า[[ไม่มีการแยกคำ ขอบคุณ โดยส่วนตัวแล้วฉันยังคงอ้างถึงนิสัยการเขียนสคริปต์ที่ดี
Sergiy Kolodyazhnyy

9

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

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

คุณสามารถเรียกใช้สคริปต์ของคุณอีกครั้งในฐานะผู้ใช้ทางเลือก (เช่นsudo -u FALLBACK_USER "$0") แทนที่จะยกเลิกเพียงแค่

การพยายามแก้ไข quirks ของแต่ละคำสั่งจะทำให้สคริปต์ของคุณซับซ้อนและไม่สามารถดีบักได้ยาก ทุกครั้งที่คุณแก้ไขคุณจะต้องทำการทดสอบทั้งหมดสองครั้ง (ในฐานะผู้ใช้ทั่วไปจากนั้นเป็นroot) และแก้ไขrootข้อบกพร่องที่เกี่ยวข้องทั้งหมดที่เกิดขึ้น มันไม่ใช่วิธีแก้ปัญหาที่จะเกิดขึ้นในอนาคต


6

ตามค่าเริ่มต้นไฟล์ที่สร้างด้วยรูทเสียงจะมีการอนุญาตดังนี้:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

ที่นี่ไฟล์เป็นของผู้ใช้รูทและกลุ่มรูทและสามารถอ่านและเขียนได้โดยรูท แต่ผู้อื่นสามารถอ่านได้

วิธีที่ง่ายที่สุดจะเป็นchownไฟล์กลับไปยังผู้ใช้เดิม

chown username:group_name dummy.txt

คุณสามารถใช้$SUDO_USERตัวแปรที่สามารถเข้าถึงได้ก็ต่อเมื่อsudoถูกเรียกเช่น:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

หากคุณใช้งานสคริปต์ในฐานะผู้ใช้ทั่วไปchownไม่จำเป็นต้องใช้ส่วนใด ๆ ดังนั้นคุณอาจต้องการใช้ if-statement หรือ&&test เพื่อทดสอบกรณีและปัญหาเมื่อสคริปต์ทำงานเป็นรูทและทำบางอย่างตามบรรทัดเหล่านี้:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

แนะนำวิธีการข้างต้น มีผู้อื่นเช่นใช้chmodเพื่อเปลี่ยนสิทธิ์อ่าน - เขียน - ดำเนินการสำหรับผู้ใช้และกลุ่ม แต่ไม่แนะนำ


ขอบคุณสำหรับการตอบกลับของคุณ. แต่ใน QI เพียงแค่อธิบายสถานการณ์ง่าย ๆ ในกรณีจริงสคริปต์ต้นฉบับจะสร้างไฟล์จำนวนมาก ใน linux เราไม่สามารถเพียงแค่เพิกเฉย sudo?
ไม่ระบุชื่อ

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

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