Eski çekirdekleri güvenli kullanmak için bu komut kullanılır mı?

21

Ubuntu makaleleri için internette gezinirken, bu komuta geldim:

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d' | xargs sudo apt-get -y purge

Yazar, bunun Linux'un tüm önceki sürümlerini silen ve yalnızca geçerli olanı bırakan tek bir komut olduğunu söyledi

Aslında böyle bir komut arıyorum, ama bunun ne kadar güvenli olduğuna emin değilim. Bilmek istiyorum:

  • Bu komutu uygulamak güvenli midir?
  • Bu komut nasıl çalışır? yani böyle büyük bir komutanın küçük parçalarının açıklaması
  • Bu komutun farklı bir amaca hizmet etmesi durumunda, yazarın yapmasını istediği şeyi elde etmek için doğru komut ne olurdu?

Tek başıma çıkmaya çalıştığımda çok kafam ve sinirli oluyorum. Bu komut, Google için zor olan çok sayıda / , | , \ , * ve ^ karakter içeriyor.

Adım adım çeviri & amp; İnternet'te bulamadığım bu komut için açıklama !

    
sordu Z9iT 18.01.2013 19:20

3 cevap

27

Diyorum ki: mevcut formda kullanmayın

  1. Size sormadan değişiklik yapar. % Co_de% parçası, bir linenin onayınız olmadan temizleme paketlerini çalıştırmaya başlamasına izin verir. Komut dosyasında bir hata varsa, vidalanmış olabilirsiniz.

  2. Kaynak yok, yazar yok. Bunun kaynağı burada bir fark yaratıyor. İyice test edilmiş bir sistem paketinden gelmesi durumunda, üzerinde yapılan testin izini sürdürebiliriz. Rastgele bir kaynaktan, ona güvenemeyiz.

  3. apt-get -y purge , dpkg -l olmadan sorunsuz çalışıyor. Orijinal yazarın neden gerekli olduğunu düşündüğünü anlamıyorum.

Sağduyu kullan

Zararlı parçaları çıkarın ve root olarak çalışan herhangi bir şeyi dışarıda bırakın.

Örneğin, bunu şu şekilde kesin:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'

sadece yalnızca çıkarır ve ile normal kullanıcı izinleri çalıştırır. Kaldırılacak bu çekirdekten emin olduktan sonra, kendiniz kendiniz de sudo ekleyebilirsiniz. Kasıtlı olarak | xargs sudo apt-get purge seçeneği olmadan, dolayısıyla sisteminizde yapılacak değişikliklerin onaylanması istenir.

Açıklama

  • -y Tüm paketlerin listesini çıkarır. Bu durumda, yalnızca başlangıç ​​ paketlerini dpkg -l ile ad olarak listeler.
  • linux- (bir boru), soldaki komutun çıkışını ( | olarak adlandırırız) sağdaki komutun girişine yönlendirir (biz buna stdout diyoruz).
  • stdin , normal ifadeler kullanılarak dizeleri işlemek için kullanılan bir araçtır. Bu durumda, borunun solundaki komutun çıktısını ve kurulu paketler için filtreleri ( sed 'si ile ii ' ye bağlı olarak) kullanır. Bu davada bile iç içe. Karmaşık düzenli ifadelerle kullanımı çok karmaşık olduğundan, dpkg 'nin tüm kullanımını burada açıklamak çok zor olacaktır. ( sed , normal ifadenin bir örneğidir.
  • Düzenli ifadeler , temsil ettikleri ifadeye dayalı eşleşmeleri bulmak için çok yaygın olarak kullanılır. \(.*\)-\([^0-9]\+\)" , bir tür evrensel arama-ve-değiştirme yapmak için ikame referanstır (% 'lik co_de% ile ilk' isabet'e gönderme). Normal ifadenin kendisi herhangi bir zarar veremez. Ancak, girdiyi yanlış bir şekilde manipüle ederse, yanlış paketleri çıkarmanıza veya hatta kabuk enjeksiyon yapmanıza neden olabilirler. Bu durumda, tarafından sağlanan sürüme bağlı olarak çekirdek paketinin adını bulmanın bir yolu gibi görünüyor.
  • 1 , çalışan çekirdek sürümünün geçerli sürümünü verir.
  • uname -r , komutun argümanları olarak borunun solundaki girdinin satırlarını ekler. Bu durumda, her satırdaki çekirdek sürümleri yatay boşlukla ayrılmış bir listeye dönüştürülür ve uname -r komutuna eklenir.
  • Verilen paketlerin xargs (her şeyi kaldırır) temizler (argümanlar olarak).

