在Linux的操作中经常会用到su 命令进行用户的切换和sudo命令获取root权限,su su- sudo三个命令经常弄混,下面简单的讲解下。

一、查看su的命令帮助信息:

pipci@openSUSE:~> su --help

用法:
 su [选项] [-] [<用户> [<参数>...]]

将有效用户 id 和组 id 更改为<用户>的 id。
单个 - 视为 -l。如果未指定<用户>,将假定为 root。

选项:
 -m, -p, --preserve-environment  不重置环境变量
 -g, --group <组>                            指定主组
 -G, --supp-group <组>                  指定一个辅助组

-, -l, --login                                     使 shell 成为登录 shell
 -c, --command <命令>                 使用 -c 向 shell 传递一条命令
 --session-command <命令>        使用 -c 向 shell 传递一条命令
                                                       而不创建新会话
 -f, --fast                                         向shell 传递 -f 选项(csh 或 tcsh)
 -s, --shell <shell>                         若 /etc/shells 允许,运行<shell>

-h, --help                                       显示此帮助并退出
 -V, --version                                 输出版本信息并退出

pipci@openSUSE:~>

su(switch user)命令用于变更为其他使用者的身份,需要键入该使用者的密码。如果后面不加账户时系统默认为root账户,密码也root账户的密码。没有时间限制。通过上面的帮助信息可以知道su - 是命令su -l的简写。su -l的意思是使shell 成为登录shell,那么什么是登录shell那?

二、shell

1、什么是shell

shell简单的理解就是命令解释器,他将我们发出的指令转化为计算机能够理解的命令,只有通过他我们才能和计算机进行沟通,提供人机交互的接口。

2、什么是Bash shell

Unix的发展过程中出现了很多版本的shell,Linux默认使用的Bash shell就是其中的一个版本,Bash(Bourne-Again SHell )shell是Bourne shell(sh)的增强版
也是GUN计划的一部分,其他比较著名的shell比如C shell,这里就不做介绍了。

2、查看系统支持的shell  (openSUSE系统下)

pipci@openSUSE:~> cat /etc/shells
/bin/ash
/bin/bash      #Bash shell
/bin/csh       #C Shell
/bin/dash
/bin/false
/bin/ksh
/bin/ksh93
/bin/mksh
/bin/pdksh
/bin/sh
/bin/tcsh
/bin/true
/bin/zsh
.......
pipci@openSUSE:~>

3、查看登录用户使用的shell

pipci@openSUSE:~> cat /etc/passwd
........

uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
vnc:x:487:486:user for VNC:/var/lib/empty:/sbin/nologin
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
pipci:x:1000:100:Pipci:/home/pipci:/bin/bash

pipci@openSUSE:~>

可以看出登录用户pipci使用的是/bin/bash  既Bash shell

4、登录shell (login shell)

获取bash shell的时候需要完整的登录流程,输入用户名和密码,就称为登录shell,比如通过ssh方式连接,或者由tty1 ~ tty6 登陆,需要输入用户的账号与密码,此时取得的 bash 就称为login shell

5、非登陆shell (non-login shell):

取得 bash 接口的方法不需要重复登陆的举动
比如你以 X window(图形界面) 登陆 Linux 后, 再以 X 的图形化接口启动终端机,此时该终端接口无需输入账号与密码,则为non-login shell
再比如你在原本的 bash 环境下再次执行 bash 这个命令,同样的也没有输入账号密码, 这个新的 bash (子程序) 也是 non-login shell

6、登录shell与非登陆shell的区别

执行logout命令,退出登录shell(不能退出非登录shell,可以判断当前是否为登录shell)。

