大家下午好!潜水很久了,第一次在这里发帖。
我正在尝试使用脚本远程删除 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