问题描述
普通用户登录Linux系统后,su root或sudo -s切换到root用户后,/etc/profile 中配置的PATH不起效果。
问题分析和疑问
/etc/profile 定义的PATH不是全局有效吗?
解决办法
用su - root 代替 su root和sudo -s
原理分析
1. 不同用户初始的PATH是不一样的。并不是所有用户共用一个PATH。
2. 切换用户系统会先将PATH设为初始值,然后再根据调用的初始化脚本,添加PATH中的路径。
实验分析
在/etc/profile.d/下有文件export_path.sh:
ubuntu@VM-0-15-ubuntu:~$ cat /etc/profile.d/export_path.sh
#!/bin/bash
export PATH=$PATH:/usr/local/go/bin/:/usr/local/nginx/sbin/
用户登录系统时,会自动执行该文件,在PATH变量中添加路径:
/usr/local/go/bin/ 和 /usr/local/nginx/sbin/。
以下是执行3种不同的切换root用户的命令后的环境变量:
ubuntu@VM-0-15-ubuntu:~$ sudo -s
root@VM-0-15-ubuntu:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
root@VM-0-15-ubuntu:~# exit
exit
ubuntu@VM-0-15-ubuntu:~$ su root
Password:
root@VM-0-15-ubuntu:/home/ubuntu# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@VM-0-15-ubuntu:/home/ubuntu# exit
exit
ubuntu@VM-0-15-ubuntu:~$ su - root
Password:
root@VM-0-15-ubuntu:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin/:/usr/local/nginx/sbin/
可以看到:
1. 执行3种不同的切换root用户的命令后,环境变量PATH的值都不完全相同;
2. 只有执行su - root后,才在PATH变量中添加路径:/usr/local/go/bin/ 和 /usr/local/nginx/sbin/
su - root,产生一个登录shell去执行后面的指令。登录 shell 执行的是shell 登录的流程,会执行 /etc/profile,/etc/profile.d/下定义的*.sh都会执行。
su root,产生一个非登录交互shell,非登录交互shell,只执行 用户家目录下 .profile等配置文件。
sudo -s 环境用的是当前用户本身的环境。