pipci@openSUSE:~> logout                           #假设为登录shell,尝试退出
bash: logout: 不是登录 shell: 使用 `exit'          #可以判断当下不是登录shell
pipci@openSUSE:~> su                                  #切换用户,如果su后面不指定用户,默认指定为root
密码:                                                              #输入root密码
openSUSE:/home/pipci # logout                      #判断切换root用户后是否是登录用户
bash: logout: 不是登录 shell: 使用 `exit'          #可以判断不是登录用户
openSUSE:/home/pipci # exit
exit
pipci@openSUSE:~> su -                                #通过su -命令使 shell 成为登录 shell
密码:
openSUSE:~ # logout                                       #可以判断su -后是登录shell
pipci@openSUSE:~>

上面只是通过命令演示了登录和非登录,真正的区别在于登录shell会从新加载环境变量的,当使用su -命令切换为root用户时shell环境也会一同切换为root shell环境,非登录shell不会从新加载环境变量,通过su命令切换为root用户时shell环境不会一同切换为root shell环境,还是在普通用户环境,只有切换了Shell环境才不会出现PATH环境变量错误,也就是找不的命令的错误,因为在命令行下输入的每个命令都会从PATH环境变量对应的目录搜索相应命令的执行文件,不同的用户有不同的环境对应不同的PATH环境变量,也就是不同的命令搜索目录,这样就会造成有的命令普通环境无法找到,而且su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。

举例说明:
pipci@ubuntu:~$ pwd                        #查看工作目录
/home/pipci
pipci@ubuntu:~$ echo $PATH          #产品普通用户PATH环境变量值
/usr/local/java/jre1.8.0_161/bin:/home/pipci/bin:/home/pipci/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
pipci@ubuntu:~$ su -
密码:
root@ubuntu:~# pwd                         #查看工作目录
/root
root@ubuntu:~# echo $PATH           #产品root用户PATH环境变量值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
root@ubuntu:~#

三、sudo

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。

在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。这样用户获得root权限后就可以肆无忌惮的做任何操作,这样万一用户设置的不当就有可能让整个系统瘫痪。
sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,记录在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,不同的发行版可能不一样,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。
由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。

sudo也有点类似Windows下面的以管理员身份运行这样的功能。但是sudo可配置性会更多些。

编辑sudo的配置文件/etc/sudoers一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示

1、查看sudo的命令帮助信息:

pipci@openSUSE:~> sudo -h
sudo - 以其他用户身份执行一条命令

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...

选项:
  -A, --askpass                       使用助手程序进行密码提示
  -b, --background                   在后台运行命令
  -C, --close-from=num          关闭所有 >= num 的文件描述符
  -E, --preserve-env               在执行命令时保留用户环境
  -e, --edit                                编辑文件而非执行命令
  -g, --group=group                 以指定的用户组或 ID 执行命令
  -H, --set-home                     将 HOME 变量设为目标用户的主目录。
  -h, --help                              显示帮助消息并退出
  -h, --host=host                    在主机上运行命令(如果插件支持)
  -i, --login                              以目标用户身份运行一个登录 shell;可同时指定一条命令        #相当于su -
  -K, --remove-timestamp        完全移除时间戳文件                                                                                                  
  -k, --reset-timestamp            无效的时间戳文件                                                                                                    
  -l, --list                                    列出用户权限或检查某个特定命令;对于长格式,使用两次                                                                
  -n, --non-interactive               非交互模式,不提示                                                                                                  
  -P, --preserve-groups            保留组向量,而非设置为目标的组向量                                                                                  
  -p, --prompt=prompt              使用指定的密码提示                                                                                                  
  -r, --role=role                          以指定的角色创建 SELinux 安全环境                                                                                   
  -S, --stdin                               从标准输入读取密码                                                                                                  
  -s, --shell                               以目标用户运行 shell;可同时指定一条命令                    #相当于su                                                                           
  -t, --type=type                        以指定的类型创建 SELinux 安全环境                                                                                   
  -T, --command-timeout=timeout        在达到指定时间限制后终止命令
  -U, --other-user=user                         在列表模式中显示用户的权限
  -u, --user=user                                   以指定用户或 ID 运行命令(或编辑文件)
  -V, --version                                       显示版本信息并退出
  -v, --validate                                      更新用户的时间戳而不执行命令
  --                                                       停止处理命令行参数
