可能使用ssh从远程主机上删除rpm包?

大家下午好! 很久以前的潜伏者,这里第一次海报。

我正在尝试使用脚本远程删除rpm(foo)。 有太多的主机手动有效地做到这一点。

该环境中安装了多个版本* .rpm。 所以硬编码的名称将无法正常工作。 我的解决scheme之前,有一个脚本,scp是一个“removefoo.sh”到远程主机,其中的以下两位:

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

这样的工作…但这不是理想的,因为我们宁愿有一个脚本“全力以赴”。

很显然,将这​​个解决scheme放在这个新的脚本中将随着脚本从pipe理服务器运行而中断,并且它将尝试从pipe理服务器中删除$ INSTALL,它甚至不运行这个rpm …

以下没有帮助:

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

任何人都有线索? 我在RHEL 6和7上 ,其他一切都很好(例如,能够连接到主机等)

谢谢!

在评论中使用yum的build议是正确的答案,但我想解决你的问题; 为什么这不工作?

让我们分解你的命令;

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

这是说要执行rpm -qa | grep -i foo ; rpm -e rpm -qa | grep -i foo ; rpm -e rpm -qa | grep -i foo ; rpm -e在远程主机$serviceIP ,对不对? 首先,它在本地工作吗? 在尝试编排它之前,在远程主机上的交互式shell中排除故障。

你的命令实际上是由分号链接的两个命令。 第一个rpm -qa | grep -i foo rpm -qa | grep -i foo只是在系统上寻找rpm -qa | grep -i foo的存在。 顺便提一下,你可以通过rpm -q foo保存pipe道。 这将比列举整个rpm数据库快得多。 (除非foo只是包名的一部分,在这种情况下应该明确,这个答案将不得不改变。)

接下来,您正在尝试执行rpm -e 。 如果你在shell中试试这个,你应该看到这个错误。

 # rpm -e rpm: no packages given for erase 

你需要告诉它抹去一些东西 。 你已经知道你想擦除foo了,所以在你的命令中包含foo: rpm -e foo

最后,它看起来像你试图做的只是擦除foo,如果它被安装。 而不是使用分号链接命令,如果rpm -q foo退出“true”,则使rpm -e foo有条件。

 rpm -q foo && rpm -e foo 

例:

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

上面的输出来自rpm -q命令。 你可以压制这个。 rpm -q --quiet foo

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

显示rpm -e nmap后不再安装软件包。 我不必指定版本; 只有包名。


编辑:(根据下面的评论)

如果foo只是程序包名称的一部分,并且想要删除与您匹配的所有内容,则可以使用xargs 。 该命令接受一个命令的输出并使其成为另一个命令的参数。 正如你发现你不能pipe道或链接命令到rpm -e

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