`!!` nghĩa là gì trong` sudo !! `?


64

Tôi là người dùng Ubuntu không có nhiều kinh nghiệm và tôi đã và đang sử dụng sudo.

Làm gì sudo !!và làm như thế nào?


7
Bản sao của, ngoại trừ từ phía bên kia: Chạy lại cùng một lệnh nhưng là sudo
CVn

6
@WarrenHill anh ấy không muốn "làm thế nào" mà là "cái gì" và "làm thế nào". Ông hỏi thêm về !!phần của lệnh.
Braiam

1
@Nakilon không nên. Câu hỏi này là hỏi những gì !!làm và làm thế nào. Người kia muốn một phương pháp để làm điều này.
Braiam

@ MichaelKjorling bạn có nghĩa là liên quan phải không?
Braiam

2
@Braiam Thật ra, tôi có nghĩa là trùng lặp; hai câu trả lời được bình chọn cao nhất cho câu trả lời đó giải thích cụ thể những gì sudo !!làm và có hai câu trả lời thực sự giải thích cụ thể những gì !!.
một CVn

Câu trả lời:


74

!!trong bash là bí danh cho lệnh trước đó (xem Trình thiết kế sự kiện ). Vì vậy, nó chạy lại lệnh trước với sudoquyền.


15
Lưu ý: !các lệnh thường không có sẵn trong các tập lệnh bash (chỉ trong các phiên tương tác). Họ có thể bị vô hiệu hóa với set +o histexpand.
Benoit

64

sudo bang bang là một lệnh rất hữu ích khi làm việc trong Giao diện dòng lệnh.

Một số bản phân phối Linux có bạn đăng nhập với tư cách người dùng thay vì quản trị viên.

Vì vậy, để làm điều gì đó thông minh cho quản trị viên, bạn phải thực hiện lệnh với sudo(Super-User DO), thông báo cho hệ thống, bạn sẽ làm điều này, bởi vì tôi đã nói như vậy. / bang-bang (! = bang) về cơ bản là một phím tắt bạn có thể sử dụng để lặp lại lệnh trước đó.

Vì vậy, kịch bản điển hình là bạn thử một lệnh và nó gửi lại một thông báo nói rằng bạn phải là một quản trị viên để làm điều đó. Vì vậy, bạn có thể nhập sudođể chạy lệnh đó với tư cách là siêu người dùng / quản trị viên hoặc bạn có thể nhập sudo !!nơi thông báo !!cho hệ thống sử dụng lệnh trước đó đã được thử. UfH

Có rất nhiều lệnh bang khác. Để biết danh sách về chúng và giải thích về chúng là gì, hãy xem Linux Bang Commands , xem thêm lịch sử Bash và các lệnh bang


12
Đây cũng là một lệnh rất nguy hiểm nếu bạn không chắc chắn 100% lệnh trước đó là gì. Hầu như luôn luôn an toàn hơn khi chỉ cần nhấn mũi tên lên, sau đó nhấn phím home, sau đó nhập sudovà nhìn vào dòng lệnh.
Shadur

3
@Shadur Thông thường lệnh trước của bạn là khoảng 1 giây trước. Trường hợp sử dụng thông thường là trường hợp được mô tả trong câu trả lời: bạn quên sudomột cái gì đó và gặp lỗi, vì vậy bạn ngay lập tức muốn sudo
Michael Mrozek

1
@Braiam: CLI là tên viết tắt. Vi phạm quy tắc cộng đồng! Tấn công! Chỉnh sửa lại!
Ấn Độ

4
sudokhông có nghĩa là "siêu người dùng làm", nó thực hiện một lệnh như thể tôi đã làm su(su có nghĩa là người dùng chuyển đổi [và không phải siêu người dùng]); tức là, bạn có thể sudo các lệnh như bất kỳ người dùng nào, không chỉ root ( -uswitch); cùng đi vớisu [user] [-c command]
ssice

1
@Mitch ngoại trừ sukhông đại diện cho một điều như vậy. Xem linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Nó có nghĩa là người dùng thay thế .
ssice

38

Các bang bang (!!)lệnh là một phím tắt để lặp lại và chạy lệnh trước đó bạn đã nhập trong thiết bị đầu cuối của bạn. Lệnh này rất hữu ích khi bạn quên rằng bạn cần quyền quản trị để thực hiện một hành động nhất định và cho phép bạn lặp lại với quyền siêu người dùng chỉ bằng cách nhập,

