Всем доброго дня! долгое время скрывался, первый раз здесь плакат.
Я пытаюсь использовать сценарий для удаленного удаления rpm (foo). Слишком много хостов, чтобы сделать это вручную.
В среде установлено несколько версий этого * .rpm. Так что жесткое кодирование имени не сработает. Раньше мое решение заключалось в том, чтобы иметь скрипт, который scp передает "removefoo.sh" на удаленный хост со следующими двумя битами внутри:
INSTALL=$(rpm -qa | grep -i foo)
rpm -e $INSTALL
И это сработало ... но это не идеально, поскольку мы предпочли бы иметь один сценарий «Сделай все».
Очевидно, что размещение этого решения в этом новом сценарии сработает, поскольку сценарий запускается с сервера управления, и он попытается удалить полученную $ INSTALL из сервер управления, который даже не запускает этот rpm ...
Не помогло следующее:
ssh -q $serverIP 'rpm -qa | grep -i foo ; rpm -e'
У кого-нибудь есть подсказка? Я на RHEL 6 и 7 и все остальное в порядке (например, можно подключиться к хостам и т. д.)
Спасибо!
Предложение в комментариях использовать yum
это правильный ответ, но я хочу ответить на ваш вопрос; Почему это не работает?
Давайте разберем вашу команду;
ssh -q $serverIP 'rpm -qa | grep -i foo ; rpm -e'
Это говорит о выполнении rpm -qa | grep -i foo ; rpm -e
на удаленном хосте $serviceIP
, право? Во-первых, работает ли он локально? Устраните неполадки в интерактивной оболочке на удаленном хосте, прежде чем пытаться ее организовать.
Ваша команда на самом деле представляет собой две команды, соединенные точкой с запятой. Первый rpm -qa | grep -i foo
ищет только наличие foo в системе. Кстати, трубку можно было спасти, просто rpm -q foo
. Это будет значительно быстрее, чем перечисление всей базы данных rpm. (Если только foo не является только частью имени пакета, и в этом случае это следует прояснить, и этот ответ придется изменить.)
Далее вы пытаетесь выполнить rpm -e
. Если вы попробуете это в своей оболочке, вы должны увидеть ошибку;
# rpm -e
rpm: no packages given for erase
Вы должны сказать ему стереть что-то. Вы уже знаете, что хотите удалить foo, поэтому включите foo в свою команду здесь: rpm -e foo
.
Наконец, похоже, что вы пытались удалить только foo, если он установлен. Вместо того, чтобы связывать команды с точкой с запятой, сделайте 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