Apa arti `!!` dalam `sudo !!`?

64

Saya adalah pengguna Ubuntu dengan tidak banyak pengalaman dan saya telah menggunakan sudo.

Apa yang sudo !!dilakukan dan bagaimana?

RamHS
sumber
7
Gandakan, kecuali dari sisi lain: Jalankan perintah yang sama lagi tetapi sebagai sudo
a CVn
6
@ WarrenHill dia tidak menginginkan "bagaimana" tetapi "apa" dan "bagaimana". Dia bertanya lebih banyak tentang !!bagian dari perintah.
Braiam
1
@Nakilon seharusnya tidak. Pertanyaan ini menanyakan apa yang !!harus dilakukan dan bagaimana. Yang lain ingin metode untuk melakukan ini.
Braiam
@ MichaelKjörling maksudmu terkait, bukan?
Braiam
2
@Braiam Sebenarnya, maksud saya duplikat; dua jawaban dengan suara tertinggi untuk yang satu secara spesifik menjelaskan apa yang sudo !!dilakukan, dan ada dua jawaban yang sebenarnya secara spesifik menjelaskan apa yang !!dilakukan.
CVn

Jawaban:

74

!!di bash adalah alias untuk perintah sebelumnya (lihat Perancang Acara ). Jadi itu menjalankan kembali perintah sebelumnya dengan sudoizin.

kronis
sumber
15
Catatan: !perintah biasanya tidak tersedia dalam skrip bash (hanya dalam sesi interaktif). Mereka dapat dinonaktifkan dengan set +o histexpand.
Benoit
64

sudo bang bang adalah perintah yang sangat berguna saat bekerja di Command Line Interface.

Beberapa distro Linux meminta Anda login sebagai pengguna alih-alih sebagai administrator.

Jadi, untuk melakukan sesuatu yang bijaksana, Anda harus melanjutkan perintah dengan sudo(Super-User DO), yang memberi tahu sistem "Anda akan melakukan ini, karena saya bilang begitu." / bang-bang (! = bang) pada dasarnya adalah jalan pintas yang dapat Anda gunakan untuk mengulangi perintah sebelumnya.

Jadi, skenario umum adalah bahwa Anda mencoba perintah, dan menendang kembali pesan yang mengatakan Anda harus menjadi admin untuk melakukan itu. Jadi, Anda bisa mengetik sudountuk menjalankan perintah itu sebagai super-user / admin, atau Anda bisa mengetik di sudo !!mana !!memberitahu sistem untuk menggunakan perintah sebelumnya yang dicoba. UfH

Ada banyak bang-command lainnya. Untuk daftar mereka dan penjelasannya, lihat Linux Bang Commands , lihat juga Bash history dan bang perintah

Mitch
sumber
12
Ini juga merupakan perintah yang sangat berbahaya jika Anda tidak 100% yakin apa perintah Anda sebelumnya. Hampir selalu lebih aman untuk hanya menekan panah atas, lalu kunci rumah, lalu ketik sudodan lihat baris perintah.
Shadur
3
@ Safad Biasanya perintah Anda sebelumnya sekitar 1 detik yang lalu. Kasus penggunaan normal adalah yang dijelaskan dalam jawaban: Anda lupa untuk sudosesuatu dan mendapatkan error, sehingga Anda segera ingin sudoitu
Michael Mrozek
1
@Braiam: CLI adalah singkatan. Pelanggaran aturan komunitas! Menyerang! Sunting ulang!
India
4
sudotidak berarti "super-user do", ia melakukan perintah seperti yang telah saya lakukan su(su berarti ganti pengguna [dan bukan pengguna super]); yaitu, Anda dapat menggunakan perintah sudo sebagai pengguna mana pun, tidak hanya root ( -uberalih); Hal yang sama berlaku dengansu [user] [-c command]
ssice
1
@Mitch kecuali sutidak tahan untuk hal seperti itu. Lihat linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Itu harus berarti pengguna pengganti .
ssice
38

The bang bang (!!)perintah adalah jalan pintas untuk mengulang dan menjalankan perintah sebelumnya Anda masukkan di dalam terminal. Perintah ini sangat berguna ketika Anda lupa bahwa Anda memerlukan hak admin untuk melakukan tindakan tertentu, dan memungkinkan Anda mengulanginya dengan hak pengguna super hanya dengan mengetik,

