エイリアスにsudoとsudo以外の部分を含めます。 >>で動作しないのはなぜですか?

エイリアスにsudoとsudo以外の部分を含めます。 >>で動作しないのはなぜですか?

2つのコマンドを実行するエイリアスを使用しようとしています。ここで、最初のコマンドは通常のユーザー権限で実行でき、2番目のコマンドにはsudo権限が必要です。

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo cat /tmp/hosts >> /etc/hosts"

ユースケースは、リモートサーバーのホストファイルをインポートしてマイコンピュータのホストファイルに追加することです(リモートサーバーには、クライアントシステムに関するすべてのIPドメイン情報が含まれています)。

しかし、私が得たエイリアスを実行すると、zsh: permission denied: /etc/hostssudoが無視されるかzshがそれを解釈できないようです。

検索後、エイリアスを次のように変更しました。

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && cat /tmp/hosts | sudo tee -a /etc/hosts"

これはうまくいくようです。誰かがこれの背景を説明できますか?

ベストアンサー1

最初のエイリアスのsudoコマンドはroot権限を提供しますが、リダイレクトはユーザー権限を使用して試行されますcat /tmp/hosts。これは通常十分に高くないため、「許可拒否」エラーが発生します。 >> /etc/hosts

この機能を実現するには、サブシェルで次のようにコマンドを実行できます。

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo sh -c \"cat /tmp/hosts >> /etc/hosts\""  

または2番目の方法に従ってください。
ここでは、「権限のない」catコマンドの出力を特権のある「tee」コマンドにリダイレクトします。これにより、/ etc / hostsに情報を追加する権限があります。

おすすめ記事