sudo !!

!! lấy lệnh chạy cuối cùng

Ví dụ:

apt-get update

Đầu ra sẽ là,

E: Không thể mở tệp khóa / var / lib / apt / list / lock - open (13: Quyền bị từ chối)
E: Không thể khóa thư mục / var / lib / apt / list /
E: Không thể mở tệp khóa / var / lib / dpkg / lock - open (13: Quyền bị từ chối)
E: Không thể khóa thư mục quản trị (/ var / lib / dpkg /), bạn đã root chưa?

Sau đó, nếu chúng ta chạy sudo !!lệnh, đầu ra sẽ là

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]

Điều đó có nghĩa là !!một phần lấy lệnh chạy trước đó apt-get updatesudophần mở đầu làm cho lệnh chạy với quyền superuser.

thế nàosudo !!chạy lệnh trước đó với quyền superuser có nghĩa là, thông thường tất cả các lệnh chúng tôi nhập vào thiết bị đầu cuối được lưu trữ trong các command history.Run các historylệnh trên thiết bị đầu cuối, nó cho thấy tất cả các lệnh bạn entered.The !!gia sudo !!grabs lệnh cuối cùng được lưu trữ trong lịch sử lệnh và toàn bộ sudo !!chạy lệnh cuối cùng với đặc quyền quản trị viên.

Một số lệnh bang khác được giải thích trong bài viết trên blog này .


3
Tôi ngạc nhiên khi thấy nó được nhắc đến 'bang bang' một lần nữa. Tôi nghĩ một lần là đủ.
kiri

1
+1 để biết thêm ví dụ về các lệnh bang.
WernerCD

1
@Rmano Ít nhất là trong Bash, và tôi hy vọng tất cả các shell kiểu Bourne có hỗ trợ lịch sử mkdir LongDirectoryNamecd !$phải được cấp riêng để hoạt động, trừ khi LongDirectoryNametình cờ là từ cuối cùng của lệnh trước đó. Đối với mục đích lịch sử shell, mkdir LongDirectoryName; cd !$là một lệnh. Lịch sử tương tác với !!, !^!$sử dụng lệnh cuối cùng, trình bao thực sự được xử lý đầy đủ trước khi nhìn thấy !. Đây là một ví dụ. Nếu bạn chạy, historybạn sẽ thấy các lệnh trên một dòng được nối bởi ;được ghi nhớ là một lệnh.
Eliah Kagan

@EliahKagan bạn nói đúng! Đã xóa thông tin sai ...
Rmano

13

Có hai phần cho câu trả lời: !!sudo

!!là một phần chức năng của shell (trong trường hợp Ubuntu có lẽ là bash, nhưng các shell khác như zsh hoặc csh cũng hỗ trợ điều này) được gọi là "mở rộng lịch sử". Nó hoạt động theo cách tương tự như các bản mở rộng khác trong đó phần vỏ mở rộng 'trình giữ chỗ' thành một tập hợp các từ. Mặc dù foo*sẽ được mở rộng thành một danh sách tất cả các tệp bắt đầu bằng 'foo', !!được mở rộng đến nội dung của dòng lệnh trước đó.

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

Giống như các bản mở rộng khác, điều này được thực hiện hoàn toàn bằng shell, vì vậy nếu bạn gõ !!sau một số lệnh khác, lệnh này không biết rằng có một !!, nhưng sẽ chỉ nhìn thấy dòng lệnh trước đó. (Không giống như các bản mở rộng khác, việc mở rộng lịch sử xảy ra trước khi một lệnh được lưu trong lịch sử, đó là thay vì !!dòng lệnh được thay thế sẽ được lưu vào lịch sử.)


Các sudolệnh cho phép thực hiện lệnh như một người dùng khác, với điều kiện các điều khoản ar do chính sách bảo mật (mặc định được cấu hình trong /etc/sudoers).

Theo mặc định, mật khẩu gốc vẫn chưa được đặt trong Ubuntu. Để thực hiện các tác vụ quản trị hệ thống, người dùng đã tạo trong khi cài đặt được cấp quyền sudo. Người dùng này hiện có thể thực thi bất kỳ lệnh nào trên shell dưới dạng root, chỉ bằng cách thêm trước sudo. Một số chương trình GUI cũng sử dụng cơ chế sudo, ví dụ như quản lý gói.