sudo !!

!! meraih perintah jalankan terakhir.

Sebagai contoh:

apt-get update

Outputnya adalah,

E: Tidak dapat membuka file kunci / var / lib / apt / daftar / kunci - terbuka (13: Izin ditolak)
E: Tidak dapat mengunci direktori / var / lib / apt / daftar /
E: Tidak dapat membuka file kunci / var / lib / dpkg / lock - open (13: Izin ditolak)
E: Tidak dapat mengunci direktori administrasi (/ var / lib / dpkg /), apakah Anda root?

Setelah itu, jika kita menjalankan sudo !!perintah, hasilnya akan menjadi

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]

Yang berarti !!bagian mengambil perintah jalankan sebelumnya apt-get updatedan bagian sebelumnya sudomembuat perintah untuk dijalankan dengan hak pengguna super.

Dan bagaimana yang sudo !!berjalan perintah sebelumnya dengan hak superuser berarti, biasanya semua perintah kami memasuki pada terminal disimpan di command history.run yang historyperintah pada terminal, itu menunjukkan semua perintah Anda entered.The !!bagian dalam sudo !!diperebutkan perintah terakhir yang tersimpan dalam sejarah perintah dan keseluruhan sudo !!menjalankan perintah terakhir dengan hak admin.

Beberapa perintah bang lainnya dijelaskan dalam posting blog ini .

Avinash Raj
sumber
3
Saya terkejut melihatnya menyebutkan 'bang bang' lagi. Saya pikir sekali sudah cukup.
kiri
1
+1 untuk lebih banyak contoh perintah bang.
WernerCD
1
@Rmano Setidaknya di Bash, dan saya berharap semua kerang Bourne-style dengan dukungan sejarah, mkdir LongDirectoryNamedan cd !$harus dikeluarkan secara terpisah untuk bekerja, kecuali LongDirectoryNamekebetulan kata terakhir dari perintah sebelumnya. Untuk keperluan histori shell, mkdir LongDirectoryName; cd !$adalah satu perintah. Interaksi sejarah dengan !!,, !^dan !$menggunakan perintah terakhir shell benar-benar sepenuhnya diproses sebelum melihat !. Ini sebuah contoh. Jika Anda menjalankan, historyAnda akan melihat bahwa perintah-perintah pada sebuah garis yang digabungkan oleh ;diingat sebagai satu perintah.
Eliah Kagan
@EliahKagan kau benar! Menghapus info yang salah ...
Rmano
13

Ada dua bagian jawabannya: !!dansudo

!!adalah bagian dari fungsionalitas shell (dalam hal Ubuntu ini mungkin bash, tetapi shell lain seperti zsh atau csh mendukung ini, juga) yang disebut "ekspansi sejarah". Itu berperilaku dengan cara yang sama seperti ekspansi lain di mana shell memperluas 'placeholder' ke serangkaian kata. Sementara foo*akan diperluas ke daftar semua file yang dimulai dengan 'foo', !!akan diperluas ke isi baris perintah sebelumnya.

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

Seperti ekspansi lainnya, ini dilakukan sepenuhnya oleh shell, jadi jika Anda mengetik !!setelah beberapa perintah lain, perintah ini tidak menyadari bahwa ada !!, tetapi hanya akan melihat baris perintah sebelumnya. (Tidak seperti ekspansi lainnya, ekspansi sejarah terjadi sebelum perintah disimpan dalam riwayat, yang bukan !!baris perintah yang diganti akan disimpan ke riwayat.)


The sudoperintah memungkinkan melaksanakan perintah sebagai user lain, asalkan izin ar diberikan oleh kebijakan keamanan (default dikonfigurasi dalam /etc/sudoers).

Secara default kata sandi root tetap tidak disetel di Ubuntu. Untuk melakukan tugas administrasi sistem, pengguna yang dibuat selama instalasi diberikan hak sudo. Pengguna ini sekarang dapat menjalankan perintah apa saja pada shell sebagai root, hanya dengan melakukan prepending sudo. Beberapa program GUI juga menggunakan mekanisme sudo, misalnya manajemen paket.

