当前位置: 首页 > news >正文

linux系统命令su和su - 区别验证

  以下内容为reed个人见解,不保证内容的准确性,仅供参考讨论,如有错误之处,万望提出!

由于工作需要,经常在各个用户之间切换,所以经常用到这个命令:su -,因为一直用这个命令,所以也没留意su后面为什么要加一个横杠,不加的话有什么区别。今天脑海里一直浮现su和su - 有什么区别,既然有疑问,就要解决之,哪怕是最基本最简单的问题。
-------------------------------------------------------------------------------------
A.用info su命令查看帮助如下(不用翻译啦,大概看的明白吧):
1)默认的su,也就是不加参数
By default, `su' does not change the current directory.  It sets the
environment variables `HOME' and `SHELL' from the password entry for
USER, and if USER is not the super-user, sets `USER' and `LOGNAME' to
USER.  By default, the shell is not a login shell.
2)su加'-'/'-l'/'--login'参数
`-' 
`-l'
`--login' 
     Make the shell a login shell.  This means the following.  Unset all
     environment variables except `TERM', `HOME', and `SHELL' (which
     are set as described above), and `USER' and `LOGNAME' (which are
     set, even for the super-user, as described above), and set `PATH'
     to a compiled-in default value.  Change to USER's home directory.
     Prepend `-' to the shell's name, intended to make it read its
     login startup file(s).  Additionaly `DISPLAY' and `XAUTHORITY'
     environment variables are preserved as well for PAM functionality.
B.再看看2个例子:
1.例子1,现有reed普通用户,用su切换root用户。

  

[reed@yunwei14 ~]$ pwd
/home/reed
[reed@yunwei14 ~]$ id
uid=510(reed) gid=510(reed) groups=510(reed)
[reed@yunwei14 ~]$ su
口令:

[root@yunwei14 reed]# pwd
/home/reed
[root@yunwei14 reed]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@yunwei14 reed]# echo $PATH
/usr/kerberos/sbin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/java/jdk1.5.0_11/bin:/usr/local/mysql/bin:/usr/apache/bin:/home/reed/bin

[root@yunwei14 reed]# useradd test
bash: useradd: command not found
[root@yunwei14 reed]#


例子1用[su]命令切换root用户,从例子看出的确是切换到root用户了,但是工作目录和环境变量竟然还是reed的,用useradd命令竟然提示找不到。
2.例子2,用su - 切换root用户

  

[reed@yunwei14 ~]$ pwd
/home/reed
[reed@yunwei14 ~]$ id
uid=510(reed) gid=510(reed) groups=510(reed)
[reed@yunwei14 ~]$ su -
口令:

[root@yunwei14 ~]# pwd
/root
[root@yunwei14 ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@yunwei14 ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.5.0_11/bin:/usr/local/mysql/bin:/usr/apache/bin:/root/bin

[root@yunwei14 ~]# useradd test
[root@yunwei14 ~]#

例子2用[su - ]命令切换root用户,从例子看出已切换到root用户,工作目录和环境变量也是root的,用useradd也创建用户成功。
到此,通过翻阅相关资料和例子看出,总结如下:
su:只能切换到root用户权限,但环境变量还是切换前用户的环境变量,读取的变量配置方式为 non-login shell的方式,这种方式很多原本的变量不会被改变,执行命令时要输入绝对路径。
su -:若要完整的切换到root,必须要使用su -或者su -l, 才会连同 PATH/USER/MAIL 等变量都转成root的环境,这里使用的是login shell方式。
到了这里,大家可能又有疑问了,什么是Non-login shell和login shell呢?直接引用鸟哥的资料:
login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登陆,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰;
non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举例来说,(1)你以 X window 登陆 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个命令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。
C.相关参考资料
http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#settings_bashrc_shell

相关文章:

  • http异步
  • fcntl
  • 注意!ASP.NET MVC 3 的一个 OutputCache 问题
  • 看到大家对数据库分页有研究,也分享个本人的
  • androidalertDialog无法显示按钮的bug
  • 跟我一起学习ASP.NET 4.5 MVC4.0(四)
  • 顶部菜单栏(固定在顶部)
  • 系统安装后的初始环境设置
  • Leveldb -转
  • 陶哲轩实分析 命题7.2.9 绝对收敛判别法
  • NYOJ467 中缀式变后缀式
  • IHttpModule
  • 陶哲轩实分析 命题 7.4.1 证明
  • ASP.NET Cache的一些总结2
  • css样式表在ie6.0中的hack应用
  • python3.6+scrapy+mysql 爬虫实战
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android开源项目规范总结
  • C++类的相互关联
  • Computed property XXX was assigned to but it has no setter
  • eclipse(luna)创建web工程
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript实现分页效果
  • React16时代,该用什么姿势写 React ?
  • 从伪并行的 Python 多线程说起
  • 搞机器学习要哪些技能
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 将回调地狱按在地上摩擦的Promise
  • 排序(1):冒泡排序
  • 前端自动化解决方案
  • 算法---两个栈实现一个队列
  • 优化 Vue 项目编译文件大小
  • Linux权限管理(week1_day5)--技术流ken
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #前后端分离# 头条发布系统
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (C++20) consteval立即函数
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)linux使用docker容器运行mysql
  • (二)PySpark3:SparkSQL编程
  • (九)信息融合方式简介
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET DataGridView数据绑定说明
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net wcf memory gates checking failed
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET开源快速、强大、免费的电子表格组件
  • @Autowired @Resource @Qualifier的区别
  • @ConditionalOnProperty注解使用说明
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @Transaction注解失效的几种场景(附有示例代码)