!! 'sudo !!' ne demek?


64

Çok fazla tecrübeye sahip olmayan bir Ubuntu kullanıcısıyım ve kullanıyorum sudo.

Ne yapar sudo !!ve nasıl?



6
@WarrenHill “nasıl” değil “ne” ve “nasıl” istemiyor. !!Komuta kısmı hakkında daha fazla soru sordu .
Braiam

1
@Nakilon olmamalı. Bu soru ne !!yapacağını ve nasıl olduğunu soruyor . Diğeri bunu yapmak için bir yöntem istiyor.
Braiam

@ MichaelKjörling ilgili haklı mı demek istediniz?
Braiam

2
@Braiam Aslında, yinelenen demek istedim; En yüksek oyu alan iki cevabın ne yaptığını özellikle açıkladığını sudo !!ve aslında ne yaptığını özellikle açıklayan iki cevap var !!.
Kasım'da

Yanıtlar:


74

!!bash, önceki komutun takma adıdır (bkz. Olay Göstergeleri ). Böylece önceki komutu sudoizinlerle tekrar çalıştırır .


15
Not: !komutlar genellikle bash komut dosyalarında kullanılamaz (yalnızca etkileşimli oturumlarda). İle devre dışı bırakılabilirler set +o histexpand.
Benoit

64

sudo bang bang Komut Satırı Arabiriminde çalışırken çok faydalı bir komuttur.

Bazı Linux dağıtımları, yönetici yerine kullanıcı olarak giriş yapmanızı sağlar.

Dolayısıyla, yönetici olarak bir şeyler yapmak için, komutu “ sudoSüper Kullanıcı DO) ile devam ettirmelisiniz; / bang-bang (! = bang) temelde önceki komutu tekrarlamak için kullanabileceğiniz bir kısayoldur.

Bu nedenle, tipik senaryo bir komutu denemenizdir ve bunu yapmak için yönetici olmanız gerektiğini söyleyen bir mesajı geri alır. Yani, yazabilirsiniz sudosüper kullanıcı / yönetici olarak bu komutu çalıştırmak için, ya da yazabilirsiniz sudo !!nerede !!çalışıldı önceki komutunu kullanmak sistemini anlatır. UFH'n

Başka birçok bang-komutu var. Bunların bir listesi ve ne oldukları hakkında açıklamalar için Linux Bang Komutlarını inceleyin , aynı zamanda Bash tarihine ve patlama komutlarına bakın.


12
Aynı zamanda, önceki komutunuzun ne olduğundan% 100 emin değilseniz çok tehlikeli bir komuttur. Sadece yukarı ok, sonra ana tuşa basmak, ardından sudokomut satırına bakmak ve bakmak neredeyse her zaman daha güvenlidir .
Shadur

3
@Shadur Genellikle önceki komutunuz yaklaşık 1 saniye önceydi. Normal kullanım durumu cevabında anlatılandır: bir şeyi unutur sudove bir hata alırsınız, bu yüzden hemen istemeniz sudogerekir
Michael Mrozek 18:13

1
@Braiam: CLI bir kısaltmadır. Topluluk kuralı ihlali! Saldırı! Yeniden düzenleme!
Hint

4
sudoanlamına gelmez olarak, bu gider "süper kullanıcı yapmak" do bir komut sanki ben yapmış su(su anlamına gelen anahtar kullanıcı [değil süper kullanıcı]); yani, komutları herhangi bir kullanıcı olarak sudo edebilirsiniz, sadece root ( -uswitch); Aynı şeysu [user] [-c command]
ssice 18:13

1
@Mitch hariç suböyle bir şey için geçerli değil. Bkz linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Yedek kullanıcı anlamına gelmelidir .
ssice

38

bang bang (!!)Komut için bir kısayoldur önceki komutu tekrarlayın ve çalıştırmak size terminalde girdi. Bu komut, belirli bir işlem yapmak için yönetici haklarına ihtiyaç duyduğunuzu unutursanız ve süper kullanıcı haklarıyla yalnızca yazarak tekrar etmenize izin verdiğinde çok yararlıdır,

