su与su -命令是有着本质区别
前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。
su
[root@node1 highgo]# pwd
/home/highgo
[root@node1 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/highgo/bin:/home/highgo/bin:/usr/local/cluster/hgdb/bin:/usr/local/cluster/pgpool/bin
su -
[root@node1 ~]# pwd
/root
[root@node1 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/cluster/pgpool/bin
su 到root用户后虽然仍旧保留着postgres用户的shell环境但是并不代表就可以在root用户下使用postgres用户的命令,如下:
[root@node1 ~]# su - postgres
[postgres@node1 ~]$ su
Password:
[root@node1 postgres]# pg_c
pg_config pg_controldata pg_ctl
[root@node1 postgres]# pg_ctl start
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.
而且,需要使用root用户和root shell环境的命令也不能使用
假设highgo用户PATH中没有:/usr/sbin,则su到root后useradd命令就会失效,会提示找不到命令。
如果highgo用户PATH中有:/usr/sbin ,但是是在highgo用户下使用useradd则会提示权限不够。