Alasan mengapa sudodapat menjalankan perintah lain sebagai root (atau pengguna lain) adalah bahwa sudo binary ( /usr/bin/sudo) memiliki bit setuid yang diatur dalam izinnya dan menjadi milik root. Setiap (biner) yang dapat dieksekusi dengan set setuid bit dijalankan dengan izin dari pemiliknya. Ini berarti bahwa sudo berjalan secara efektif dengan izin root tidak peduli pengguna mana yang benar-benar memanggilnya. Hanya dia kebijakan keamanan internal sudo mengelola pengguna mana yang diizinkan apa dan mencegah pengguna sewenang-wenang untuk melakukan hal-hal yang sewenang-wenang.


Jadi, dalam hal sudo !!ini berarti

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

pada dasarnya identik dengan

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

kurang mengetik. Dalam kedua kasus, sudo hanya melihat mount /dev/sdb1 /mntdan menjalankannya dengan izin root.

Adaephon
sumber
5

!!adalah ekspresi yang paling sederhana secara sintaksis dan mungkin paling umum untuk ekspansi sejarah .

Seperti yang mungkin Anda perhatikan, setelah mengganti perintah terakhir yang dijalankan !!, bash melakukan dua hal (dalam konfigurasi default):

  1. Perintah lengkap dengan teks yang diganti ditampilkan kepada Anda.

    Misalnya, jika perintah lshw -c videoAnda dan Anda menjalankan sudo !!berikutnya, maka perintah setelah ekspansi sejarah adalah sudo lshw -c video.

  2. Perintah itu dijalankan.

Biasanya kedua langkah ini terjadi tanpa gangguan dan tanpa peluang untuk interaksi pengguna, karena shopt histverifytidak disetel secara default ( shopt -u histverify).

Namun, jika Anda mengaktifkan shopt histverify( shopt -s histverify) maka ekspansi sejarah berfungsi berbeda:

  1. Anda mendapatkan prompt utama baru, dengan teks yang diperluas secara otomatis dimasukkan di atasnya. Seolah-olah Anda telah mengetik teks itu sendiri, dengan kursor di akhir, tetapi belum menjalankan perintah.
  2. Anda, pengguna, kemudian harus menekan Enteruntuk menjalankan perintah. Atau Anda dapat mengedit perintah, membatalkannya ( Ctrl+ C), dll. Perhatikan bahwa ini bukan prompt khusus, tetapi prompt primer reguler. Ini seperti Anda mengetik teks sendiri.

(Perhatikan bahwa histverify opsi shell hanya berlaku jika pustaka readline sedang digunakan - tetapi ketika Anda menggunakan bash secara interaktif pada sistem Ubuntu atau GNU / Linux lainnya, ini pada dasarnya selalu demikian.)

Apakah histverifyopsi shell diaktifkan atau tidak , ekspansi riwayat tidak sama dengan banyak ekspansi shell lainnya. Ekspansi shell lain tidak menunjukkan perintah yang diperluas sebelum dijalankan. Tidak seperti ekspansi lainnya, yang dimaksudkan untuk digunakan baik secara interaktif maupun non-interaktif (misalnya, dalam skrip shell), ekspansi sejarah hampir selalu digunakan secara interaktif.

Eliah Kagan
sumber
3

! digunakan di Linux untuk pintasan terkait sejarah. Jadi, !! hanya akan menjalankan perintah sebelumnya yang Anda jalankan.

Ini sangat membantu dalam kasus ketika Anda lupa untuk menempatkan sudo di depan perintah yang mengharuskannya atau Anda mendapatkan Izin Ditolak atau sesuatu seperti itu lakukan saja

sudo !!
dan kamu sudah selesai.

tapananand
sumber
0

!! akan mengulang dan menjalankan perintah sebelumnya, dan dengan sudo itu akan memberikan perintah privilege root. (Itu tidak ada di halaman manual? !! Aku tidak bisa melihatnya di sana.)

Farimah
sumber
Bagi siapa pun yang mencari halaman manual:man --pager='less -p "Event Designators"' bash
Sebi