Este comando para remover kernels antigos é seguro de usar?

21

Enquanto navegava na internet por artigos do Ubuntu, deparei com 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

O autor disse que este é um comando de linha única que irá apagar todas as versões anteriores do Linux, deixando apenas o atual !

Estou realmente procurando por tal comando, mas não tenho tanta certeza de como isso é seguro. Eu gostaria de saber:

  • Se é seguro executar este comando?
  • Como esse comando funciona? ou seja, explicação de pequenas partes de um comando tão grande
  • Se esse comando tiver algum propósito diferente, qual seria o comando correto para alcançar o que o autor afirma fazer?

Eu fico muito confuso e frustrado quando tento inferir tudo sozinho. Como este comando funciona, ele contém vários caracteres / , | , \ , * e ^ que são difíceis para o Google.

Estou à procura de um tradução passo a passo & amp; explicação para este comando que não consegui encontrar pela internet!

    
por Z9iT 18.01.2013 / 19:20

3 respostas

27

Eu diria: não use na forma atual

  1. Faz alterações sem perguntar a você. A parte apt-get -y purge permite que o one-liner inicie a execução de pacotes de limpeza, sem a sua confirmação. Se algum erro no script existir, você poderá estar aparafusado .

  2. Nenhuma fonte, nenhum autor dado. A fonte disso faz diferença aqui. Caso venha de um pacote de sistema completamente testado, podemos rastrear o teste que está sendo feito nele. De uma fonte aleatória, não podemos confiar nela.

  3. dpkg -l é executado sem sudo . Não vejo por que o autor original achou que isso fosse necessário.

Use o bom senso

Remova as partes prejudiciais e deixe de fora tudo o que é executado como root.

Por exemplo, reduza para isso:

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

que apenas apenas envia material e executa com permissões regulares de usuário . Depois de concordar com a remoção desses kernels, você pode anexar | xargs sudo apt-get purge a você mesmo. Sem a opção -y , intencionalmente, você será solicitado a confirmar as alterações a serem feitas em seu sistema.

Explicação

  • dpkg -l Mostra a lista de todos os pacotes. Neste caso, ele só listará os pacotes começando com linux- como nome.
  • | (um canal) canaliza a saída do comando à esquerda (chamamos isso de stdout ) para a entrada do comando à direita (chamamos isso de stdin ).
  • sed é uma ferramenta para manipular strings usando expressões regulares . Neste caso, ele manipula a saída do comando à esquerda do pipe e filtra os pacotes instalados (dependendo do ii dado por dpkg ). Está até sendo aninhado neste caso. Seria muito difícil explicar todo o uso de sed aqui, pois seu uso é muito complicado com as expressões regulares complexas. (o \(.*\)-\([^0-9]\+\)" é um exemplo de uma expressão regular.
  • Expressões regulares são amplamente usadas para encontrar correspondências com base na expressão que elas representam. é a referência de substituição para fazer uma espécie de busca e substituição universal (referindo-se ao primeiro 'hit' com 1 ). A expressão regular em si não pode causar nenhum dano. No entanto, se eles manipularem a entrada de maneira errada, eles podem remover os pacotes errados ou até mesmo fazer a injeção de shell. Neste caso, parece uma maneira de encontrar o nome do pacote do kernel com base na versão fornecida por uname -r .
  • uname -r mostra a versão atual do kernel em execução.
  • xargs acrescenta as linhas da entrada esquerda do pipe como argumentos para o comando. Nesse caso, as versões do kernel em cada linha são convertidas em uma lista separada por espaço horizontal e anexadas ao comando sudo apt-get .
  • sudo apt-get -y purge [packagename] expurga (remove tudo) dos pacotes fornecidos (como argumentos).

Alternativas

Alguma pergunta provavelmente já foi feita sobre isso. Relevantes que encontrei até agora:

por gertvdijk 18.01.2013 / 19:40
7

Você pediu uma explicação passo a passo, então aqui vai:

sudo dpkg -l 'linux-*'

Lista os pacotes que começam com linux- no nome do pacote

| sed

e canalize a lista para sed

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

que usará uma expressão regular muito complicada para editar a lista

| xargs

que encaminhará a nova lista para xargs , que a enviará como um argumento para

sudo apt-get -y purge

que eliminará esses pacotes sem lhe dar a chance de mudar de ideia.

Ou talvez seja mais correto dizer que ele enviará essa lista para o comando de remoção e deixará por aqui. Se alguma coisa é purgada ou não - e mais importante - exatamente o que é purgado depende da saída dos comandos anteriores.

É seguro? Nesse caso, tudo depende de quão bem o autor do post em que você o encontrou entende expressões regulares e sed syntax. E há livros inteiros sobre esses dois tópicos.

    
por chaskes 18.01.2013 / 19:50
6

Eu comecei dissecando os comandos, lendo a página man para cada um.

  • dpkg -l : lista pacakges, então dpkg -l linux-* lista todos os pacotes que começaram com linux- (geralmente kernels).

  • sed : A saída de dpkg -l linux-* é canalizada para sed com várias expressões regulares que sed decodificam.

  • uname -r uname imprime informações do sistema

  

uname - imprime informações do sistema

O identificador -r imprime especificamente versões do kernel:

  

-r, --kernel-release imprime a versão do kernel

A saída de uname -r é então canalizada para sed com mais expressões regulares, cuja saída é passada para xargs

Portanto, xargs traduz a sed de saída em nomes de pacotes e os transmite para sudo apt-get purge -y , o que automaticamente responde "sim" a todos os prompts:

  

-y, --yes, --assume-yes              Sim automático para prompts; assumir "sim" como resposta a todos os prompts e executar              não interativamente. Se uma situação indesejável, como alterar um pacote suspenso, tentar              para instalar um pacote não autenticado ou remover um pacote essencial ocorre então              O apt-get irá abortar. Item de configuração: APT :: Get :: Assume-Yes.

Ao que parece, este comando irá fazer o que você quiser, embora tenha certeza de que teríamos que traduzir as expressões regulares do sed .

Eu apenas corri:

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

aqui está uma captura de tela:

Todas as versões antigas do kernel iirc.

    
por Seth 18.01.2013 / 19:43