例えばsudo -u postgres
でpsqlを実行したいが、psqlのコマンドパスはpostgresユーザにしか通っていない場合、コマンドの前に-i
オプションをつければよい。
sudo -u [user] -i [command]
-i
はsimulate initial loginの意味で、シェルがログインシェルとして実行されるため、各種環境がuserのもので設定されたうえでコマンドを実行できる。
ただしsudo -i
の場合にセットされる環境変数はsu -
した場合と全く同じになるとは限らない。/etc/sudoersやsudoのversionによって異なる可能性があるが、以下のように差が出る。
## version情報
$ bash --version | head -1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
$ sudo -V | head -1
Sudo version 1.8.19p2
## 現在のPATH
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin
## sudo -iをつけて実行
$ sudo -i echo \$PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin:/root/bin
## sudo -iをつけて実行(shを通して実行)
$ sudo -i sh -c 'echo $PATH'
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/usr_x/.local/bin:/home/usr_x/bin:/root/bin
## su -してから実行
$ sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
大体の場合はsudo -i
で問題なくPATHが通るが、万が一うまく行かないことがあれば、su -
したうえでコマンドを実行するか、次のようにsu -
(su -l
)に-c command
オプションを加えて実行するといい。
$ sudo su -lc 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin