`!! 'หมายความว่าอะไรใน` sudo !!'?


64

ฉันเป็นผู้ใช้งาน Ubuntu ที่ไม่ค่อยมีประสบการณ์และฉันใช้มาsudoแล้ว

สิ่งที่ไม่sudo !!ทำและวิธีการ?


7
ทำซ้ำยกเว้นจากอีกด้านหนึ่ง: เรียกใช้คำสั่งเดียวกันอีกครั้ง แต่เป็น sudo
CVn

6
@WarrenHill เขาไม่ต้องการ "วิธี" แต่ "อะไร" และ "อย่างไร" เขาถามเพิ่มเติมเกี่ยวกับ!!ส่วนหนึ่งของคำสั่ง
Braiam

1
@Nakilon ไม่ควรจะเป็น คำถามนี้ถามว่า!!ทำอย่างไรและอย่างไร คนอื่น ๆ ต้องการวิธีการทำเช่นนี้
Braiam

@ MichaelKjörlingคุณหมายถึงเกี่ยวข้องใช่มั้ย
Braiam

2
@Braiam ที่จริงแล้วฉันหมายถึงการซ้ำซ้อน; คำตอบที่ได้รับคะแนนสูงสุดสองคำตอบสำหรับคำอธิบายนั้นอธิบายสิ่งที่sudo !!ทำโดยเฉพาะและมีคำตอบสองคำที่อธิบายสิ่งที่!!เกิดขึ้นจริง
CVn

คำตอบ:


74

!!in bash เป็นนามแฝงสำหรับคำสั่งก่อนหน้า (ดูที่Event Designators ) ดังนั้นจึงรันคำสั่งก่อนหน้าอีกครั้งด้วยsudoสิทธิ์


15
หมายเหตุ: !คำสั่งมักจะไม่พร้อมใช้งานในสคริปต์ทุบตี (เฉพาะในเซสชันแบบโต้ตอบ) set +o histexpandพวกเขาสามารถปิดการใช้งานด้วย
เบอนัวต์

64

sudo bang bang เป็นคำสั่งที่มีประโยชน์มากเมื่อทำงานใน Command Line Interface

Linux distros บางตัวให้คุณล็อกอินในฐานะผู้ใช้แทนที่จะเป็นผู้ดูแลระบบ

ดังนั้นในการทำสิ่งที่ผู้ดูแลระบบคุณต้องดำเนินการคำสั่งด้วยsudo(ผู้ใช้ Super-DO) ซึ่งจะบอกระบบ“ คุณจะทำเช่นนี้เพราะฉันพูดอย่างนั้น” The !! / bang-bang (! = bang) นั้นเป็นทางลัดที่คุณสามารถใช้เพื่อทำซ้ำคำสั่งก่อนหน้า

ดังนั้นสถานการณ์ทั่วไปคือคุณลองใช้คำสั่งและส่งข้อความกลับมาโดยบอกว่าคุณต้องเป็นผู้ดูแลระบบ ดังนั้นคุณสามารถพิมพ์sudoเพื่อรันคำสั่งนั้นเป็น super-user / admin หรือคุณสามารถพิมพ์sudo !!ที่!!บอกให้ระบบใช้คำสั่งก่อนหน้านี้ที่พยายาม ยา UFH

มีคำสั่งปังอื่น ๆ อีกมากมาย สำหรับรายการของพวกเขาและคำอธิบายเกี่ยวกับสิ่งที่พวกเขาตรวจสอบคำสั่ง Linux ปังดูประวัติทุบตีและคำสั่งปัง


12
มันเป็นคำสั่งที่อันตรายมากหากคุณไม่แน่ใจ 100% ว่าคำสั่งก่อนหน้าของคุณคืออะไร มันเกือบจะปลอดภัยกว่าเพียงแค่กดปุ่มลูกศรขึ้นแล้วกดปุ่ม Home จากนั้นพิมพ์sudoและดูบรรทัดคำสั่ง
Shadur

3
@Shadur โดยปกติแล้วคำสั่งก่อนหน้าของคุณประมาณ 1 วินาทีที่แล้ว กรณีการใช้งานปกติเป็นกรณีที่อธิบายไว้ในคำตอบ: คุณลืมsudoบางสิ่งบางอย่างและได้รับข้อผิดพลาดดังนั้นคุณจึงต้องการsudoมันทันที
Michael Mrozek

1
@Braiam: CLI เป็นตัวย่อ การละเมิดกฎชุมชน! โจมตี! Re-แก้ไข!
อินเดีย

4
sudoไม่ได้หมายความว่า "ผู้ใช้ระดับสูงทำได้" มันจะทำตามคำสั่งราวกับว่าฉันทำเสร็จแล้วsu(หมายความว่าผู้ใช้เปลี่ยน [ไม่ใช่ผู้ใช้ระดับสูง]); เช่นคุณสามารถ sudo คำสั่งเป็นผู้ใช้ใด ๆ ไม่เพียง แต่รู-uท( สวิตช์); กันไปกับsu [user] [-c command]
ssice

