¿Es seguro usar este comando para eliminar kernels viejos?

21

Mientras buscaba en Internet artículos de Ubuntu, encontré este comando:

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

El autor dijo que este es un comando de línea única que eliminará todas las versiones anteriores de Linux, dejando solo la versión actual !

En realidad estoy buscando un comando así, pero no estoy tan seguro de cuán seguro es esto. Me gustaría saber:

  • ¿Es seguro ejecutar este comando?
  • ¿Cómo funciona este comando? es decir, explicación de partes pequeñas de un comando tan grande
  • Si este comando tiene un propósito diferente, ¿cuál sería el comando correcto para lograr lo que el autor dice que hace?

Me siento muy confundido y frustrado cuando trato de deducir todo por mi cuenta. ¿Cómo funciona este comando? Contiene numerosos caracteres / , | , \ , * y ^ que son difíciles de buscar para Google.

Estoy buscando una traducción paso a paso & amp; explicación para este comando que no pude encontrar en internet!

    
pregunta Z9iT 18.01.2013 - 18:20

3 respuestas

27

Yo diría: no lo use en la forma actual

  1. Hace cambios sin preguntarte. La parte apt-get -y purge permite que el one-liner comience a ejecutar paquetes de purga, sin su confirmación. Si existe algún error en el script, entonces podría estar atornillado .

  2. Sin fuente, sin autor. La fuente de eso hace la diferencia aquí. En caso de que proceda de un paquete de sistema completamente probado, podemos rastrear las pruebas que se realizan en él. De una fuente aleatoria, no podemos confiar en ella.

  3. dpkg -l funciona bien sin sudo . No veo por qué el autor original pensó que era necesario.

Usa el sentido común

Elimine las partes dañinas y omita todo lo que se ejecute como raíz.

Por ejemplo, córtelo a esto:

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

que solo solo genera cosas y ejecuta con permisos de usuario regulares . Una vez que acepte eliminar estos kernels, puede agregar | xargs sudo apt-get purge usted mismo. Está sin la opción -y , intencionalmente, por lo que se le solicitará confirmación sobre los cambios que se realizarán en su sistema.

Explicación

  • dpkg -l Muestra la lista de todos los paquetes. En este caso, solo mostrará los paquetes comenzando con linux- como nombre.
  • | (a pipe) canaliza la salida del comando de la izquierda (llamamos a ese stdout ) a la entrada del comando de la derecha (llamamos a eso stdin ).
  • sed es una herramienta para manipular cadenas utilizando expresiones regulares . En este caso, manipula la salida del comando a la izquierda de la tubería y filtra los paquetes instalados (confiando en el ii dado por dpkg ). Incluso está siendo anidado en este caso. Sería muy difícil explicar el uso total de sed aquí, ya que su uso es muy complicado con las expresiones regulares complejas. (el \(.*\)-\([^0-9]\+\)" es un ejemplo de una expresión regular.
  • Las expresiones regulares son muy utilizadas para encontrar coincidencias basadas en la expresión que representan. es la referencia de reemplazo para hacer un tipo de búsqueda y reemplazo universal (haciendo referencia al primer 'hit' con 1 ). La expresión regular en sí no puede hacer ningún daño. Sin embargo, si manipulan la entrada de una manera incorrecta, pueden hacer que elimines los paquetes incorrectos o incluso que realices una inyección de shell. En este caso, parece una forma de encontrar el nombre del paquete kernel en función de la versión proporcionada por uname -r .
  • uname -r muestra la versión actual del kernel en ejecución.
  • xargs agrega las líneas de la entrada a la izquierda de la tubería como argumentos para el comando. En este caso, las versiones del kernel en cada línea se convierten a una lista horizontal separada por espacios y se anexan al comando sudo apt-get .
  • sudo apt-get -y purge [packagename] purges (elimina todo) de los paquetes dados (como argumentos).

Alternativas

Es probable que ya se hayan formulado algunas preguntas sobre esto. Relevantes que encontré hasta ahora:

respondido por el gertvdijk 18.01.2013 - 18:40
7

Pediste una explicación paso a paso, así que aquí va:

sudo dpkg -l 'linux-*'

Lista paquetes que comienzan con linux- en el nombre del paquete

| sed

y canalice la lista en sed

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

que usará una expresión regular muy complicada para editar la lista

| xargs

que canalizará la nueva lista en xargs , que lo enviará como argumento a

sudo apt-get -y purge

que purgará esos paquetes sin darle la oportunidad de cambiar de opinión.

O quizás sea más exacto decir que enviará esa lista al comando de purga y lo dejará así. Si se purga o no algo, y lo que es más importante, exactamente lo que se purga depende de la salida de los comandos anteriores.

¿Es seguro? En este caso, todo depende de qué tan bien el autor de la publicación donde lo encontró comprenda las expresiones regulares y la sintaxis sed . Y hay libros enteros sobre ambos temas.

    
respondido por el chaskes 18.01.2013 - 18:50
6

Empecé disecando los comandos, leyendo la página man para cada uno.

  • dpkg -l : list pacakges, por lo que dpkg -l linux-* mostraría todos los paquetes que comenzaron con linux- (generalmente kernels).

  • sed : la salida de dpkg -l linux-* se canaliza a sed con varias expresiones regulares que sed decodifica.

  • uname -r uname imprime información del sistema

  

uname - imprime información del sistema

El controlador -r imprime específicamente las versiones del kernel:

  

-r, --kernel-release imprime la versión del kernel

La salida de uname -r se canaliza a sed con más expresiones regulares, cuyo resultado se pasa a xargs

Entonces xargs traduce la salida sed a los nombres de los paquetes y los pasa a sudo apt-get purge -y , que automáticamente responde "sí" a todas las solicitudes:

  

-y, --yes, --assume-yes              Sí automático a las solicitudes; asuma "sí" como respuesta a todas las solicitudes y ejecute              no interactivamente. Si se trata de una situación no deseada, como cambiar un paquete retenido, intentarlo              instalar un paquete no autenticado o eliminar un paquete esencial ocurre entonces              apt-get abortará. Elemento de configuración: APT :: Get :: Assume-Yes.

En general, parece que este comando hará lo que quieras, aunque para estar seguro de que tendríamos que traducir las expresiones regulares de sed .

Acabo de correr:

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

aquí hay una captura de pantalla:

Todas las versiones anteriores del kernel iirc.

    
respondido por el Seth 18.01.2013 - 18:43

Lea otras preguntas en las etiquetas