Mientras navegaba por Internet para encontrar artículos de Ubuntu, me encontré con este comando:
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
El autor dijo que este es un comando de una sola línea que eliminará todas las versiones anteriores de Linux, ¡dejando solo la actual !
De hecho, estoy buscando ese comando, pero no estoy tan seguro de qué tan seguro es esto. Me gustaría saber:
- ¿Es seguro ejecutar este comando?
- ¿Cómo funciona este comando? es decir, explicación de pequeñas partes 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 mí mismo. ¿Cómo funciona este comando ya que contiene numerosas /
, |
, \
, *
, y ^
personajes que son difíciles de Google para.
¡Estoy buscando una traducción y explicación paso a paso para este comando que no pude encontrar en Internet!
package-management
security
command-line
Bhavesh Diwan
fuente
fuente
apt-get autoremove
no sugiere ninguna eliminación de núcleos antiguos para mí. Si no los elimino, se acumularán hasta que mi/boot
espacio se agote y las actualizaciones fallen. ¿Tiene una referencia sobre eso que debería hacer esto?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
lugar de simplementes/^[^ ]* \([^ ]*\).*/\1/
. El guión no es muy robusto o elegante. Por ejemplo, ¿por qué buscar el núcleo actual antes de extraer el nombre del paquete de la salida? En cuanto a una alternativa,sudo apt-get autoremove --purge
purga la mayoría de los núcleos antiguos en alguna versión más reciente de Ubuntu como Xubuntu 15.10.Respuestas:
Yo diría: no lo use en la forma actual
Hace cambios sin preguntarte. La
apt-get -y purge
parte permite que One-liner comience a ejecutar paquetes de purga, sin su confirmación. Si existe algún error en el script, entonces podría ser jodido .Sin fuente, sin autor. La fuente de esto hace una diferencia aquí. En caso de que provenga de un paquete de sistema completamente probado, podemos rastrear las pruebas que se realizan en él. De una fuente aleatoria, no podemos confiar en él.
dpkg -l
corre bien sinsudo
. No veo por qué el autor original pensó que esto era necesario.Usa el sentido común
Elimine las partes dañinas y omita todo lo que se ejecute como raíz.
Por ejemplo, reduzca a esto:
que solo genera cosas y se ejecuta con permisos de usuario regulares . Una vez que esté de acuerdo con la eliminación de estos núcleos, puede adjuntarse
| xargs sudo apt-get purge
. No tiene la-y
opción, intencionalmente, por lo que se le pedirá confirmación sobre los cambios que se realizarán en su sistema.Explicación
dpkg -l
Emite la lista de todos los paquetes. En este caso, solo enumerará los paquetes que comiencen conlinux-
el nombre.|
(una tubería) canaliza la salida del comando a la izquierda (lo llamamosstdout
) a la entrada del comando a la derecha (lo llamamosstdin
).sed
es una herramienta para manipular cadenas usando expresiones regulares . En este caso, manipula la salida del comando a la izquierda de la tubería y filtra los paquetes instalados (basándose en loii
dado pordpkg
). Incluso se está anidando en este caso. Sería demasiado difícil explicar todo el uso desed
aquí, ya que su uso es muy complicado con las expresiones regulares complejas. (El\(.*\)-\([^0-9]\+\)"
es un ejemplo de una expresión regular.\1
es la referencia de reemplazo para hacer una especie de búsqueda y reemplazo universal (haciendo referencia al primer 'hit' con1
). La expresión regular en sí misma no puede hacer ningún daño. Sin embargo, si manipulan la entrada de manera incorrecta, pueden hacer que elimine los paquetes incorrectos o incluso que realice una inyección de shell. En este caso, parece una forma de encontrar el nombre del paquete del núcleo en función de la versión proporcionada poruname -r
.uname -r
genera la versión actual del núcleo 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 en una lista separada por espacios horizontales y se agregan alsudo apt-get
comando.sudo apt-get -y purge [packagename]
purga (elimina todo) de los paquetes dados (como argumentos).Alternativas
Probablemente ya se hayan hecho algunas preguntas sobre esto. Los relevantes que encontré hasta ahora:
A partir de esta respuesta , el siguiente comando parece hacer lo mismo de una manera mucho más segura y común:
fuente
\1
es el control de reemplazo para hacer una especie de búsqueda y reemplazo universal. Para la eliminación de cualquier paquete, me he expresado claramente en mi respuesta (siendo mi opinión): use el sentido común. No permita que un script realice cambios en su sistema automáticamente. Verifica lo que haría. Siempre.Solicitó una explicación paso a paso, así que aquí va:
Enumera paquetes que comienzan con
linux-
el nombre del paquetey canalizar la lista a
sed
que usará una expresión regular muy complicada para editar la lista
que canalizará la nueva lista
xargs
, que la enviará como argumento aque 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 la 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 comprenda el autor de la publicación donde lo encontró las expresiones regulares y la
sed
sintaxis. Y hay libros completos sobre ambos temas.fuente
Comencé diseccionando los comandos, leyendo la
man
página para cada uno.dpkg -l
: enumera los paquetes, pordpkg -l linux-*
lo que enumeraría todos los paquetes que comenzaron conlinux-
(generalmente núcleos).sed
: La salida dedpkg -l linux-*
se canalizased
con varias expresiones regulares quesed
decodifica.uname -r
uname
imprime información del sistemaEl
-r
identificador imprime específicamente las versiones del kernel:La salida de
uname -r
se canalizased
con expresiones más regulares, cuya salida se pasa axargs
Por lo tanto,
xargs
traduce lased
salida en nombres de paquetes y los pasa a lossudo apt-get purge -y
que automáticamente responde 'sí' a todas las indicaciones:En conjunto, parece que este comando hará lo que quieras, aunque para saber con seguridad tendremos que traducir
sed
las expresiones regulares.Acabo de correr:
Aquí hay una captura de pantalla:
Todas las versiones antiguas del kernel iirc.
fuente