是否可以使用 ssh 从远程主机删除 rpm 包?

是否可以使用 ssh 从远程主机删除 rpm 包?

大家下午好!潜水很久了,第一次在这里发帖。

我正在尝试使用脚本远程删除 rpm(foo)。主机太多,无法有效地手动执行此操作。

整个环境中安装了此 *.rpm 的多个版本。因此,硬编码名称将不起作用。之前,我的解决方案是编写一个脚本,将“removefoo.sh”scp 到远程主机,其中包含以下两位:

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

这确实有效......但这并不理想,因为我们更喜欢用一个脚本“完成所有事情”。

显然,将该解决方案放入这个新脚本中将会中断,因为脚本是从管理服务器运行的,并且它将尝试删除它获得的 $INSTALL管理服务器甚至不运行这个 rpm......

以下操作没有帮助:

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

有人知道吗?我正在RHEL 6 和 7并且其他一切都很好(例如能够连接到主机等)

谢谢你!

答案1

评论中建议使用yum是正确的答案,但我想回答你的问题;这为什么不起作用?

让我们分解你的命令;

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

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

您的命令实际上是由分号链接的两个命令。第一个命令rpm -qa | grep -i foo仅查找系统中是否存在 foo。顺便说一句,您只需 即可保存管道rpm -q foo。这将比枚举整个 rpm 数据库快得多。(除非 foo 只是包名称的一部分,在这种情况下应该说清楚,并且这个答案也必须改变。)

接下来,您尝试执行rpm -e。如果您在 shell 中尝试此操作,您应该会看到错误;

# rpm -e
rpm: no packages given for erase

你需要告诉它擦除某物。您已经知道要删除 foo,因此在此处的命令中包含 foo rpm -e foo:。

最后,看起来您尝试做的只是在安装了 foo 的情况下删除它。不要使用分号链接命令,而是在退出“true”rpm -e foo时设置条件。rpm -q 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。此命令获取一个命令的输出并将其作为另一个命令的参数。正如您所发现的,您无法将命令通过管道或链接方式传递给rpm -e

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

相关内容