จะผนวกไฟล์เป็น sudo ได้อย่างไร?


271

ฉันต้องการทำ:

echo "something" >> /etc/config_file

แต่เนื่องจากผู้ใช้รูทเท่านั้นที่มีสิทธิ์เขียนไฟล์นี้ฉันจึงไม่สามารถทำได้ แต่สิ่งต่อไปนี้ใช้งานไม่ได้

sudo echo "something" >> /etc/config_file

มีวิธีการผนวกไฟล์ในสถานการณ์นั้นโดยไม่ต้องเปิดไฟล์ด้วยตัวsudoแก้ไข 'd' ก่อนจากนั้นจึงผนวกเนื้อหาใหม่ด้วยมือ?


ฉันใช้ Ubuntu 9.04 และสามารถใช้ sudo สำหรับทุกคำสั่งที่ฉันต้องการจนถึงตอนนี้ การวางไข่ของเชลล์ย่อยทำงาน
Matt Norris

คำตอบ:


391

ใช้tee -a(หรือtee --append) กับsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

ดังนั้นคำสั่งของคุณจะกลายเป็น

echo "something" | sudo tee -a /etc/config_file

ข้อดีของteeการดำเนินการ Bash ด้วยสิทธิ์ระดับผู้ดูแลคือ

  • คุณไม่ได้ใช้ Bash ด้วยสิทธิ์ระดับผู้ดูแล
  • เฉพาะส่วน 'เขียนไปยังไฟล์' เท่านั้นที่ทำงานด้วยสิทธิ์ขั้นสูง
  • การอ้างถึงคำสั่งที่ซับซ้อนนั้นง่ายกว่ามาก

2
บน OS X tee ดูเหมือนว่าจะมีแฟล็ก -a เท่านั้น
Lri

เดเบียน 8 teeมี-aธงต่อท้าย
ดินเหนียว

9
ใช้echo "output" | sudo tee -a file > /dev/nullหากคุณต้องการข้ามเอาต์พุตคอนโซล
Moshe Bixenshpaner

ทำงานได้ดีสำหรับ WSL เช่นกัน
kayleeFrye_onDeck

50

การเปลี่ยนเส้นทางจะดำเนินการในเปลือกปัจจุบัน ในการทำการเปลี่ยนเส้นทางด้วยสิทธิ์ยกระดับคุณต้องเรียกใช้เชลล์เองด้วยสิทธิ์ยกระดับ:

sudo bash -c "somecommand >> somefile"

26

มี sudo วางเปลือกย่อย:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

ในตัวอย่างนี้ sudo รัน "sh" โดยที่เหลือเป็นอาร์กิวเมนต์

(นี่คือตัวอย่างในหน้า man sudo)


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

นี่ไม่ใช่คำตอบที่ถูก นี่คือคำตอบที่ถูก อากิระได้สิ่งที่ดีกว่าสำหรับตรรกะที่ให้ไว้ในคำตอบนั้น
TOOGAM


4

ในความคิดของฉันสิ่งที่ดีที่สุดในกรณีนี้คือ dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

อาจมีปัญหากับ sudo ที่นี่และการเปลี่ยนเส้นทาง ใช้ texteditor ที่คุณเลือกแทนเพื่อเพิ่มบรรทัด

sudo nano /etc/profile

หรือคุณสามารถลอง su แทน

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

น่าเสียดายที่สิ่งนี้ให้ผลลัพธ์เหมือนกัน
Matt Norris

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'ควรทำงาน. เนื่องจากไม่มีสิ่งใดที่เชลล์สามารถขยายใน arg เพื่อ echo โดยไม่ได้ตั้งใจ
ต้มตุ๋น Quixote

มันอัศจรรย์มาก. ตอนนี้ทำเช่นนี้เป็นส่วนหนึ่งของสคริปต์
เออร์นี่ดันบาร์

0

สิ่งนี้จะไม่ทำงานเมื่อคุณพยายามเปลี่ยนเส้นทาง (โดยใช้>>) ผลลัพธ์ของ sudo echoสิ่งที่คุณต้องการจะทำคือการเปลี่ยนเส้นทางการส่งออกของ /etc/profileผมแนะนำให้คุณใช้โปรแกรมแก้ไขที่คุณชื่นชอบและเพิ่มบรรทัดนั้นด้วยตนเอง นี้มีประโยชน์เพิ่มเติมที่คุณสามารถตรวจสอบว่าชุดอยู่แล้ว/etc/profileJAVA_HOME


0

ใช้อดีต :

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

และแทนที่FOOด้วยตัวแปรของคุณเพื่อผนวก

ในบางระบบ (เช่น OS X) /etc/profileไฟล์มีการอนุญาต 444 รายการดังนั้นหากคุณยังคงได้รับการปฏิเสธสิทธิ์ให้ตรวจสอบและแก้ไขการอนุญาตก่อน:

sudo chmod 644 /etc/profile

จากนั้นลองอีกครั้ง

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