在Linux的操做中常常会用到su 命令进行用户的切换和sudo命令获取root权限,su su- sudo三个命令常常弄混,下面简单的讲解下。
1、查看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那?
2、shell
一、什么是shell
shell简单的理解就是命令解释器,他将咱们发出的指令转化为计算机可以理解的命令,只有经过他咱们才能和计算机进行沟通,提供人机交互的接口。
二、什么是Bash shell
Unix的发展过程当中出现了不少版本的shell,Linux默认使用的Bash shell就是其中的一个版本,Bash(Bourne-Again SHell )shell是Bourne shell(sh)的加强版
也是GUN计划的一部分,其余比较著名的shell好比C shell,这里就不作介绍了。
二、查看系统支持的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:~>
三、查看登陆用户使用的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
四、登陆shell (login shell)
获取bash shell的时候须要完整的登陆流程,输入用户名和密码,就称为登陆shell,好比经过ssh方式链接,或者由tty1 ~ tty6 登录,须要输入用户的帐号与密码,此时取得的 bash 就称为login shell
五、非登录shell (non-login shell):
取得 bash 接口的方法不须要重复登录的举动
好比你以 X window(图形界面) 登录 Linux 后, 再以 X 的图形化接口启动终端机,此时该终端接口无需输入帐号与密码,则为non-login shell
再好比你在本来的 bash 环境下再次执行 bash 这个命令,一样的也没有输入帐号密码, 这个新的 bash (子程序) 也是 non-login shell
六、登陆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:~#
3、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去编辑,可是保存时会进行语法检查,有错会有提示
一、查看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:~>
java