1
@ Mitch ยกเว้นsuไม่ได้หมายถึงสิ่งนั้น ดูlinux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html มันควรจะหมายถึงผู้ใช้แทน
ssice

38

bang bang (!!)คำสั่งเป็นทางลัดไปสู่การทำซ้ำและเรียกใช้คำสั่งก่อนหน้าคุณป้อนใน terminal ของคุณ คำสั่งนี้มีประโยชน์มากเมื่อคุณลืมว่าคุณต้องการสิทธิ์ผู้ดูแลระบบเพื่อดำเนินการบางอย่างและให้คุณทำซ้ำด้วยสิทธิ์ระดับผู้ใช้ขั้นสูงเพียงแค่พิมพ์

sudo !!

!! คว้าคำสั่งเรียกใช้ล่าสุด

ตัวอย่างเช่น:

apt-get update

ผลลัพธ์จะเป็น

E: ไม่สามารถเปิดไฟล์ล็อค / var / lib / apt / list / lock - เปิด (13: ปฏิเสธสิทธิ์)
E: ไม่สามารถล็อคไดเรกทอรี / var / lib / apt / list /
E: ไม่สามารถเปิดไฟล์ล็อค / var / lib / dpkg / lock - เปิด (13: ปฏิเสธสิทธิ์)
E: ไม่สามารถล็อคไดเรคทอรี่การบริหาร (/ var / lib / dpkg /), คุณรูทหรือไม่?

หลังจากนั้นถ้าเราเรียกใช้sudo !!คำสั่งผลลัพธ์จะเป็น

Hit http://extras.ubuntu.com saucy/main amd64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

ซึ่งหมายความว่า!!ส่วนคว้าคำสั่งเรียกใช้ก่อนหน้าapt-get updateและsudoส่วนที่นำหน้าทำให้คำสั่งให้ทำงานด้วยสิทธิ์ superuser

และวิธีsudo !!วิ่งคำสั่งก่อนหน้านี้มีสิทธิ์ superuser หมายความว่าปกติทุกคำสั่งที่เราป้อนใน terminal จะถูกเก็บไว้ในcommand history.Run historyคำสั่งใน terminal มันแสดงให้เห็นคำสั่งทั้งหมดที่คุณ entered.The !!มีส่วนร่วมในsudo !!การคว้าคำสั่งสุดท้ายที่เก็บไว้ ในประวัติคำสั่งและทั้งหมดsudo !!รันคำสั่งสุดท้ายด้วยสิทธิ์ผู้ดูแลระบบ

บางคำสั่งอื่น ๆบางคำอธิบายในโพสต์บล็อกนี้


3
ฉันประหลาดใจที่เห็นมันพูดถึง 'ปังปัง' อีกครั้ง ฉันคิดว่าครั้งเดียวก็เพียงพอแล้ว
kiri

1
+1 สำหรับตัวอย่างเพิ่มเติมของคำสั่ง bang
WernerCD

1
@Rmano อย่างน้อยใน Bash และฉันคาดว่ากระสุนสไตล์ Bourne ทั้งหมดที่มีการสนับสนุนประวัติmkdir LongDirectoryNameและcd !$จะต้องออกแยกต่างหากเพื่อทำงานเว้นแต่จะLongDirectoryNameเกิดขึ้นเป็นคำสุดท้ายของคำสั่งก่อนหน้านี้ สำหรับวัตถุประสงค์ประวัติเชลล์mkdir LongDirectoryName; cd !$คือหนึ่งคำสั่ง ปฏิสัมพันธ์ประวัติศาสตร์ที่มี!!, !^และใช้คำสั่งสุดท้ายเปลือกจริงการประมวลผลอย่างเต็มที่ก่อนที่จะเห็น!$ นี่คือตัวอย่าง หากคุณเรียกใช้คุณจะเห็นว่าคำสั่งในบรรทัดที่เข้าร่วมจะถูกจดจำเป็นหนึ่งคำสั่ง !history;
Eliah Kagan

@EliahKagan คุณพูดถูก! ลบข้อมูลผิด ...
Rmano

13

คำตอบมีสองส่วน: !!และsudo

!!เป็นส่วนหนึ่งของการทำงานของเชลล์ (ในกรณีของ Ubuntu นี่อาจเป็นทุบตี แต่เชลล์อื่น ๆ เช่น zsh หรือ csh สนับสนุนสิ่งนี้เช่นกัน) เรียกว่า "การขยายประวัติ" มันทำงานในลักษณะเดียวกันกับการขยายตัวอื่น ๆ ที่เชลล์ขยาย 'ตัวยึด' เป็นชุดของคำ ขณะที่foo*จะขยายไปยังรายการไฟล์ทั้งหมดที่เริ่มต้นด้วย 'foo' !!จะได้รับการขยายไปยังเนื้อหาของบรรทัดคำสั่งก่อนหน้า

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

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


sudoคำสั่งอนุญาตให้รันคำสั่งเป็นผู้ใช้อื่นให้สิทธิ์ ar ที่ได้รับจากนโยบายการรักษาความปลอดภัย (ค่าเริ่มต้นการกำหนดค่าใน/etc/sudoers)

