Possível remover o pacote rpm dos hosts remotos usando o ssh?

2

Boa tarde a todos! há muito tempo espreita, pôster da primeira vez aqui.

Estou tentando usar um script para remover um rpm remotamente (foo). Existem muitos hosts para fazer isso manualmente de maneira eficiente.

Existem várias versões deste * .rpm instalado em todo o ambiente. Então codificar o nome não funcionará. Minha solução, antes, era ter um script que o scp fosse um "removefoo.sh" para o host remoto, com os seguintes dois bits dentro:

INSTALL=$(rpm -qa | grep -i foo)
rpm -e $INSTALL

E isso funcionou ... mas isso não é ideal, pois preferimos ter um script "Faça tudo".

Obviamente, colocar essa solução neste novo script será interrompido quando o script for executado a partir do servidor de gerenciamento, e ele tentará remover o $ INSTALL que ele obtém do servidor de gerenciamento, que não até rodar este rpm ...

O seguinte não ajudou:

ssh -q $serverIP 'rpm -qa | grep -i foo ; rpm -e'

Alguém tem uma pista? Estou no RHEL 6 e 7 e todo o resto está bem (por exemplo, capaz de se conectar a hosts, etc.)

Obrigado!

    
por kilrainebc 06.11.2017 / 20:55

1 resposta

1

A sugestão nos comentários para usar yum é a resposta certa, mas quero abordar sua pergunta. Por que isso não funciona?

Vamos detalhar seu comando;

ssh -q $serverIP 'rpm -qa | grep -i foo ; rpm -e'

Isso está dizendo para executar rpm -qa | grep -i foo ; rpm -e no host remoto $serviceIP , certo? Primeiro, funciona localmente? Solucione problemas em um shell interativo em um host remoto antes de tentar orquestrá-lo.

Seu comando é na verdade dois comandos encadeados pelo ponto e vírgula. O primeiro rpm -qa | grep -i foo está procurando apenas a presença de foo no sistema. Aliás, você pode salvar um pipe simplesmente por rpm -q foo . Isso será mensuravelmente mais rápido do que enumerar todo o banco de dados rpm. (A menos que foo seja apenas parte do nome do pacote, caso em que isso deve ficar claro e essa resposta terá que ser alterada.)

Em seguida, você está tentando executar rpm -e . Se você tentar isso no seu shell, você deve ver o erro;

# rpm -e
rpm: no packages given for erase

Você precisa dizer para apagar algo . Você já sabe o que quer apagar foo, então inclua foo em seu comando aqui: rpm -e foo .

Por fim, parece que o que você estava tentando fazer é apagar somente foo se estiver instalado. Em vez de encadear comandos com ponto-e-vírgula, torne rpm -e foo condicional se rpm -q foo sair "true".

rpm -q foo && rpm -e foo

Exemplo:

[root@laptop ~]# rpm -q nmap && rpm -e nmap
nmap-7.40-1.fc25.x86_64

A saída acima é do comando rpm -q. Você pode suprimir isso. rpm -q --quiet foo .

[root@laptop ~]# rpm -q nmap
package nmap is not installed

Mostra que o pacote não está mais instalado após rpm -e nmap . Eu não precisei especificar a versão; somente o nome do pacote.

Editar: (com base nos comentários abaixo)

Se foo é apenas parte do nome do pacote, e você deseja remover tudo o que combina, você pode usar xargs . Este comando pega a saída de um comando e faz dele um argumento de outro. Como você descobriu, não é possível canalizar ou encadear comandos para rpm -e .

rpm -qa | grep -i foo | xargs rpm -e

    
por 13.11.2017 / 16:32