pipci@openSUSE:~>

su su- sudo区别概述的更多相关文章

  1. linux中su和sudo区别

    su切换用户,切换成root用户,要输入root用户的密码 su - 用户名 sudo  涉及到 /etc/sudoers文件 ,内容如下: # User privilege specificatio ...

  2. su与sudo命令的区别

    由于su 对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统. 如果用su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作. 特别是对于服 ...

  3. su;su -;sudo;sudo -i;sudo su;sudo su - 之间的区别

    今天我们来聊聊su;su -;sudo;sudo -i;sudo su;sudo su -他们之间的区别. su :su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就 ...

  4. 深入理解 sudo 与 su 之间的区别【转】

    深入理解 sudo 与 su 之间的区别 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升 ...

  5. su、sudo、su - root的区别

    su和sudo的区别 共同点:都是root用户权限: 不同点:su只获得root权限,工作环境不变,还是在切换之前用户的工作环境:sudo是完全获得root的权限和root的工作环境. sudo:表示 ...

  6. Linux中su、su -和sudo的区别

    su 切换到root用户,但是并没有转到root用户家目录下,即没有改变用户的环境. su - 切换到root用户,并转到root用户的家目录下,即改变到了root用户的环境. 这个涉及到不同用户下的 ...

  7. su和sudo的区别与使用,su命令,linux命令

    su和sudo的区别与使用 一.   使用 su 命令临时切换用户身份 1. su 的适用条件和威力 su命令就是切换用户 的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务, ...

  8. 深入理解 sudo 与 su 之间的区别

    深入理解 sudo 与 su 之间的区别 作者: Himanshu Arora 译者: LCTT zhb127 在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容.同时,在该文章的末尾有提到 ...

  9. su与su -,sudo 的区别

    "sudo" , "su" , "su - " 区别: 一.sudo是一种权限管理机制,依赖于/etc/sudoers,其定义了授权给哪个用 ...

  10. linux系统(centos)下su和sudo命令的区别

    linux系统(centos)下su和sudo命令的区别 区别 我们在日常使用过程中,这2个命令很多时候能达到相同的效果,对细节区别十分模糊,这里进行简单的解释和区分.希望大家能够正确使用这2个命令, ...

随机推荐

  1. Mysql学习总结(22)——Mysql数据库中制作千万级测试表

    前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...

  2. 洛谷 P3102 [USACO14FEB]秘密代码Secret Code

    P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...

  3. DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法

    string strSql = "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSG ...

  4. 009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)

    呵呵,这个题不能直接删除已知的结点.由于是单链表,不知道前驱,仅仅知道 后继结点,直接删除会使链表断开.只是我们能够删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include < ...

  5. springMVC之拦截器

    有两种方法配置spring的拦截器 1. 实现接口: HandleInterceptor public class MyInterceptor1 implements HandlerIntercept ...

  6. CodedUI自己主动化測试及脱离VS独立执行

    在VS中可创建"编码的UI測试".可录制软件操作,再回放,最后还能够脱离VS独立执行. 在VS中执行測试 创建项目codeuitest,控件布局.例如以下图: 在button单击事 ...

  7. less14 颜色函数2

    less div{ // hue()色相值 z-index: hue(hsl(90,100%,50%)); //90 ////saturation()饱和度 z-index: saturation(h ...

  8. 安卓4.3以上版本已经完美支持BLE(英文版)

    Android 4.3 (API Level 18) introduces built-in platform support for Bluetooth Low Energy in the cent ...

  9. Lamp安装 php-v5.6【ZendGuardLoader】的问题

    Lamp安装 php-v5.6[ZendGuardLoader]的问题 标签(空格分隔):php,linux Apache日志: 就这个问题导致无法解析运行php文件.下面是网上找的解决方案 Zend ...

  10. 131.lambda表达式小结

    C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda的语法形式如下:[函数对象参数](操作符重载函数参数) mutable或exception声明->返回 ...