โดยค่าเริ่มต้นรหัสผ่านรูทยังคงไม่ได้รับการตั้งค่าใน Ubuntu เพื่อดำเนินงานการบริหารระบบผู้ใช้ที่สร้างขึ้นระหว่างการติดตั้งจะได้รับสิทธิ์ sudo ขณะนี้ผู้ใช้นี้สามารถดำเนินการคำสั่งใด ๆ บนเปลือกรากเป็นเพียงโดย sudoprepending โปรแกรม GUI บางโปรแกรมใช้กลไก sudo เช่นกันเช่นการจัดการแพ็คเกจ

เหตุผลที่sudoสามารถรันคำสั่งอื่น ๆ ในฐานะ root (หรือผู้ใช้อื่น) คือ sudo binary ( /usr/bin/sudo) มี setuid bit set ที่ได้รับอนุญาตและเป็นของ root สามารถดำเนินการใด ๆ (ไบนารี) กับชุด setuid บิตด้วยสิทธิ์ของเจ้าของ ซึ่งหมายความว่า sudo ทำงานได้อย่างมีประสิทธิภาพด้วยการอนุญาตรูทไม่ว่าผู้ใช้รายใดจะเรียกมันว่าอะไรก็ตาม มีเพียงเขาเท่านั้นที่นโยบายความปลอดภัยภายในของ sudo จัดการผู้ใช้คนใดที่ได้รับอนุญาตให้ทำอะไรและป้องกันผู้ใช้รายใดก็ตาม


ดังนั้นในกรณีsudo !!นี้หมายถึง

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!

เป็นพื้นเหมือนกันกับ

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt

พิมพ์น้อยลง ในทั้งสองกรณี sudo เพิ่งเห็นmount /dev/sdb1 /mntและรันด้วยการอนุญาตรูท


5

!!คือการแสดงออกไวยากรณ์ที่ง่ายและอาจจะพบมากที่สุดสำหรับการขยายตัวของประวัติศาสตร์

ดังที่คุณอาจสังเกตเห็นหลังจากแทนที่คำสั่งสุดท้ายที่ดำเนินการแทนการ!!ทุบตีจะทำสองสิ่ง (ในการกำหนดค่าเริ่มต้น):

  1. คำสั่งแบบเต็มพร้อมข้อความที่ถูกแทนที่จะแสดงให้คุณเห็น

    ตัวอย่างเช่นถ้าเป็นคำสั่งของคุณlshw -c videoและคุณทำงานต่อไปแล้วคำสั่งหลังจากที่ขยายตัวประวัติศาสตร์sudo !!sudo lshw -c video

  2. คำสั่งนั้นรัน

โดยปกติแล้วสองขั้นตอนเหล่านี้จะเกิดขึ้นโดยไม่มีการขัดจังหวะและไม่มีโอกาสในการโต้ตอบกับผู้ใช้เนื่องจากshopt histverifyไม่มีการตั้งค่าตามค่าเริ่มต้น ( shopt -u histverify)

อย่างไรก็ตามหากคุณเปิดใช้งานshopt histverify( shopt -s histverify) การขยายประวัติจะทำงานแตกต่างกัน:

  1. คุณจะได้รับพรอมต์หลักใหม่โดยข้อความที่ถูกขยายจะถูกใส่เข้าไปโดยอัตโนมัติ มันเหมือนกับว่าคุณพิมพ์ข้อความนั้นด้วยตัวเองด้วยเคอร์เซอร์ที่ท้าย แต่ยังไม่ได้รันคำสั่ง
  2. คุณผู้ใช้ต้องกดEnterเพื่อเรียกใช้คำสั่ง หรือคุณอาจแก้ไขคำสั่งยกเลิกคำสั่ง ( Ctrl+ C) ฯลฯ โปรดทราบว่านี่ไม่ใช่พรอมต์พิเศษ แต่เป็นพรอมต์หลักปกติ มันเหมือนกับว่าคุณพิมพ์ข้อความด้วยตัวเอง

(โปรดทราบว่าhistverify ตัวเลือกเชลล์จะมีผลเฉพาะเมื่อมีการใช้ไลบรารี readline - แต่เมื่อคุณใช้ bash แบบโต้ตอบบน Ubuntu หรือระบบ GNU / Linux อื่น ๆ นี่เป็นกรณีที่เกิดขึ้นเสมอ)

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


3

! จะใช้ใน Linux สำหรับทางลัดที่เกี่ยวข้องกับประวัติ ดังนั้น !! จะเรียกใช้คำสั่งก่อนหน้านี้ที่คุณเรียกใช้

มันมีประโยชน์มากในกรณีที่คุณลืมใส่ sudo หน้าคำสั่งที่ต้องการหรือคุณได้รับอนุญาตถูกปฏิเสธหรืออะไรทำนองนั้น

sudo !!
และคุณทำเสร็จแล้ว


0

!! จะทำซ้ำและเรียกใช้คำสั่งก่อนหน้าและด้วย sudo มันจะให้คำสั่งสิทธิ์รูต (มันไม่ได้อยู่ใน man page? !! ฉันไม่เห็นมันเลย)


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