Jalankan perintah yang sama lagi tetapi sebagai root

117

Terkadang ketika saya menjalankan perintah, saya tidak melihat bahwa saya perlu menjalankannya sebagai pengguna super untuk memiliki cukup izin.

Apakah ada cara untuk menjalankan perintah yang sama lagi tetapi sebagai pengguna super?

Trufa
sumber

Jawaban:

196

Cara paling sederhana adalah menjalankan:

sudo !!

Ini akan menjalankan perintah terakhir tetapi sebagai pengguna super.

Sumber .

Trufa
sumber
5
Saya menemukan ini sangat berguna dan saya belum pernah menemukannya sebelumnya (meskipun mungkin pengetahuan umum). Saya tidak dapat menemukannya di situs, jadi saya pikir saya akan menjawabnya sendiri.
Trufa
30
Sebagai tambahan, mengeksekusi !!sendiri menjalankan perintah Anda sebelumnya sesuai disimpan history. Selain itu, melakukan !-1,, !-2dan seterusnya menjalankan perintah terakhir Anda, perintah terakhir kedua, dan seterusnya. Berguna!
oaskamay
6
Di samping yang lain, !<command>akan mengeksekusi acara terakhir dari ~/.bash_historyyang dimulai dengan<command>
Radu Rădeanu
1
ctrl-r juga sangat berguna. itu akan mencari mundur dalam sejarah Anda untuk perintah yang cocok dengan apa yang Anda ketik. Ini akan memungkinkan Anda mengedit perintah sebelum menjalankannya lagi
KayEss
4
Benda bodoh !yang disalin ini tcshtelah mengacaukan saya lebih banyak daripada yang pernah berguna. Kutipan ganda tidak melindungi dari interpretasi !. $ foo "!bar"-> !bar: event not found.
Kaz
70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​masukkan deskripsi gambar di sini

jawaban : Anda sudo !!langsung masuk setelah itu untuk mengulangi perintah sebelumnya dengan hak yang ditingkatkan.

sunting: Gambar ditemukan melalui reddit , dan itu adalah parodi dari komik xkcd asli oleh Randall Munroe.

wim
sumber
3
tolong jangan bicara pro-atau-menentang di sini di komentar. Jika Anda ingin mendiskusikan kelebihan atau kekurangannya, silakan gunakan Meta. Terima kasih.
fossfreedom
17

Anda dapat mencoba tombol panah atas untuk menelusuri perintah lama Anda dan menulis ulang / mengubahnya dan menambahkan sudodi depannya. (tombol beranda di atas tombol panah akan mengatur posisi ke awal.)

Saya tidak suka sudo !!ide itu, karena kadang-kadang Anda menambahkan perintah lain di antara dan tidak ingat lagi.

Xilol
sumber
1
Untungnya, ketika Anda melakukannya sudo !!, shell akan membesar !!sehingga Anda dapat melihat perintah apa yang coba dijalankan. Jadi, itu mungkin menjengkelkan untuk menekan Ctrl-C dan menemukan perintah yang tepat, tetapi setidaknya tidak akan membawa Anda tidak sadar.
Reid
4
@Reid Itu tidak akan berkembang sampai setelah Anda menekan enter, dan jika Anda berada di dalam jendela itu di mana Anda tidak perlu memasukkan kata sandi lagi, itu akan berjalan tanpa konfirmasi. +1 untuk menggunakan riwayat alih-alih menggunakan secara membabi buta!!
Izkata
5
@Izkata: Saya kira itu benar. Saya menggunakan zsh, jadi saya cukup mengetik sudo !!<TAB>dan autocomplet !!untuk saya. Bash dapat memperluas riwayat dengan M-^(bagi saya, alt + shift + 6), tapi itu kurang lancar (Anda bisa mengubahnya lagi). Ada juga shopt -s histverify, yang membuatnya sehingga ketika Anda menggunakan ekspansi histori dan tekan enter, itu malah memberi Anda baris prompt lain dengan ekspansi dilakukan untuk membiarkan Anda melihat / mengeditnya.
Reid
1
Saya lebih memikirkan situasi di mana saya mengetik perintah, perintah mengembalikan izin yang ditolak, dan saya tahu saya ingin menjalankan perintah yang sama persis lagi, tetapi sebagai sudo, proses menekan, pulang, mengetik sudo dan merasa jauh lebih lambat untuk saya. Begitulah cara saya melakukannya selamanya dan rasanya tidak efisien.
Trufa
@ Reid: shopt -s histverifytidak akan membantu sedikit pun. Kebanyakan orang akan terbiasa memukul Enterdua kali. Pada saat itu mereka masih terlambat untuk memeriksa apa yang terjadi.
Frank Kusters
13

Saya hanya akan menambahkan alternatif: sesingkat mengetik sudo !!dan lebih fleksibel:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Ini persis dengan jumlah penekanan tombol yang sama (saya menghitung "ctrl + A" sebagai satu ...), tetapi menambahkan "panah atas" Anda dapat melakukannya pada perintah mana pun yang ada dalam riwayat Anda.

