Saat menjelajah 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 baris tunggal yang akan menghapus semua versi Linux sebelumnya, hanya menyisakan yang sekarang !
Saya sebenarnya mencari perintah seperti itu, tapi saya tidak begitu yakin seberapa aman ini. Saya ingin tahu:
- Apakah aman untuk menjalankan perintah ini?
- Bagaimana cara kerja perintah ini? yaitu penjelasan bagian-bagian kecil dari perintah besar tersebut
- Jika perintah ini memiliki tujuan yang berbeda, lalu apa yang akan menjadi perintah yang benar untuk mencapai apa yang penulis klaim lakukan?
Saya menjadi sangat bingung dan frustrasi ketika saya mencoba menyimpulkan semuanya sendiri. Bagaimana perintah ini bekerja untuk itu berisi banyak /
, |
, \
, *
, dan ^
karakter yang sulit untuk Google untuk.
Saya mencari terjemahan langkah demi langkah & penjelasan untuk perintah ini yang tidak dapat saya temukan di internet!
package-management
security
command-line
Bhavesh Diwan
sumber
sumber
apt-get autoremove
tidak menyarankan penghapusan kernel yang lebih tua untuk saya. Jika saya tidak menghapusnya, mereka hanya akan menumpuk sampai saya/boot
kehabisan ruang dan pembaruan gagal. Apakah Anda memiliki referensi untuk itu tentang hal yang seharusnya dilakukan?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
bukan hanyas/^[^ ]* \([^ ]*\).*/\1/
. Scriptnya tidak terlalu kuat atau elegan. Sebagai contoh mengapa memeriksa kernel saat ini sebelum mengekstraksi nama paket dari output? Sebagai alternatif,sudo apt-get autoremove --purge
hapus sebagian besar kernel lama di beberapa rilis terbaru Ubuntu seperti Xubuntu 15.10.Jawaban:
Saya akan mengatakan: jangan menggunakannya dalam bentuk saat ini
Itu membuat perubahan tanpa meminta Anda. Bagian ini
apt-get -y purge
memungkinkan one-liner untuk mulai menjalankan paket pembersihan, tanpa konfirmasi Anda. Jika ada kesalahan dalam skrip, maka Anda bisa kacau .Tidak ada sumber, tidak ada penulis yang diberikan. Sumbernya membuat perbedaan di sini. Jika itu datang dari paket sistem yang diuji secara menyeluruh, kami dapat melacak pengujian yang dilakukan terhadapnya. Dari sumber acak, kami tidak bisa mempercayainya.
dpkg -l
berjalan dengan baik tanpasudo
. Saya tidak mengerti mengapa penulis asli berpikir ini perlu.Gunakan akal sehat
Buang bagian yang berbahaya dan tinggalkan apa pun yang berjalan sebagai root.
Misalnya, kurangi menjadi ini:
yang hanya menampilkan barang dan berjalan dengan izin pengguna biasa . Setelah Anda setuju dengan kernel ini untuk dihapus, Anda dapat menambahkan
| xargs sudo apt-get purge
sendiri. Tanpa-y
pilihan, sengaja, jadi Anda akan diminta konfirmasi tentang perubahan yang akan dilakukan pada sistem Anda.Penjelasan
dpkg -l
Keluarkan daftar semua paket. Dalam hal ini hanya akan mencantumkan paket yang dimulai denganlinux-
namanya.|
(sebuah pipa) menyalurkan output dari perintah di sebelah kiri (kami menyebutnyastdout
) ke input dari perintah di sebelah kanan (kami menyebutnyastdin
).sed
adalah alat untuk memanipulasi string menggunakan ekspresi reguler . Dalam hal ini memanipulasi output dari perintah di sebelah kiri pipa dan menyaring untuk paket yang diinstal (mengandalkanii
seperti yang diberikan olehdpkg
). Bahkan sedang bersarang dalam kasus ini. Akan terlalu sulit untuk menjelaskan keseluruhan penggunaan dised
sini, karena penggunaannya sangat rumit dengan ekspresi reguler yang kompleks. (Ini\(.*\)-\([^0-9]\+\)"
adalah contoh dari ekspresi reguler.\1
adalah referensi pengganti untuk melakukan semacam pencarian-dan-ganti universal (merujuk pada 'hit' pertama dengan1
). 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 olehuname -r
.uname -r
menampilkan versi saat ini dari kernel yang berjalan.xargs
menambahkan baris input kiri pipa sebagai argumen untuk perintah. Dalam hal ini, versi kernel pada setiap baris dikonversi ke daftar yang dipisahkan oleh ruang secara horizontal dan ditambahkan kesudo apt-get
perintah.sudo apt-get -y purge [packagename]
pembersihan (menghapus semuanya) dari paket yang diberikan (sebagai argumen).Alternatif
Beberapa pertanyaan mungkin sudah ditanyakan tentang ini. Yang relevan yang saya temukan sejauh ini:
Dari jawaban ini , perintah berikut tampaknya melakukan hal yang sama dengan cara yang jauh lebih aman dan lebih umum:
sumber
\1
kontrol penggantian untuk melakukan semacam pencarian dan penggantian universal. Untuk menghapus paket apa pun saya telah menyatakan diri saya dengan jelas dalam jawaban saya (sebagai pendapat saya): gunakan akal sehat. Jangan biarkan skrip melakukan perubahan pada sistem Anda secara otomatis. Verifikasi apa yang akan dilakukan. Selalu.Anda meminta penjelasan langkah demi langkah jadi begini:
Daftar paket yang dimulai dengan
linux-
nama paketdan pipa daftar ke
sed
yang akan menggunakan ekspresi reguler yang sangat rumit untuk mengedit daftar
yang akan menyalurkan daftar baru ke
xargs
, yang akan mengirimkannya sebagai argumen untukyang akan membersihkan paket-paket itu tanpa memberi Anda kesempatan untuk berubah pikiran.
Atau mungkin lebih akurat untuk mengatakan itu akan mengirim daftar itu ke perintah pembersihan dan biarkan begitu saja. Apakah sesuatu dibersihkan atau tidak - persis apa yang dibersihkan tergantung pada ouput dari perintah sebelumnya.
Apakah ini aman? Dalam hal ini semua tergantung pada seberapa baik penulis posting di mana Anda menemukannya memahami ekspresi reguler dan
sed
sintaksis. Dan ada banyak buku tentang kedua topik itu.sumber
Saya mulai dengan membedah perintah, membaca
man
halaman untuk masing-masing.dpkg -l
: daftar pacakges, jadidpkg -l linux-*
akan mencantumkan semua paket yang dimulai denganlinux-
(biasanya kernel).sed
: Output daridpkg -l linux-*
disalurkan kesed
dengan beberapa ekspresi reguler yangsed
menerjemahkan.uname -r
uname
mencetak informasi sistemThe
-r
menangani secara khusus mencetak rilis kernel:Output dari
uname -r
kemudian disalurkan kesed
dengan ekspresi yang lebih teratur, yang outputnya diteruskanxargs
Jadi,
xargs
terjemahkansed
output ke dalam nama paket dan berikan kesudo apt-get purge -y
yang secara otomatis menjawab 'ya' untuk semua konfirmasi:Secara keseluruhan sepertinya perintah ini akan melakukan apa yang Anda inginkan, meskipun untuk mengetahui dengan pasti kita harus menerjemahkan
sed
ekspresi reguler.Saya hanya berlari:
di sini adalah tangkapan layar:
Semua versi kernel lama iirc.
sumber