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