なぜルートはこれを行うことができますが、sudoはできませんか? [コピー]

なぜルートはこれを行うことができますが、sudoはできませんか? [コピー]

sudoer私はソフトウェアなどをインストールするために常に使用するDebianコンピュータに設定を持っています。私はこの興味深い状況に遭遇し、それについて頭を傷つけます。

次のコマンドを使用して、aptでクールな進行状況バーを有効にします。

sudo echo 'Dpkg::Progress-Fancy "1";' > /etc/apt/apt.conf.d/99progressbar

権限の問題があります。

/etc/apt/apt.conf.d/99progressbar: Permission denied

しかし、suコマンドを実行すると、すべてがうまく動作します。

なぜですか?

答え1

なぜなら

 sudo cmd > file

として説明された

(sudo cmd) > file

あなたの殻を通して。つまり、リダイレクトは自分のユーザーとして実行されます。

この問題を解決した方法は次のとおりです。

cmd | sudo tee file

追加:コンソールに出力も表示されます。cmd不要な場合はリダイレクトする必要があります。

答え2

私が知っている限り、それを使用するとルートシェルとして実行され、ルートが所有するファイルをリダイレクトできるようにすることはシェル>自体のコマンドです(リダイレクトはルートではなくシェル自体によって実行されます)。su

答え3

sudoコマンド部分を実行するので問題があります。リダイレクト後はsudoもう機能しません。

次のことができます。

sudo bash -c "Your commands here > output_file"

引用符の間のコマンドで一重引用符または二重引用符を使用する入れ子の順序に従って慎重にエスケープします。

編集する:

より詳細な説明

スクリプトを実行すると、実際には新しいサブシェルが作成され、スクリプトはそのサブシェルで実行されますが、出力は現在のシェルに返されます。このスクリプトを実行する新しいサブシェルはsudo特権で実行されるため、スクリプトは効果的に root として実行されます。ただし、実行が完了するとシェルが終了し、sudo*pooof*が発生します。出力は現在許可されていないシェルに返されます。特権のある場所に記録されることを期待している場合、これは発生しません。したがって、明確に定義されたシェル内で新しいシェルとフルエンチラーダを実行すると、bashこれを達成できます。これは、この時点でコマンドと出力がsudo元のケースの半分ではなくアクティブなシェルによって処理されるためです。

関連情報