ใช้ sudo su สำหรับคำสั่งเหรอ?


15

ฉันทำงานเพื่อพัฒนาทักษะบรรทัดคำสั่งของฉันเมื่อคืนและพบปัญหาเมื่อฉันใช้ sudo ฉันได้รับข้อความแสดงข้อผิดพลาดที่กล่าวว่า 'การอนุญาตถูกปฏิเสธ' อย่างไรก็ตามเมื่อฉันใช้ 'sudo su' และกลายเป็นรากคำสั่งทำงาน

ทำไม sudo ไม่ทำงานในอินสแตนซ์แรก

มันเป็น:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

จากรุ่น Linux Bible 2010 ในส่วนของการตั้งค่าเซิร์ฟเวอร์ LAMP


หากคุณไม่ให้ตัวอย่างมันเป็นการยากที่จะแก้ไขปัญหา
LassePoulsen

1
พิจารณามากกว่าsudo -s sudo su
Jeremy L

คำตอบ:


18

<,> และ >> ใช้สำหรับการเปลี่ยนทิศทางอินพุต / เอาต์พุตสำหรับคำสั่ง - ซึ่งเป็นคุณลักษณะที่จัดทำโดยเชลล์ (เช่น bash) ดังนั้นหากคุณพิมพ์คำสั่งเช่นsudo cat > /var/www/info.phpนั้นเชลล์ที่ได้รับสิ่งนี้เป็นอินพุตพยายามเปิดไฟล์/var/www/info.phpและให้ไฟล์นั้นเป็นเอาต์พุตมาตรฐานของsudoคำสั่ง sudoคำสั่งจะไม่ทราบแม้กระทั่งว่าผลผลิตของตนเป็นไปคอนโซลหรือเปลี่ยนเส้นทางไปยังแฟ้มนี้เพราะได้รับการดูแลจากเปลือกที่จะเรียกมัน

หากเชลล์ที่คุณพิมพ์คำสั่งของคุณคือเชลล์ล็อกอินหรือเชลล์อื่นที่รันในเทอร์มินัลที่มี ID ผู้ใช้ของคุณแสดงว่ามีสิทธิ์เช่นเดียวกับ ID ผู้ใช้ของคุณ

ดังนั้นในกรณีของคุณในขณะที่คำสั่ง cat ถูกเรียกใช้เป็นรูทการคัดลอกเอาต์พุตไปยัง/var/www/info.phpพยายามโดยเชลล์ที่รันในฐานะผู้ใช้ปกติซึ่งตามที่คาดไว้จะล้มเหลว

วิธีแก้ปัญหาสำหรับสถานการณ์เช่นนี้คือการใช้teeคำสั่ง:

sudo tee /var/www/info.php

นั่นจะมีผลตามเจตนาของการวางข้อความทั้งหมดที่ใส่ไว้ที่คอนโซลไม่เกิน ^ D ลงในไฟล์ที่ระบุเป็นพารามิเตอร์

อาจมีผลข้างเคียงที่ไม่พึงteeประสงค์หนึ่งที่อาจสะท้อนเอาต์พุตไปยัง stdout ดังนั้นหลังจากคุณพิมพ์แต่ละบรรทัดแล้วกด Enterteeจะส่งสำเนาของมันกลับมา เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้ตัวแปรต่อไปนี้

sudo tee /var/www/info.php > /dev/null

รายละเอียดเกี่ยวกับteeสามารถมีได้ผ่านทางinfo teeสถานี


2

sudo ไม่ทำงานสำหรับคำสั่งที่ต้องการสิทธิ์ในการเขียนไฟล์เช่น:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

มันอธิบายใน sudo man-page


4
กล่าวถึงว่าคุณสามารถ "sudo -i" หรือ "sudo -s" เพื่อรับรูทพรอมต์จะทำให้คำตอบนี้ดียิ่งขึ้น!
Jorge Castro

ไม่มีไพพ์ในคำสั่งตัวอย่าง; มีการเปลี่ยนเส้นทาง นอกจากนี้ยังมี "บางครั้งไม่ทำงาน" sudoดูเหมือนว่าจะถ่ายทอดพฤติกรรมที่ไม่สม่ำเสมอโดย ดังที่ระบุไว้ในคำตอบของ koushik พฤติกรรมนั้นสามารถคาดเดาได้ค่อนข้างสอดคล้องและ "ถูกต้อง" สำหรับรูปแบบการอนุญาตยูนิกซ์
msw

2

ปัญหาคือส่วน "> foo.txt" ถูกตีความและดำเนินการโดยล่ามคำสั่งของคุณ (เชลล์) นานก่อนที่คำสั่ง sudo จะถูกเรียกใช้ คำสั่ง sudo ไม่มีความคิดว่าคุณต้องการเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์

ล่ามคำสั่งของคุณไม่มีสิทธิ์รูท (แต่ในที่สุดคำสั่ง sudo จะใช้ในภายหลัง) ดังนั้นจึงไม่สามารถเปลี่ยนทิศทางเอาต์พุตไปยัง foo.txt


1

อีกวิธีในการแก้ปัญหานี้คือการเริ่ม subshell ด้วย sudo และดำเนินการคำสั่งนั้นใน subshell นั้น:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

ที่นี่คำสั่งที่ "มี sudo" คือทุบตีและสิ่งที่ดำเนินการในนั้นมีสิทธิ์ราก

$ 2c, * -pike

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