Pertanyaan Apakah perintah untuk menghapus kernel lama ini aman digunakan?


Saat browsing internet untuk artikel Ubuntu, saya menemukan perintah ini:

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

Penulis mengatakan bahwa ini adalah perintah satu baris yang akan hapus semua versi Linux sebelumnya, hanya menyisakan yang sekarang!

Saya sebenarnya mencari perintah seperti itu, tapi saya tidak begitu yakin tentang seberapa aman ini. Saya ingin tahu:

  • Apakah aman untuk menjalankan perintah ini?
  • Bagaimana cara kerja perintah ini? yaitu penjelasan tentang bagian-bagian kecil dari perintah besar semacam itu
  • Jika perintah ini melayani beberapa tujuan yang berbeda, lalu apa yang akan menjadi perintah yang benar untuk mencapai apa yang diklaim oleh penulis untuk dilakukan?

Saya menjadi sangat bingung dan frustrasi ketika saya mencoba menyimpulkan sendiri. Bagaimana cara kerja perintah ini karena mengandung banyak /, |, \, *, dan ^ karakter yang sulit bagi Google.

Saya mencari a langkah demi langkah terjemahan & penjelasan untuk perintah ini yang tidak dapat saya temukan di internet!


21
2018-01-18 18:20


asal


Ini sepertinya bukan perintah yang sama yang Anda kutip, tetapi saya telah menggunakan perintah di tuxtweaks.com/2010/10/… untuk menghapus kernel lama tanpa masalah. Halaman ini juga menjelaskan apa yang dilakukan oleh perintah. - user68186
@UriHerrera apt-get autoremove tidak menyarankan penghapusan kernel lama untuk saya. Jika saya tidak menghapusnya, mereka akan menumpuk sampai saya /boot kehabisan ruang dan pembaruan gagal. Apakah Anda memiliki referensi untuk itu tentang hal itu harus melakukan ini? - gertvdijk
Ini untuk saya, setiap kali ada pembaruan baru untuk kernel, ia mengatakan setelah itu paket-paket berikut ini, tidak lagi diperlukan dan daftar kernel sebelumnya yang saya miliki. - Uri Herrera
Jawaban saya dihapus oleh moderator, jadi saya komentar di sini: Lihat artikel ini untuk penjelasan naskah. Saya tidak mengerti mengapa salah satu bagian dari skenarionya s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ bukan hanya s/^[^ ]* \([^ ]*\).*/\1/. Skripnya tidak terlalu kuat atau elegan. Misalnya mengapa memeriksa kernel saat ini sebelum mengekstraksi nama paket dari output? Adapun alternatifnya, sudo apt-get autoremove --purge membersihkan sebagian besar kernel lama di beberapa rilis terbaru Ubuntu seperti Xubuntu 15.10. - jarno


Jawaban:


Saya akan mengatakan: jangan menggunakannya dalam bentuk saat ini

  1. Itu membuat perubahan tanpa bertanya pada Anda. Itu apt-get -y purge bagian memungkinkan satu-liner untuk mulai menjalankan paket pembersihan, tanpa konfirmasi Anda. Jika ada kesalahan dalam skrip, maka Anda bisa kacau.

  2. Tidak ada sumber, tidak ada penulis yang diberikan. Sumbernya membuat perbedaan di sini. Dalam hal ini akan datang dari paket sistem yang benar-benar teruji, kita dapat melacak pengujian yang dilakukan ke dalamnya. Dari sumber acak, kita tidak bisa mempercayainya.

  3. dpkg -l berjalan dengan baik tanpa sudo. Saya tidak mengerti mengapa penulis asli menganggap ini perlu.

Gunakan akal sehat

Hapus bagian yang berbahaya dan tinggalkan apa pun yang berjalan sebagai root.

Misalnya, tebang ke ini:

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

itu saja hanya menghasilkan barang dan berlari dengan izin pengguna biasa. Setelah Anda setuju dengan kernel ini untuk dihapus, Anda bisa menambahkan  | xargs sudo apt-get purge dirimu sendiri. Tanpa itu -y opsi, dengan sengaja, sehingga Anda akan dimintai konfirmasi tentang perubahan yang akan dilakukan ke sistem Anda.