sudo !!

!! son çalıştırma komutunu alır.

Örneğin:

apt-get update

Çıktı olacak

E: kilit dosyası açılamadı / var / lib / apt / listeleri / kilit - açık (13: İzin reddedildi)
E: Dizin kilitlenemedi / var / lib / apt / listeleri /
E: Kilit dosyası açılamadı / var / / lib / dpkg / lock - açık (13: İzin reddedildi)
E: Yönetim dizini kilitleyemiyor (/ var / lib / dpkg /), root mu?

Bundan sonra, eğer sudo !!komutu çalıştırırsak , çıktı

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]

Bu, !!parça önceki çalıştırma komutunu alır apt-get updateve önceki sudobölüm, süper kullanıcı haklarıyla çalıştırılmasını sağlar.

Ve nasılsudo !! superuser hakları ile önceki komut anlamına gelir çalışır, biz saklanır terminalde girilen normalde bütün komutlar command history.Run historyterminalde komut, bu entered.The tüm komutları gösterir !!yer sudo !!kapmak son komut saklanan komut geçmişinde ve tüm sudo !!komutlar yönetici ayrıcalıklarına sahip son komutu çalıştırır.

Diğer blog komutları bu blog yazısında açıklanmıştır .


3
Tekrar 'bang bang' dediğini görünce şaşırdım. Bir kere yeterli olduğunu düşündüm.
kiri

1
Daha fazla bang komutu örneği için +1.
WernerCD

1
@Rmano En azından Bash ve tarih desteğiyle tüm Bourne tarzı kabukları bekliyoruz, mkdir LongDirectoryNameve cd !$sürece işe ayrı verilmiş olması gerekir LongDirectoryNameönceki komuta son söz edilmiş olur. Kabuk geçmişi mkdir LongDirectoryName; cd !$için bir komuttur. Geçmiş etkileşimi ile !!, !^ve !$kabuk aslında tam görmeden önce işlenen son komutunu kullanın !. İşte bir örnek. Eğer historykoşarsanız, bir hattaki komutların ;bir komut olarak hatırlandığını göreceksiniz .
Eliah Kagan,

@EliahKagan haklısın! Yanlış bilgi
silindi

13

Cevap için iki bölüm var: !!vesudo

!!kabuğun işlevselliğinin bir parçasıdır (Ubuntu durumunda bu muhtemelen bash, ancak zsh veya csh gibi diğer kabukları da bunu "tarih genişletme" olarak adlandırır). Kabuğun 'yer tutucuyu' bir dizi kelimeye genişlettiği diğer genişlemelerde olduğu gibi davranır. İken foo*'foo' ile başlayan tüm dosyaların bir listesini genişletileceğini bildirdi, !!önceki komut satırına içeriğine genişletilmiş olur.

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

Diğer açılımlarda olduğu gibi, bu tamamen kabuk tarafından yapılır, bu nedenle !!başka bir komuttan sonra yazarsanız , bu komut a olduğunun farkında değildir !!, ancak yalnızca önceki komut satırını görür. (Diğer açılımlardan farklı olarak, geçmiş genişlemesi geçmişe bir komut kaydedilmeden önce gerçekleşir, bunun yerine !!değiştirilen komut satırı yerine geçmişe kaydedilir.)


sudoKomut başka bir kullanıcı olarak komutları çalıştırarak sağlayan, izinleri (varsayılan yapılandırılmış güvenlik politikası tarafından verilen ar sağlanan /etc/sudoers).

Varsayılan olarak root şifresi Ubuntu'da ayarlanmadan kalır. Sistem yönetimi görevlerini yerine getirmek için, kurulum sırasında yaratılan kullanıcıya sudo hakları verilir. Bu kullanıcı artık sadece ön hazırlık yaparak kabuktaki herhangi bir komutu root olarak çalıştırabilir sudo. Bazı GUI programları, örneğin paket yönetimi gibi sudo mekanizmasını da kullanır.

