web-dev-qa-db-ja.com

sshを使用してリモートホストからrpmパッケージを削除することは可能ですか?

みなさん、こんにちは!長年の潜伏者、ここに初めてのポスター。

スクリプトを使用してrpmをリモートで削除しようとしています(foo)。これを手動で効率的に行うには、ホストが多すぎます。

この* .rpmには、環境全体にインストールされている複数のバージョンがあります。そのため、名前をハードコーディングしても機能しません。以前の私の解決策は、scpがリモートホストに対して「removefoo.sh」であるスクリプトを作成し、その中に次の2つのビットを含めることでした。

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

そしてそれはうまくいきました...しかし、これは理想的ではありません。1つのスクリプト「Doitall」が必要だからです。

明らかに、この新しいスクリプトにそのソリューションを入れると、スクリプトが管理サーバーから実行されるときに壊れ、fromから取得した$ INSTALLを削除しようとします。 -)このrpmを実行しない管理サーバー...

以下は役に立ちませんでした:

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

誰か手がかりがありますか?私はRHEL 6および7で、他はすべて問題ありません(たとえば、ホストに接続できるなど)

ありがとうございました!

2
kilrainebc

コメントでyumを使用するという提案は正しい答えですが、私はあなたの質問に答えたいと思います。 なぜこれが機能しないのですか?

コマンドを分解してみましょう。

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

これは、リモートホストrpm -qa | grep -i foo ; rpm -e$serviceIPを実行すると言っていますよね?まず、ローカルで機能しますか?オーケストレーションを試みる前に、リモートホスト上のインタラクティブシェルでトラブルシューティングを行います。

コマンドは、実際にはセミコロンでチェーンされた2つのコマンドです。最初の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が「true」で終了する場合は、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

1
Aaron Copley