事象
書き込み権限がないディレクトリに対して
$ 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コマンドを利用することが一般的です。
以上、ご参考になれば幸いです。