sudoDiğer komutları root (veya başka bir kullanıcı) olarak çalıştırmanın nedeni , sudo binary'in ( /usr/bin/sudo) setuid bit'in izninde ayarlanmış olması ve root'a ait olmasıdır. Setuid biti ile çalıştırılabilen herhangi bir (ikili), sahibinin izinleriyle çalıştırılır. Bunun anlamı, sudo, hangi kullanıcının gerçekte çağırdığı önemli değildir, kök izinleriyle etkin bir şekilde çalışır. Sadece kullanıcının iç güvenlik politikaları, hangi kullanıcının neye izin vereceğini yönetir ve keyfi kullanıcıların keyfi işleri yapmasını önler.


Yani, söz konusu sudo !!bu demektir

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

temelde aynıdır

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

sadece daha az yazarak. Her iki durumda da, sudo sadece mount /dev/sdb1 /mntonu kök izinleriyle görür ve çalıştırır.


5

!!tarihin genişlemesi için sözdizimsel olarak basit ve muhtemelen en yaygın ifadedir .

Fark ettiğiniz gibi, çalıştırılan son komutu değiştirdikten sonra !!, bash iki şeyi yapar (varsayılan konfigürasyonunda):

  1. İkame edilmiş metin içeren tam komut size gösterilir.

    Örneğin, eğer emriniz buysa lshw -c videove bir sudo !!sonraki adımda koşuyorsanız , tarih genişlemesinden sonraki komuttur sudo lshw -c video.

  2. Bu komut çalıştırıldı.

Normalde bu iki adım kesinti olmadan ve kullanıcı etkileşimi için hiçbir fırsat olmadan gerçekleşir, çünkü shopt histverifyvarsayılan olarak ayarlanmamıştır ( shopt -u histverify).

Ancak, shopt histverify( shopt -s histverify) özelliğini etkinleştirirseniz geçmiş genişletme işlemi farklı çalışır:

  1. Genişletilmiş bir metin otomatik olarak girilmiş olarak yeni bir birincil komut istemi alırsınız. Sanki o metni kendiniz yazmışsınız gibi, imleç en sonunda, ancak komutu henüz çalıştırmamışsınızdır.
  2. Siz, kullanıcı, Enterkomutu çalıştırmak için tuşuna basın . Veya komutu düzenleyebilir, iptal edebilir ( Ctrl+ C), vb. Bunun özel bir bilgi istemi değil, normal bir bilgi istemi olduğunu unutmayın. Gerçekten de metni kendin yazmışsın gibi.

( histverify Kabuk seçeneğinin sadece okuma satırı kütüphanesi kullanılıyorsa etkili olacağını unutmayın - fakat bir Ubuntu veya diğer GNU / Linux sisteminde bash'ı etkileşimli olarak kullandığınızda, bu esasen her zaman böyledir.)

histverifyKabuk seçeneğinin etkin olup olmadığı , tarih genişletme diğer pek çok kabuk genişlemesine benzemez. Diğer kabuk açılımları, çalıştırılmadan önce size genişletilmiş komutu göstermez. Hem etkileşimli hem de etkileşimli olmayan (örneğin bir kabuk komut dosyasında) kullanılması amaçlanan diğer genişlemelerin aksine, tarih genişletme neredeyse her zaman etkileşimli olarak kullanılır.


3

! Linux'ta tarih ile ilgili kısayollar için kullanılır. Yani, !! Sadece yürüttüğünüz önceki komutu çalıştıracak.

Gerektiren bir emirden önce sudo koymayı unutmanız veya İzin Verilmemesi veya bunun gibi bir şey yapmanız durumunda çok yararlıdır.

sudo !!
ve bitti.


0

!! önceki komutu tekrar edip çalıştıracak ve sudo ile komuta kök ayrıcalık verecek. (Adam sayfasında değil mi? !! Orada göremiyorum.)


Adam sayfasını arayanlar için:man --pager='less -p "Event Designators"' bash
Sebi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.