Eski çekirdekleri kaldırmak için bu komut kullanmak güvenli midir?


21

Ubuntu makaleleri için internette gezinirken, şu komutla karşılaştım:

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

Yazar, bunun önceki tüm Linux sürümlerini silen ve sadece geçerli olanı bırakan tek bir satır komutu olduğunu söyledi !

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

  • Bu komutu yerine getirmenin güvenli olup olmadığı?
  • Bu komut nasıl çalışır? yani, bu kadar büyük bir komutun küçük parçalarının açıklaması
  • Bu komut farklı bir amaca hizmet ederse, yazarın yapmak istediğini elde etmek için doğru komut ne olurdu?

Kendi başıma çıkarmaya çalıştığımda kafam çok karıştı ve hüsrana uğradım. İçerdiği için bu komut nasıl çalışır sayısız /, |, \, *, ve ^Google'a zor karakter.

İnternette bulamadığım bu komut için adım adım çeviri ve açıklama adımını arıyorum !


1
Bu, teklif ettiğiniz aynı komut gibi görünmüyor, ancak tuxtweaks.com/2010/10/… ' de bu komutu herhangi bir sorun yaşamadan eski çekirdekleri kaldırmak için kullanıyorum . Bu sayfa ayrıca komutun ne yaptığını da açıklar.
user68186

4
@UriHerrera apt-get autoremovebenim için eski çekirdeğin çıkarılmasını önermiyor. Bunları silmezsem /boot, alanım tükenene ve güncellemeler başarısız olana kadar yığılırlar. Bunu yapması gerektiğine dair bir referansınız var mı?
gertvdijk

1
Bana göre, çekirdek için ne zaman yeni bir güncelleme olursa, daha sonra aşağıdaki paketlerin gerekli olmadığını ve artık sahip olduğum önceki çekirdeği listelediğini söylüyor.
Uri Herrera

Cevabım bir moderatör tarafından silindi, bu yüzden burada yorum yapıyorum: Betiğin açıklaması için bu makaleye bakın . Senaryonun neden bir kısmının s/^[^ ]* [^ ]* \([^ ]*\).*/\1/basitçe olduğunu anlamıyorum s/^[^ ]* \([^ ]*\).*/\1/. Senaryo çok sağlam veya zarif değil. Örneğin, paket adını çıktıdan çıkarmadan önce neden mevcut çekirdeği kontrol etmelisiniz? Alternatif olarak, sudo apt-get autoremove --purgeen eski çekirdeği, Ubuntu'nun Xubuntu 15.10 gibi son sürümlerinde temizler.
jarno

Yanıtlar:


27

Diyelim ki: mevcut biçimde kullanmayın

  1. Size sormadan değişiklik yapar. apt-get -y purgeBölüm onayınız olmadan, tek satırlık tasfiye paketleri yürütme başlamasını sağlar. Senaryoda herhangi bir hata varsa, o zaman sen mahvolmuş olabilirsin .

  2. Kaynak yok, yazar yok. Bunun kaynağı burada bir fark yaratıyor. İyice test edilmiş bir sistem paketinden gelmesi durumunda, üzerinde yapılan testi izleyebiliriz. Rasgele bir kaynaktan, ona güvenemeyiz.

  3. dpkg -lolmadan iyi çalışır sudo. Asıl yazarın neden bunun gerekli olduğunu düşündüğünü anlamıyorum.

Sağduyu kullanın

Zararlı parçaları kaldırın ve kök olarak çalışan herhangi bir şey bırakın.

Örneğin, şunu kesin:

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

Bu sadece sadece çıktılar ve düzenli kullanıcı izinleriyle çalışır . Bu çekirdeklerin kaldırılmasını kabul ettiğinizde, kendiniz de ekleyebilirsiniz | xargs sudo apt-get purge . Bu olmadan var -ysisteminizde yapılacak yaklaşık değişikliklerle ilgili onay istenir, böylece kasıtlı seçeneği.

açıklama

  • dpkg -lTüm paketlerin listesini çıkarır. Bu durumda sadece adı ile başlayan paketleri listeleyecektir linux-.
  • |(bir boru) soldaki komutun çıktısını (buna diyoruz stdout) sağdaki komutun girişine yönlendiriyor (buna biz diyoruz stdin).
  • seddüzenli ifadeleri kullanarak dizeleri işlemek için bir araçtır . Bu durumda borunun solundaki komutun çıktısını değiştirir ve kurulu paketler için filtreler ( iitarafından verilenlere dayanarak dpkg). Bu durumda bile iç içe geçiyor. sedBuradaki kullanımın tamamını açıklamak çok zor olurdu , çünkü kullanımı karmaşık düzenli ifadelerle çok karmaşık. (Bu \(.*\)-\([^0-9]\+\)"normal bir ifade örneğidir.
  • Normal ifadeler , temsil ettikleri ifadeye göre eşleşmeleri bulmak için çok yaygın olarak kullanılır. \1bir tür evrensel arama ve değiştirme yapmak için yapılan değiştirme başvurusudur (ile ilk 'isabete' atıfta bulunulur 1). Düzenli ifadenin kendisi zarar veremez. Bununla birlikte, girişi yanlış bir şekilde manipüle ederlerse, yanlış paketleri çıkarmanıza veya hatta kabuk enjeksiyonuna izin vermenize neden olabilirler. Bu durumda, tarafından sağlanan sürüme göre çekirdek paketinin adını bulmak için bir yol gibi görünüyor uname -r.
  • uname -r Çalışmakta olan çekirdeğin geçerli sürümünü verir.
  • xargsBorunun solundaki girişin satırlarını komuta argüman olarak ekler. Bu durumda, her satırdaki çekirdek sürümleri yatay olarak ayrılmış bir listeye dönüştürülür ve sudo apt-getkomuta eklenir .
  • sudo apt-get -y purge [packagename] Verilen paketlerin (argüman olarak) temizler (her şeyi kaldırır).

Alternatifler

Oldukça bazı sorular muhtemelen zaten bu konuda sorulmuştur. Şimdiye kadar bulduğum alakalı olanlar:


1
Bu komutun korkutucu görünen düğümünün bu şekilde olması ne olacaktır? /(.*)-(-)^0-9DOM\+)/\1/")"'/d;s/^^^ ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan

