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
元のケースの半分ではなくアクティブなシェルによって処理されるためです。