Olivier Dulac
sumber
1
ctrl + A berasal dari binding emacs, Anda juga dapat menggunakan vi binding ( set -o vi). Kemudian Anda dapat Escape (masuk ke mode perintah), dan kemudian 'I' (huruf kapital 'i', masukkan di awal baris).
Gerhard Burger
1
@ GreerhardBurger: Saya tahu, tapi anehnya, saya suka vi (terutama vim) untuk mengedit dokumen multi-line, tapi saya lebih suka emacs mengikat di shell (harus beralih dari perintah ke mode edit di shell tidak benar-benar masuk akal, imo, dan pintasan emacs cukup untuk penggunaan sehari-hari, bahkan jika kurang kuat)
Olivier Dulac
Benar, saya menambahkannya hanya untuk kelengkapan, bagi saya itu sama, namun saya menemukan pencarian dengan '/' sangat mudah;)
Gerhard Burger
@GerhardBurger: tentang mode "/" bash, mode (mengikat emacs) mode vi juga memiliki cara yang sangat berguna untuk menemukan perintah sebelumnya dengan mengetikkan beberapa huruf kemudian 'ctrl + r' hingga Anda menemukannya
Olivier Dulac
7

Ada beberapa cara untuk melakukan ini

  • Cukup masukkan kembali perintah sudosebelum menambahkan perintah

  • Tekan Up arrowuntuk mendapatkan perintah terakhir dan letakkan sudodi depannya.

  • Memasukkan sudo !!

The !!mengembang untuk yang terakhir memasuki perintah. Anda dapat melakukan hal serupa dengan hal lain dengan sejarah baris perintah lihat di sini

pengguna162424
sumber
7

Pertanyaan ini dapat digeneralisasi menjadi " Jalankan perintah yang sama tetapi dengan beberapa modifikasi ", karena salah satu keputusan desain yang brilian di Unix, adalah bahwa apa yang diimplementasikan sekali dalam shell, dapat dimanfaatkan oleh setiap perintah yang dipanggil dari shell.

Dengan kata lain, trik ini tidak hanya berlaku untuk sudo:

  • Ulangi perintah sebelumnya sebagai superuser ( sudo !!)
  • Ulangi perintah sebelumnya dan waktu itu ( time !!)
  • Ulangi perintah sebelumnya dengan lingkungan yang berbeda ( env A=b B=z !!)
  • Ulangi perintah sebelumnya ( !!)

Ekspansi histori (juga dikenal sebagai subtitusi histori) hanyalah fitur shell untuk membuat pengulangan perintah sebelumnya lebih mudah (dengan sedikit penekanan tombol). Periksa halaman manual shell Anda history expansion. Ini menjelaskan banyak trik dan jalan pintas yang dapat Anda lakukan dengan histori misalnya:

Anda dapat merujuk ke perintah sebelumnya dengan nomor:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Anda dapat merujuk kata-kata individual dalam perintah sebelumnya:

some-command !$     # run some-command on the last arg of previous command

Anda juga dapat mencari sebelum mengulang:

!?awk               # repeat the last command including the string 'awk'

Anda dapat mencari riwayat dan mengganti sesuatu dengan sesuatu yang lain:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

Dan banyak lagi, karena Anda dapat menggabungkan pemilihan perintah, pemilihan arg, pencarian dan penggantian secara mandiri.

Halaman manual shell Anda (dalam hal ini man bash) adalah teman Anda.

diri sendiri
sumber
1
brilian! bahwa seseorang harus menjadi jawaban yang diterima.
Eliran Malka
5

Saya menggunakan zsh bukan bash dan memilikinya di saya ~/.zshrc, jadi menekan Alt+ Ssisipan sudodi awal baris perintah:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Sayangnya, saya tidak dapat melacak cara untuk melakukan hal yang sama di bash.

Tambalan
sumber
3
Anda dapat dengan mudah melakukan hal yang sama di Bash menggunakan GNU Readline: tambahkan ke Anda ~/.inputrc "\es":"\C-asudo "dan Anda akan pindah ke awal garis panjang dan sudo akan dimasukkan pada awal baris setelah menekan alt-s. Mulai ulang terminal atau baca ~/.inputrckembali agar berfungsi.
2

Jika Anda ingin melakukannya dalam alias, Anda harus menggunakan alias redo='sudo $(history -p !!)'untuk beberapa alasan.

Aaron Franke
sumber
1
su -c "!!"

Jika Anda tidak memiliki izin untuk melakukan root dengan program sudo atau sudo tidak diinstal pada sistem.

Achu
sumber
1

Cara saya lebih suka:

  • Tombol panah ke atas
  • Rumah
  • "sudo"
  • Memasukkan

Tapi mungkin lebih mudah melakukan "sudo !!", terserah Anda.

Farid El Nasire
sumber