วิธีการเรียกใช้คำสั่งที่เกี่ยวข้องกับการเปลี่ยนเส้นทางหรือท่อด้วย sudo?


60

ฉันกำลังพยายามติดตามสิ่งที่ฉันถือว่าเป็นแนวทางปฏิบัติที่ดีที่สุดในการใช้ sudo แทนบัญชีรูท

ฉันกำลังใช้งานไฟล์ concat อย่างง่ายเช่น:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

สิ่งนี้ล้มเหลวทางด้านขวาของ ">>" ซึ่งกำลังทำงานในฐานะผู้ใช้ปกติ การเพิ่ม sudos พิเศษก็ล้มเหลวเช่นกัน (ลักษณะการทำงานที่คาดไว้ตั้งแต่การไพพ์ไปยังคำสั่ง sudo และไม่ไปที่ไฟล์)

ตัวอย่างเป็นเพียงแค่นั้น แต่มันได้รับการตรวจสอบและทดสอบภายใต้บัญชีรูท

คำตอบ:


75

คุณสามารถเรียกเชลล์ใหม่เป็นรูต:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

คุณสามารถยกระดับกระบวนการในการเขียนไฟล์:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
โดยทั่วไปตัวเลือกที่สองมีความปลอดภัยมากกว่าเพราะมีเพียงteeคำสั่งที่เรียกใช้ในฐานะรูทไม่ใช่คำสั่งหลักที่อาจซับซ้อนและมีแนวโน้มที่จะมีพฤติกรรมที่ไม่เหมาะสม (ไม่ใช่กรณีecho)
pabouk

19

อีกตัวเลือกหนึ่งที่ปลอดภัยอย่างเท่าเทียมกันคือการใช้sudo's -iเปลี่ยนไปสู่ระบบในฐานะราก:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

สิ่งนี้ยังคงเป็นไปตามกฎการปฏิบัติที่ดีที่สุดเนื่องจากบัญชีรูทไม่ได้เปิดใช้งานจริง แต่ช่วยให้คุณทำสิ่งต่าง ๆ ได้อย่างปลอดภัย จากman sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

อีกทางเลือกหนึ่งคือsudo bash
starbeamrainbowlabs

11

หากคุณแสดงคำสั่งโดยไม่มีเครื่องหมายคำพูดเดี่ยวคุณสามารถใส่มันไว้ในเครื่องหมายคำพูดเดี่ยวและดำเนินการผ่านเปลือกกลาง

ในการดำเนินการนี้ในฐานะรูท:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

เขียนคำสั่งด้วยวิธีอื่นที่ไม่ได้ใช้':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

จากนั้นเรียกใช้sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

sudo teeอีกทางเลือกหนึ่งที่จะเขียนออกไปยังแฟ้มที่รากเท่านั้นที่สามารถเขียนไปยังโทร ผ่าน-aตัวเลือกเพื่อteeผนวกไฟล์ปลายทางมิฉะนั้นไฟล์จะถูกตัดทอน

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

สำหรับการปรับเปลี่ยนไฟล์ที่ซับซ้อนมากขึ้นคุณสามารถโทรsudo sed, sudo ed, sudo perl...

หรือใช้ตัวแก้ไขที่เหมาะสมและเรียกมันว่า sudo ใน Emacs /sudo:/etc/conf.d/hwclockเปิด ในกลุ่มโทร:w !sudo tee %ที่จะเขียนไปยังแฟ้มเปิดเป็นรากหรือใช้ปลั๊กอิน sudo.vim หรือไปจากปลาย sudo sudoedit /etc/conf.d/hwclockและโทร

หรือคุณสามารถให้ในด้านมืดและเรียกใช้เปลือกเป็นราก

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

คำสั่งล้มเหลวเนื่องจากสิทธิ์ในไฟล์ถูกเปลี่ยนเส้นทางไป การเปลี่ยนเส้นทางจะเกิดขึ้นก่อนที่sudoคำสั่งจะถูกเรียกใช้

คุณจะต้องตรวจสอบให้แน่ใจว่าเป็นรากที่เปิดไฟล์สำหรับการเขียนจริง

วิธีที่ง่ายที่สุดในการทำเช่นนั้น:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echoอาจจะทำงานในขณะที่คุณใช้สามัญเป็นมันก็ผลิตสตริงข้อความ teeยูทิลิตี้จะต้องทำงานเป็นรากแม้ว่าและtee -aจะผนวกข้อมูล เราเปลี่ยนเส้นทางไปที่/dev/nullเนื่องจากteeโดยค่าเริ่มต้นจะทำซ้ำข้อมูลอินพุตไปยังเอาต์พุตมาตรฐานนอกเหนือจากการเขียนไปยังไฟล์ที่ระบุ

ด้วยbashหรือเชลล์ใด ๆ ที่เข้าใจ "here-strings":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

สิ่งนี้มีผลเหมือนกันกับข้างต้น วิธีที่เราสร้างสตริงนั้นมีการเปลี่ยนแปลงเท่านั้น


อีกวิธีการทำวงเวียนเล็กน้อย:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

ที่นี่การเปลี่ยนเส้นทางเกิดขึ้นภายในsh -cเชลล์ลูกที่รันในฐานะรูท


4

sudo dd of=

หากต้องการผนวกตามที่คุณต้องการ:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

หรือเพื่อสร้างไฟล์ใหม่ตั้งแต่ต้น:

echo inbytes | sudo dd of=outfile

ข้อดี:

  • ดีกว่าteeเนื่องจากไม่มีการ/dev/nullเปลี่ยนเส้นทาง
  • ดีกว่าshเนื่องจากไม่มีการแบ่งย่อย
  • ddมีตัวเลือกที่ทรงพลังมากมายเช่นstatus=progressเพื่อดูความคืบหน้าของการถ่ายโอน

ทำงานได้เพราะ sudo ส่งต่อ stdin ไปยังคำสั่ง

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