sudoでリダイレクト書き込みをしようとしたら、Permission denied
オーナーがrootのあるファイルに、sudoで権限付与されたコマンドの出力結果をファイルに書き込もうとしたところ、Permisson deniedが出て書き込みできませんでした。
その対処法を見つけたので記します。
環境
RaspberryPi4 + Raspbian Buster(10.3)
ラスパイ上で起きた現象ですが、Linux全般に言えると思います。
現象
例えば、wpa_supplicant.confという、オーナーがrootのファイルに、$wpa_passphrase コマンドの出力結果を追記しようとしたとします。
$sudo wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf
以下のエラーが出ます。
-bash: /etc/wpa_supplicant/wpa_supplicant.conf: Permission denied
原因
なぜなら、sudoで権限を得るのはsudoの後に入力されるコマンド(この場合、wpa_passphraseコマンド)のみで、リダイレクト(>>)は一般ユーザーで実行されてしまうためです。
対処方法
リダイレクトの代わりにteeコマンドを使うことで書き込みが出来ます。
$sudo wpa_passphrase SSID PASSPHRASE |sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf
-a コマンドは既存ファイルに追記するteeコマンドのオプションです。
結果、以下のように書き込まれます。
pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
~中略~
network={
ssid="SSID"
#psk="PASSPHRASE"
psk=[暗号化されたパスフレーズ]
}