Lý do tại sao sudocó thể thực thi các lệnh khác với quyền root (hoặc người dùng khác) là vì nhị phân sudo ( /usr/bin/sudo) có bit setuid được đặt trong quyền của nó và thuộc về root. Bất kỳ (nhị phân) thực thi nào với bit setuid được chạy đều có quyền của chủ sở hữu. Điều này có nghĩa là sudo chạy hiệu quả với quyền root bất kể người dùng nào thực sự gọi nó. Chỉ có chính sách bảo mật nội bộ của sudo quản lý người dùng nào được phép những gì và ngăn người dùng tùy tiện làm những việc tùy tiện.


Vì vậy, trong trường hợp sudo !!này có nghĩa là

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

về cơ bản là giống hệt với

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

chỉ cần gõ ít hơn. Trong cả hai trường hợp, sudo chỉ nhìn thấy mount /dev/sdb1 /mntvà chạy nó với quyền root.


5

!!là biểu thức cú pháp đơn giản nhất và có lẽ phổ biến nhất để mở rộng lịch sử .

Như bạn có thể nhận thấy, sau khi thay thế lệnh cuối cùng được thực thi !!, bash thực hiện hai điều (trong cấu hình mặc định của nó):

  1. Lệnh đầy đủ với văn bản thay thế được hiển thị cho bạn.

    Ví dụ: nếu lệnh của bạn là lshw -c videovà bạn chạy sudo !!tiếp theo, thì lệnh sau khi mở rộng lịch sử là sudo lshw -c video.

  2. Lệnh đó được chạy.

Thông thường hai bước này xảy ra mà không bị gián đoạn và không có cơ hội tương tác với người dùng, vì shopt histverifykhông được đặt mặc định ( shopt -u histverify).

Tuy nhiên, nếu bạn bật shopt histverify( shopt -s histverify) thì mở rộng lịch sử hoạt động khác nhau:

  1. Bạn nhận được một dấu nhắc chính mới, với văn bản mở rộng được nhập tự động vào đó. Như thể bạn đã tự gõ văn bản đó, với con trỏ ở cuối, nhưng chưa chạy lệnh.
  2. Bạn, người dùng, sau đó phải nhấn Enterđể chạy lệnh. Hoặc bạn có thể chỉnh sửa lệnh, hủy lệnh ( Ctrl+ C), v.v ... Lưu ý rằng đây không phải là lời nhắc đặc biệt, mà là lời nhắc chính thông thường. Nó thực sự là như thể bạn tự gõ văn bản.

(Lưu ý rằng histverify tùy chọn shell chỉ có hiệu lực nếu thư viện readline đang được sử dụng - nhưng khi bạn sử dụng bash tương tác trên Ubuntu hoặc hệ thống GNU / Linux khác, điều này về cơ bản luôn luôn như vậy.)

Cho dù histverifytùy chọn shell có được bật hay không , việc mở rộng lịch sử không giống với nhiều bản mở rộng shell khác. Các bản mở rộng shell khác không hiển thị cho bạn lệnh mở rộng trước khi nó được chạy. Không giống như các bản mở rộng khác, được dự định sử dụng cả tương tác và không tương tác (ví dụ: trong tập lệnh shell), mở rộng lịch sử hầu như luôn được sử dụng tương tác.


3

! được sử dụng trong Linux cho các phím tắt liên quan đến lịch sử. Vì thế, !! sẽ đơn giản chạy lệnh trước mà bạn đã thực hiện.

Nó rất hữu ích trong trường hợp khi bạn quên đặt sudo trước một lệnh yêu cầu hoặc bạn bị từ chối cấp phép hoặc một cái gì đó tương tự như vậy

sudo !!
và bạn đã hoàn thành.


0

!! sẽ lặp lại và chạy lệnh trước đó và với sudo, nó sẽ cung cấp cho lệnh đặc quyền gốc. (Nó không có trong trang người đàn ông à? !! Tôi không thể thấy nó ở đó.)


Đối với bất cứ ai đang tìm kiếm trang người đàn ông:man --pager='less -p "Event Designators"' bash
Sebi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.