(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Bash】sudo echoでファイルに書き込むとPermission deniedになる事象

スポンサーリンク

事象

書き込み権限がないディレクトリに対して

$ ls -ld /etc/apt/sources.list.d/
drwxr-xr-x 2 root root ... /etc/apt/sources.list.d/

以下のようにファイルを追記しようとすると以下のエラーとなる。

$ sudo echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
-bash: /etc/apt/sources.list.d/kubernetes.list: Permission denied
環境情報
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"

原因/対応策

リダイレクト処理が一般ユーザ権限で行われている。

よってリダイレクト>を利用せずに以下のように記載する。

$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

以下、補足です。

補足

以下の中でrootユーザを想定してechoコマンドの発行を記載していましたが

一般ユーザがsudoにて行う場合はエラーになってしまいます。同質問がありましたので本記事を執筆している次第です。

そして、結論から言うとこの動きはUNIXとして正しく(かつ重要)以下を見れば原因が分かります。

$ whoami
testuser
$ sudo echo hoge > a.txt
$ ls -l a.txt
-rw-rw-r-- 1 testuser testuser ... a.txt

要はsudoはechoにのみ有効でリダイレクト処理としては元のコマンド実行ユーザの権限でファイルが作成されていまいます。

よって書き込み部分にsudoを当てるべく、catコマンドを利用したりteeコマンドを利用することが一般的です。

以上、ご参考になれば幸いです。