Назад | Перейти на главную страницу

Можно ли удалить пакет rpm с удаленных хостов с помощью ssh?

Всем доброго дня! долгое время скрывался, первый раз здесь плакат.

Я пытаюсь использовать сценарий для удаленного удаления 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