ทำไมถึงไม่สามารถ sudo history ได้?


4

หากฉันต้องการดูประวัติทุบตีรูทของฉันทำไมฉันจึงไม่สามารถรันได้sudo history? เมื่อฉันบอกว่าไม่พบประวัติคำสั่ง แต่ถ้าฉันรันโดยไม่มี sudo มันจะทำงานได้ดี

แก้ไข: เป็นคำตอบที่ซ้ำกัน แต่ไม่ใช่คำถามที่ซ้ำกันสำหรับคำถามที่เชื่อมโยง บุคคลที่ถามคำถามใด ๆ จะไม่ทราบว่าเป็นคำสั่งเชลล์บิวด์อินซึ่งต่างจากไบนารี


3
สำเนาที่เป็นไปได้ของเหตุใดจึงไม่ "sudo cd" ทำงาน
zondo

การทำซ้ำ Q ที่เป็นไปได้นั้นเป็นคำตอบ - historyเป็นคำสั่ง bash shell builtin อาจมีบันทึกอื่น ๆ ที่บันทึกว่า sudo ทำอะไรได้
บ้าง

1
ฮ่า ๆ มันเป็นคำตอบที่ซ้ำกัน แต่ไม่ใช่คำถามที่ซ้ำกัน บุคคลที่ถามคำถามใด ๆ จะไม่ทราบว่าเป็นคำสั่งเชลล์บิวด์อินซึ่งต่างจากไบนารี
StackOverflow

นั่นเป็นความจริง ... อ่านความคิดเห็นของฉันที่พวกเขารู้แล้ว ;-) ฉันอาจจะโพสต์คำตอบด้วยวิธีที่ฉันตรวจสอบไบนารี vs builtin
Xen2050

คำตอบ:


5

historyเป็นคำสั่ง bash shell builtin และsudoไม่ทำงานกับ shell builtins


คำสั่ง builtin คืออะไรและไม่ใช่อะไร

ฉันใช้คำสั่งwhichที่"ส่งคืนชื่อพา ธ ของไฟล์ (หรือลิงก์) ซึ่งจะถูกดำเนินการในสภาพแวดล้อม"เพื่อยืนยันว่าhistoryไม่ใช่คำสั่งภายนอก (ไปยัง bash)

ตัวอย่างเช่นการวิ่ง

$ which history
$

ส่งคืนอะไรและรหัสทางออกคือ 1 (คำสั่งที่ระบุอย่างน้อยหนึ่งคำสั่งคือไม่มีอยู่หรือไม่สามารถเรียกใช้งานได้) [FYI ดูรหัสทางออกด้วยecho $?] ขณะที่ทำงาน

$ which ls
/bin/ls
$

และรหัสทางออก 0 (พบคำสั่งที่ระบุทั้งหมดและเรียกใช้งานได้)

นอกจากนี้ในทุบตีคุณสามารถค้นหาความช่วยเหลือสำหรับคำสั่ง builtin ด้วยhelp(หรือค้นหาman bashหน้า) ตัวอย่างเช่นการพิมพ์

$ help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps
arg [arg...]
   Display or manipulate the history list.
...

แสดงข้อมูลความช่วยเหลือของ bash การวิ่งhelp non-bash-commandส่งคืนสิ่งที่คล้ายกับสิ่งนี้:

$ help ls
bash: help: no help topics match `ls'.  Try `help help' or `man -k ls' or
`info ls'.

และรหัสทางออก 1


แล้ว sudo กำลังทำอะไรอยู่?

คุณสามารถค้นหาประวัติของคุณเองสำหรับsudoคำสั่งที่ผู้ใช้ของคุณมีการเรียกใช้ (และไม่ข้ามบันทึกลงประวัติ) ด้วยgrep '^sudo' .bash_historyหรือhistory|lessหรือคล้ายกัน

หรือบน Ubuntu ไฟล์/var/log/auth.logจะเก็บบันทึกสิ่งที่sudoผู้ใช้ทุกคนทำค้นหา "sudo" ในนั้น (distros อื่นอาจใช้ไฟล์/var/log/secure) หรืออาจใช้

sudo grep sudo /var/log/auth.log

หรือเรียกใช้sudo journalctl _COMM=sudoถ้าคุณมี systemd

ดูคำถาม"รายละเอียดเกี่ยวกับคำสั่ง sudo ที่ดำเนินการโดยผู้ใช้ทั้งหมด" บน Unix & Linuxสำหรับรายละเอียดเพิ่มเติม


2

historyเป็น bash builtin ไม่ใช่คำสั่งปกติ sudoไม่ได้เริ่มเชลล์เพื่อเรียกใช้งานคำสั่งที่คุณให้ไว้มันแค่พยายามเรียกใช้งานโดยตรง (เป็นคำสั่งปกติ) ดังนั้นจึงไม่สามารถใช้งานได้

คุณสามารถใช้sudo bashเพื่อเปิดคำสั่งรูตเชลล์และจากนั้นเรียกใช้historyแต่ถ้าคุณต้องการซับแบบหนึ่งมันก็ซับซ้อนเล็กน้อย ทุบตีเพียงเปิดใช้งานกลไกประวัติศาสตร์ของมันเมื่อมันทำงานในโหมดการโต้ตอบและถ้าคุณทำอะไรเช่นsudo bash -c history( -cบอกทุบตี "นี่คือคำสั่งที่ฉันต้องการให้คุณดำเนินการ:") มันถือว่าเป็นโหมดที่ไม่โต้ตอบและไม่แสดงจริง ประวัติใด ๆ แม้แต่การเพิ่ม-i(สำหรับโหมดโต้ตอบ) ก็ใช้งานไม่ได้เมื่อฉันทดสอบ แต่สิ่งนี้ทำ:

sudo bash -i <<<history

โปรดทราบว่า<<<เป็นคุณสมบัติทุบตีเท่านั้น ในเชลล์อื่นคุณอาจต้องใช้echo history | sudo bash -iแทน

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