su 与 su - 比较

原文地址:http://blog.chinaunix.net/uid-25557346-id-2889329.html

今天有一同事说在切换用户的时候,找不到该用户下用户命令,后来仔细检查了一下过程,发现他切换用户的时候用的命令是 su oracle,以前我们切换用户的时候是su - oracle ,只知道要这样用,不清楚为什么要这么用,今天我仔细研究了他们的区别,以下是研究的过程:

先用su oracle  并且把环境变量重定向到/tmp/1 中

  1. [[email protected] ~]# su oracle
  2. [[email protected] root]$ env >>/tmp/1

再用 su - oracle 把环境变量重定向到/tmp/2中

  1. [[email protected] ~]# su - oracle
  2. [[email protected] ~]env >>/tmp/2

比较上面2个过程,可以发现当使用su oracle 的时候,目录没有改变,而且PATH的变量也没改变,

用diff /tmp/1 /tmp/2 比较2个环境变量

  1. [[email protected] tmp]$ diff 1 2
  2. 4,6c4
  3. < HISTSIZE=1000
  4. < SSH_CLIENT=200.120.75.211 1765 22
  5. < SSH_TTY=/dev/pts/1
  6. ---
  7. > HISTSIZE=500
  8. 9,11c7,11
  9. < PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  10. < MAIL=/var/spool/mail/root
  11. < PWD=/root
  12. ---
  13. > ORACLE_SID=orcl
  14. > ORACLE_BASE=/DBSoftware/app/oracle
  15. > LD_LIBARY_PATH=/DBSoftware/app/oracle/product/10.2.0/db_1/lib
  16. > MAIL=/var/spool/mail/oracle
  17. > PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin:/DBSoftware/app/oracle/product/10.2.0/db_1/bin
  18. 12a13
  19. > PWD=/tmp
  20. 14a16
  21. > SHLVL=1
  22. 16d17
  23. < SHLVL=2
  24. 19d19
  25. < SSH_CONNECTION=200.120.75.211 1765 200.120.75.214 22
  26. 20a21
  27. > ORACLE_HOME=/DBSoftware/app/oracle/product/10.2.0/db_1
  28. 22a24
  29. > OLDPWD=/home/oracle
  30. [[email protected] tmp]$ diff 1 2
  31. 4,6c4
  32. < HISTSIZE=1000
  33. < SSH_CLIENT=200.120.75.211 1765 22
  34. < SSH_TTY=/dev/pts/1
  35. ---
  36. > HISTSIZE=500
  37. 9,11c7,11
  38. < PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  39. < MAIL=/var/spool/mail/root
  40. < PWD=/root
  41. ---
  42. > ORACLE_SID=orcl
  43. > ORACLE_BASE=/DBSoftware/app/oracle
  44. > LD_LIBARY_PATH=/DBSoftware/app/oracle/product/10.2.0/db_1/lib
  45. > MAIL=/var/spool/mail/oracle
  46. > PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin:/DBSoftware/app/oracle/product/10.2.0/db_1/bin
  47. 12a13
  48. > PWD=/tmp
  49. 14a16
  50. > SHLVL=1
  51. 16d17
  52. < SHLVL=2
  53. 19d19
  54. < SSH_CONNECTION=200.120.75.211 1765 200.120.75.214 22
  55. 20a21
  56. > ORACLE_HOME=/DBSoftware/app/oracle/product/10.2.0/db_1
  57. 22a24
  58. > OLDPWD=/home/oracle
  59. [[email protected] tmp]$

这里可以很清楚的看到当使用 su oracle 的使用,oracle 用户下的环境变量很多都没加载进来,可su - oracle都吧环境变量都加载了呢,这是为什么呢?

我们 man su 一下, -, -l, --login  make the shell a login shell 大概意思就是用su - 的时候要执行一下登陆的shell脚本,我们都知道在用户登陆过程中用/etc/profile,.bash_profile,.bashrc,/etc/bashrc  这些脚本来决定环境变量,下面再做个测试:

在root用户下,

  1. [[email protected] ~]# echo $HISTSIZE
  2. 1000

