みなさん、こんにちは!長年の潜伏者、ここに初めてのポスター。
スクリプトを使用して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で、他はすべて問題ありません(たとえば、ホストに接続できるなど)
ありがとうございました!
コメントで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