Alternatifleri

Bazı soruların büyük olasılıkla bunun hakkında zaten sorulmuştur. Şimdiye kadar bulduklarım:

verilen cevap gertvdijk 18.01.2013 19:40
7

Adım adım açıklama istendin, işte burada:

sudo dpkg -l 'linux-*'

Paket adında linux- ile başlayan paketleri listeler

| sed

ve listeyi sed

içine alın
"s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'

listeyi düzenlemek için çok karmaşık bir düzenli ifade kullanacaktır

| xargs

yeni listeyi xargs değerine pipetleyecek, bu da bunu argüman olarak gönderecek

sudo apt-get -y purge

bu paketleri, fikrinizi değiştirme şansı vermeden boşaltacaktır.

Ya da belki de bu listeyi tasfiye komutuna göndereceğini ve bunu bırakacağını söylemek daha doğru olur. Herhangi bir şey temizlenmiş olsun ya da olmasın - ve önemlisi - tam olarak neyin temizlendiği önceki komutların çıkışına bağlıdır.

Güvenli mi? Bu durumda, yazının yazarının, normal ifadeleri ve sed sözdizimini anladığını bulduğunuz yazının ne kadar iyi olduğuna bağlıdır. Ve bu konuların her ikisinde de kitaplar var.

    
verilen cevap chaskes 18.01.2013 19:50
6

Komutları dağıtarak, her biri için man sayfasını okuyarak başladım.

  • dpkg -l : pacakges listesi, bu yüzden dpkg -l linux-* , linux- (genellikle çekirdekler) ile başlayan tüm paketleri listeler.

  • sed : dpkg -l linux-* çıktısı sed kodunu çözen birkaç normal ifadeyle sed değerine aktarılır.

  • uname -r uname , sistem bilgilerini yazdırır

  

uname - baskı sistemi bilgileri

-r tutamacı, özellikle çekirdek sürümlerini yazdırıyor:

  

-r, - kernel-release kernel sürümünü yazdır

uname -r 'nin çıkışı daha sonra sed ' ye daha düzenli ifadelerle aktarılır, bunun xargs 'sine geçirilmesi

Dolayısıyla, xargs , sed çıktısını paket adlarına çevirir ve bunları, tüm istemlere otomatik olarak 'yes' (evet) yanıtlayan sudo apt-get purge -y 'ye geçirir:

  

-y, --yes, --assume-evet              Otomatik olarak sorulan sorular; Tüm istemlere cevap olarak "evet" ibaresini al ve              olmayan etkileşimli. Beklenen bir paketin değiştirilmesi gibi istenmeyen bir durum varsa,              kimliği doğrulanmamış bir paket yüklemek veya temel bir paketi kaldırmak              apt-get sona erecek. Yapılandırma Öğesi: APT :: Get :: Assume-Yes.

Bu komutun, <%> sed 'sinin normal ifadelerini çevirmek zorunda olduğumuzu bilmek için istediğinizi yapması gerekiyor.

Az önce koştum:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'  

ekran görüntüsü:

Tüm eski çekirdek sürümleri iirc.

    
verilen cevap Seth 18.01.2013 19:43

Etiketlerdeki diğer soruları oku