Penjelasan

  • dpkg -l Menghasilkan daftar semua paket. Dalam hal ini hanya akan daftar paket mulai dengan linux- seperti namanya.
  • | (pipa) menyalurkan output dari perintah di sebelah kiri (kami menyebutnya stdout) ke input dari perintah di sebelah kanan (kami menyebutnya stdin).
  • sed adalah alat untuk memanipulasi string menggunakan ekspresi reguler. Dalam hal ini memanipulasi output dari perintah di sebelah kiri pipa dan filter untuk paket yang diinstal (bergantung pada ii seperti yang diberikan oleh dpkg). Bahkan disarangkan dalam kasus ini. Akan terlalu sulit untuk menjelaskan seluruh penggunaannya sed di sini, karena penggunaannya sangat rumit dengan ekspresi reguler yang rumit. (itu \(.*\)-\([^0-9]\+\)" adalah contoh ekspresi reguler.
  • Ekspresi reguler sangat banyak digunakan untuk menemukan kecocokan berdasarkan ekspresi yang mereka wakili. \1adalah referensi pengganti untuk melakukan semacam pencarian-dan-ganti universal (mengacu pada 'pukulan' pertama dengan 1). Ekspresi reguler itu sendiri tidak dapat membahayakan. Namun, jika mereka memanipulasi input dengan cara yang salah, mereka dapat meminta Anda menghapus paket yang salah atau bahkan melakukan injeksi shell. Dalam hal ini sepertinya cara untuk menemukan nama paket kernel berdasarkan versi yang disediakan oleh uname -r.
  • uname -r menampilkan versi kernel saat ini.
  • xargs menambahkan garis-garis input yang tersisa dari pipa sebagai argumen ke perintah. Dalam hal ini, versi kernel di setiap baris dikonversi ke daftar terpisah spasi horizontal dan ditambahkan ke sudo apt-get perintah.
  • sudo apt-get -y purge [packagename] membersihkan (menghapus segalanya) dari paket yang diberikan (sebagai argumen).

Alternatif

Cukup banyak pertanyaan yang mungkin sudah ditanyakan tentang hal ini. Yang relevan yang saya temukan sejauh ini:


27
2018-01-18 18:40



apa yang akan menjadi putusnya simpul yang tampak menakutkan dari perintah ini yang merupakan sesuatu seperti ini /(.*)-([^0-9]\+)/\1/")"'/d;s/^[^ ] * [^] * ([^] *). * / \ 1 /; / - Z9iT
akan di atas kata perintah dalam jawaban ini jelas kernel lama anggun ?? atau masih apt-get autoremove lebih baik ?? - Z9iT
@ Z9iT Itu adalah ekspresi reguler. Mereka terbiasa menemukan kecocokan berdasarkan pada ekspresi mereka mewakili dan \1 adalah kontrol pengganti untuk melakukan semacam pencarian-dan-ganti universal. Untuk menghapus paket apa pun, saya telah menyatakan diri dengan jelas dalam jawaban saya (menjadi pendapat saya): gunakan akal sehat. Jangan biarkan skrip melakukan perubahan pada sistem Anda secara otomatis. Verifikasi apa yang akan dilakukannya. Selalu. - gertvdijk
Alternatif yang Anda miliki tidak membersihkan paket linux-header masing-masing. - jarno
Kemudian lakukan autoremove apt-get, yang seharusnya mendeteksi header tersebut tidak lagi diperlukan. - ben-Nabiy Derush


Anda meminta penjelasan selangkah demi selangkah sehingga begini:

sudo dpkg -l 'linux-*'

Daftar paket dimulai dengan linux- dalam nama paket

| sed

dan pipa daftar ke sed

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

yang akan menggunakan ekspresi reguler yang sangat rumit untuk mengedit daftar

| xargs

yang akan menyalurkan daftar baru xargs, yang akan mengirimnya sebagai argumen untuk

sudo apt-get -y purge

yang akan membersihkan paket-paket itu tanpa memberi Anda kesempatan untuk berubah pikiran.

Atau mungkin lebih tepat mengatakannya akan mengirimkan daftar itu ke perintah pembersihan dan berhenti di situ. Apakah atau tidak ada sesuatu yang dibersihkan - dan yang penting - tepatnya apa yang dibersihkan tergantung pada ouput dari perintah sebelumnya.

Apakah aman? Dalam hal ini semua tergantung pada seberapa baik penulis pos di mana Anda menemukan itu memahami ekspresi reguler dan sed sintaksis. Dan ada banyak buku tentang kedua topik itu.


7
2018-01-18 18:50





Saya mulai dengan membedah perintah, membaca man halaman untuk masing-masing.

  • dpkg -l: daftar pacakges, jadi dpkg -l linux-* akan mencantumkan semua paket yang dimulai dengan linux- (biasanya kernel).

  • sed: Output dari dpkg -l linux-* disalurkan ke sed dengan beberapa ekspresi reguler yang sed decode.

  • uname -r  unamemencetak informasi sistem

uname - informasi sistem cetak

Itu -r menangani secara khusus cetakan rilis kernel:

-r, --kernel-release mencetak rilis kernel

Output dari uname -r kemudian disalurkan ke sed dengan lebih banyak ekspresi reguler, output yang dilewatkan ke xargs

Begitu xargs menerjemahkan sed output ke dalam nama paket dan meneruskannya sudo apt-get purge -y yang secara otomatis menjawab 'ya' untuk semua petunjuk:

-y, --yes, --assume-yes              Otomatis ya untuk meminta; asumsikan "ya" sebagai jawaban atas semua perintah dan jalankan              non-interaktif. Jika situasi yang tidak diinginkan, seperti mengubah paket yang diadakan, mencoba              untuk menginstal paket yang tidak diautentikasi atau menghapus paket penting yang terjadi kemudian              apt-get akan dibatalkan. Item Konfigurasi: APT :: Get :: Assume-Yes.

Secara keseluruhan sepertinya perintah ini akan lakukan apa yang Anda inginkan, meskipun untuk mengetahui pasti kami harus menerjemahkan sedekspresi reguler.

Saya baru saja berlari:

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

di sini adalah tangkapan layar:

enter image description here 

Semua versi kernel lama iirc.


6
2018-01-18 18:43



apa latihan untuk menerjemahkan ekspresi sed ini? - Z9iT
Saya mencoba untuk memahaminya sekarang, mungkin butuh beberapa saat;) - Seth♦
Lihat Jawabanku. - jarno
@ Z9iT Saya terlalu malas untuk menyalin penjelasan skrip dari artikel terkait ke jawabannya, jadi saya rasa itulah mengapa Seth menghapus jawaban saya. Tapi saya pikir artikel terkait adalah apa yang Anda cari dari Internet. Saya juga memberi tahu Anda cara yang lebih aman untuk menghapus kernel lama, meskipun itu membuat 2-3 kernel berjaga-jaga, dan mungkin tidak berfungsi di semua rilis Ubuntu saat ini. - jarno
@jarno Saya menghapusnya karena Z9iT bertanya tentang a spesifik perintah, bukan cara yang aman untuk menghapus kernel lama. Itu mungkin masih relevan, tetapi dalam komentar, bukan jawaban :) (seperti yang Anda lakukan) - Seth♦