結論から書くと、sudo
の実行元のユーザのPATH設定・sudo
の実行先のユーザ(root)のPATH設定、どちらも関係なく、/etc/sudoers
でPATHを再設定しているため。
Defaults env_reset # 環境変数をクリア Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin # 環境変数PATHを再設定
この設定により、sudo
の元ユーザ・権限変更先ユーザ関係なく、/sbin:/bin:/usr/sbin:/usr/bin
がPATHに設定されて実行される。
[zaki@registry ~]$ sudo /usr/bin/env | grep PATH PATH=/sbin:/bin:/usr/sbin:/usr/bin
そのため、例えば/usr/loca/bin
に置いたdocker-compose
コマンドはPATH設定が無いためコマンド名のみだと実行に失敗する。
[zaki@registry ~]$ sudo docker-compose sudo: docker-compose: コマンドが見つかりません
sudoで/usr/local/binにPATHを通すには
じゃあどうすれば/usr/local/bin
にPATHを通した状態でsudo
できるかというと、
(A) secure_path
に/usr/local/bin
も追加する
--- /etc/sudoers.org 2019-10-25 00:23:49.000000000 +0900 +++ /etc/sudoers 2020-03-05 22:45:27.716903825 +0900 @@ -86,5 +86,5 @@ # Defaults env_keep += "HOME" -Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin +Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin ## Next comes the main part: which users can run what software on
この変更を加えたうえで
[zaki@registry ~]$ sudo docker-compose version docker-compose version 1.25.4, build 8d51620a docker-py version: 4.1.0 CPython version: 3.7.5 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
動きました。
(B) sudo時にPATHを引き継ぐ
--- /etc/sudoers.org 2019-10-25 00:23:49.000000000 +0900 +++ /etc/sudoers 2020-03-05 22:50:00.429974656 +0900 @@ -86,5 +86,6 @@ # Defaults env_keep += "HOME" -Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin +#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin +Defaults env_keep += "PATH" ## Next comes the main part: which users can run what software on
secure_path
の設定丸ごと削除し、替わりにenv_keep
というsudo
時に引き継ぎたい環境変数名にPATH
を追加(+=
)する。
[zaki@registry ~]$ sudo docker-compose version docker-compose version 1.25.4, build 8d51620a docker-py version: 4.1.0 CPython version: 3.7.5 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
こちらも動きました
参考
Linuxのお作法としてyum
やapt
などディストリビューションで管理してるパッケージでインストールしたものは/usr/bin
に入るけど、自前でmake
したり管理外のものは/usr/local/bin
に入れるようになってる。(と昔学習した)
ので、言い方を変えれば、/usr/local
以下は野良アプリが入ってるので、不用意に特権のある状態で実行しないようになっているんだなぁ、と。