现在我们改变下/etc/profile 中HISTSIZE 变量的值 改成500,

  1. [[email protected] ~]# grep HISTSIZE /etc/profile
  2. HISTSIZE=500
  3. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

然后su oracle,

  1. [[email protected] ~]# su oracle
  2. [[email protected] root]$ echo $HISTSIZE
  3. 1000
  4. [[email protected] root]$

su - oracle 呢?

  1. [[email protected] ~]# su - oracle
  2. [[email protected] ~]$ echo $HISTSIZE
  3. 500

HISTSIZE 变量值变了。

通过以上比较我们发现用su - 就相当于一个完整的登陆过程,而su  只是简单的把用户切换过去,一些环境变量什么的都没带过去。。。

最后加上:login shell , /etc/profile,.bash_profile,.bashrc,/etc/bashrc 都执行
     non login shell, /etc/profile,.bash_profile 不执行, .bashrc,/etc/bashrc 执行

时间: 2024-12-28 08:07:29

su 与 su - 比较的相关文章

Linux用户切换:su和su - 区别

大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su -,下面就su命令和su -命令最大的本质区别给大家详解一下: 前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误.su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目

(总结)Linux下su与su -命令的本质区别

本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -.前天我在使用useradd这个命令时,才体会到这两者的本质区别.如图: 我首先是用su命令切换到root身份的,但是运行useradd时,出现错误:bash: useradd: command not found.go

su和su - 的区别

我们在更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -.前天我在使用useradd这个命令时,才体会到这两者的本质区别.如图: 我首先是用su命令切换到root身份的,但是运行useradd时,出现错误:bash: useradd: command not found.google了一下,原因是在这个用su命令切换过来的root用户上. su命令和su -命令最大的本质区别就是:su 只是切换了root身份,

ubuntu普通账户获取root权限的方法以及su和su -的区别

打开命令窗口 输入命令:sudo passwd root 然后按照上图中的操作进行即可. su和su -的命令的不同: su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误.su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录:而用su -命令切换以后,工作目录变成root的工作目录了.用echo $PA

linux shell 的变量问题 &amp;&amp;export 语句作用 &amp;&amp;su 与 su - 的区别

首先来看看变量的问题 [[email protected] ~]# dhh=1 [[email protected] ~]# echo $dhh 1 开一个子shell测试 [[email protected] ~]# bash [[email protected] ~]# echo $dhh 没有值 使用export方法 [[email protected] ~]# exit      ----------退出子shell exit [email protected] ~]# export d

ubuntu下su与su -命令简要分析

Linux中切换用户的命令是su或su -. su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了. 切换之后可以使用pwd查看一下当前的工作目录,也可以使用echo $PATH查看一下环境变量,观察su和su -的区别. 我们切换用户的时候应该使用的就是su-,切换其他用户时也是如此,如想切换其他用户可以参考 su - fmaster来输入命令行.

su 和 su - 命令有何不同

su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误.su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录:而用su -命令切换以后,工作目录变成root的工作目录了.用echo $PATH命令看一下su和su -以后的环境变量有何不同.以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令

【转】(总结)Linux下su与su -命令的本质区别

原文网址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -.前天我在使用useradd这个命令时,才体会到这两者的本质区别.如图: 我首先是用su命令切换到root身份的,但是运行useradd时,出现错误:

Linux 下 su 和 su - 的区别和实际中遇到的问题

从普通用户切换成root用户: 可以用su 或者 su -   : su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell: 而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误.su切换成root用户以后,pwd 一下,发现工作目录仍然是普通用户的工作目录:而用su -命令切换以后,工作目录变成root的工作目录了.用echo $PATH命令看一下su和su -以后的环境变量有何不

Linux下su与su -命令的区别

在启动服务器ntpd服务时遇到一个问题 使用 su root 切换到root用户后,不可以使用service命令: 使用 su - 后,就可以使用service命令了. 原因: su命令和su -命令区别就是: su只是切换了root身份,但Shell环境仍然是普通用户的Shell:而su -连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出现PATH环境变量错误,报command not found的错误. su切换成root用户以后,pwd一下,发现工作目录仍然