大家下午好! 很久以前的潜伏者,这里第一次海报。
我正在尝试使用脚本远程删除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