Yukarıdaki cevap bu komutta söylenecek mi? veya hala apt-get autoremove iyidir?
Bhavesh Diwan

4
@ Z9iT Bunlar normal ifadelerdir. Temsil ettikleri ifadeye göre eşleşmeleri bulmak için kullanılırlar ve \1bir çeşit evrensel arama ve değiştirme işlemi yapmak için yerine koyma denetimidir. Herhangi bir paketin kaldırılması için kendime verdiğim cevabı açıkça ifade ettim (benim düşüncem): sağduyu kullanın. Bir komut dosyasının sisteminizde otomatik olarak değişiklik yapmasına izin vermeyin. Ne yapacağını doğrula. Her zaman.
gertvdijk

Sahip olduğunuz alternatif ilgili linux başlık paketlerini temizlemez.
jarno

O zaman sadece bir apt-get autoremove yapın, bu başlıkların artık gerekli olmadığını tespit etmelidir.
ben-Nabiy Derush 19:17

7

Bir adım adım açıklama istediniz, işte burada:

sudo dpkg -l 'linux-*'

linux-Paket adından başlayarak paketleri listeler.

| sed

ve listeyi yayınla sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

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

| xargs

yeni listeyi xargsyayınlayacak, onu argüman olarak gönderecek

sudo apt-get -y purge

ki bu paketleri, fikrinizi değiştirme şansı vermeden temizleyecektir.

Belki de bu listeyi temizleme komutuna göndereceğini ve bırakacağını söylemek daha doğrudur. Olsun ya da olmasın şey temizlenir - ve daha önemlisi - tam neyi temizlenir önceki komutların çıktıya bağlıdır.

Güvenli mi? Bu durumda hepsi, bulduğunuz gönderinin yazarının ne kadar iyi ifade ettiğine ve düzenli ifadelerin ne anlama geldiğine bağlıdır sed. Ve her iki konuda da kitaplar var.


6

Komutları parçalayarak, manher birinin sayfasını okuyarak başladım .

  • dpkg -l: pacakges'i listeler, böylece dpkg -l linux-*başlayan tüm paketler listelenir linux-(genellikle çekirdekler).

  • sed: Çıkışı dpkg -l linux-*, kodu çözen sedbirkaç normal ifadeyle birleştirilir sed.

  • uname -r unamesistem bilgilerini yazdırır

uname - sistem bilgilerini yazdır

-rKulp özellikle çekirdek bültenleri yazdırır:

-r, --kernel-release çekirdek sürümünü açma

Daha uname -rsonra sedçıktısı, çıktısı geçirilen daha düzenli ifadelerle aktarılır.xargs

Bu nedenle çıktıyı paket isimlerine xargsçevirir ve tüm istemlere otomatik olarak 'evet' cevabını veren sedbunları sudo apt-get purge -yiletir:

-y, --yes, --assume-yes Otomatik evet isterse; Tüm istemlere cevap olarak "evet" kabul edin ve etkileşimli olmayan bir şekilde çalıştırın. Tutulan bir paketin değiştirilmesi, kimliği doğrulanmamış bir paket kurulmaya çalışılması veya gerekli bir paketin çıkarılması gibi istenmeyen bir durum ortaya çıkarsa, apt-get iptal olur. Yapılandırma Öğesi: APT :: Get :: Varsayım-Evet.

Tamamen bu komut görünüyor olacak kesin bilmek gerçi biz çevirmek zorunda kalacaktı ne istersen yap sed'ın normal ifadeler.

Sadece koştum:

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

İşte bir ekran görüntüsü:

görüntü tanımını buraya girin

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


Bu sed'nin ifadesini çevirme antrenmanı nedir?
Bhavesh Diwan

2
Şimdi anlamaya çalışıyorum, biraz zaman alabilir;)
Seth

Cevabımı gör .
jarno

@ Z9iT Betiğin açıklamasını bağlantılı makaleden cevaba kopyalamak için çok tembeldim, bu yüzden Seth'in cevabımı silmesinin nedeni bu. Ancak bağlantılı makalenin internetten aradığınız şey olduğunu düşünüyorum. Eski çekirdeği çıkarmanın daha güvenli bir yolunu da söyledim, yine de 2-3 çekirdeği tutar ve şu anki tüm Ubuntu sürümlerinde çalışmayabilir.
jarno

@ jarno Z9iT, eski çekirdekleri kaldırmak için güvenli bir yol değil, belirli bir komut sorduğundan onu sildim . Bu hala alakalı olabilir, ancak bir yorumda, bir cevap değil :) (senin gibi)
Seth
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.