[---TOC---][---TOC Header:linux系统命令①-用户管理及相关配置---]
(由于以下内容纯经手打,有些过于白话,且省事尽量无配图,不明之处敬请留言!)
一、linux用户和用户组[---TOC Heading:一、linux用户和用户组---]
Hello,骚年,在上一篇博文《linux操作系统简介与安装》中,我们知道linux是一个多用户分时系统;
那么问题来了,我们知道root用户作为linux操作系统最高管理权限,但是工作中,能被它赋予权限,应该是越少越好啊;所以为了想要使用系统资源,就得根据不同的业务需求来创建不同权限的合法账号;为了更合理灵活的管理用户和文件控制权限,linux还采用了用户组的概念;
什么不明白啥玩意,就比如一个班级是一个computer-system,每一个成员就是一个独立的用户,但为了好管理,一般都还会分好多小组,比如一排一组,这个就是用户组;
什么?你问我组长是谁?反正不是你,组长当然是用户组账号了,root就是班长,不要再问我老师是干啥的;没错,这个和windows上的概念是一样的;不过在linux里面显得更灵活;
1.1、UID和GID[---TOC Heading:1.1、UID和GID---]
既然大家都有了用户名,但是把你丢到社会大集体里面,谁认识你啊,显然我们还需要一个身份证号来证明,没错,证明你是男的还是女的;
同理,用户和用户组,对于我们来说就是一个字符串,比如apache、tomcat等,但是丢到计算机里,它是不认识这些玩意的,所以在你创建用户的时候,也就像国家给新生儿发身份证一样,颁发了一个ID号,我们称之为UID;而用户组的ID我们称之为GID;没错就是user-ID和group-ID;
事实上,linux系统目前可以支持(2^32-1)来记录和区分不同的用户,这意味着系统可以记录多达40多亿个不同的用户,是不是堪比中国的身份信息系统啊;
linux系统中的用户分为三类:普通用户、根用户、系统用户;
其中根目录也就是最高领导人权限的用户,系统管理员“root",UID为“0”;当然如果你想拥有多个领导人除了修改用户权限,还可以直接修改其UID为0即可,但是,至高权限只能有一个,别犯傻!
系统用户,和普通用户,其实没有多大区别,区别就是默认系统用户权限较大一些;
linux有着极为详细的权限设置,而linux为了一些常用服务,比如apache、mysql等,系统保留了UID为1-500的用户为系统用户;
UID500以后的用户为普通用户,而我们自己平时创建的用户默认从501开始,即普通用户;当然也可以手动创建系统用户;
同理,linux中每一个用户都至少属于一个用户组,也可以同时属于多个组,而计算机识别组则是通过GID
[root@Moni ~]# id uid=0(root) gid=0(root) 组=0(root)
!--查看当前用户的id,可以看到默认uid和gid,后面组则列出用户所属的所有组--!
[root@Moni ~]# who root pts/0 2017-05-23 19:58 (172.16.0.202)
扩展:linux多个用户能使用同一个uid吗?
1.2、/etc/passwd和/etc/shadow[---TOC Heading:1.2、/etc/passwd和/etc/shadow---]
linux系统用来记录用户名、密码最重要的两个文件就是/etc/passwd和/etc/shadow;
[root@Moni ~]# tail -n 2 /etc/passwd oxblog2:x:501:504::/home/oxblog2:/bin/bash oxblog1:x:502:504::/home/oxblog2:/bin/bash [root@Moni ~]# tail -n 2 /etc/shadow oxblog2:!!:17309:0:99999:7::: oxblog1:!!:17309:0:99999:7:::
可以看到,文件每行代表一个用户,每段字符串用“:”隔开;
/etc/passwd 内容格式,以列数来看:
1)、用户名,UID的字符串标识;
2)、密码,用字母"X"代替,密码真实放在/etc/shadow密码影子文件中;
3)、UID,系统来区分用户的整数id;
4)、GID,系统来区分不同用户组的整数id;
5)、说明栏,注释,但是我们可以看到,目前版本已经没有内容不使用了;
6)、家目录,也就是宿主目录,登录或切换用户是默认进入的工作目录;
7)、shell,登录后使用的命令解释器,一般为bash,此外如nologin,为禁止登录;
/etc/shadow内容格式,以列数来看:
1)、用户名
2)、密码,但是经过加密的密码;
3)、密码最近修改的时间,可以判断最近是否修改密码;
4)、密码不可修改的天数,如果是0,则可以随时修改;
5)、密码需重新修改的天数,为了防止时间长了容易泄露,可以设置密码有效时间,到期需修改;
6)、密码失效前提前警告的天数,密码到期前几天就开始提醒修改,不然失效后就无法登录系统;
7)、密码失效宽限天数,如果密码过期,这是难免的,可以设置缓用几天后再失效;
8)、账号失效日期,一般为空;
9)、保留字段,暂时没有用;
二、linux账户管理[---TOC Heading:二、linux账户管理---]
2.1、 新增和删除用户及相关修改[---TOC Heading:2.1、 新增和删除用户及相关修改---]
①、新增用户:useradd
[root@Moni ~]# useradd oxblog1
[root@Moni ~]# useradd -r oxblog1
没错,创建用户直接useradd username就可以创建;直接新创建的用户为普通用户,也就是uid500以后的用户,如果创建系统用户则加上“-r”参数,但是我们知道系统用户是保留给一些系统常用服务用的,如果我们占用了某个id,后期新增某个服务时,它指定使用这个id,就会创建不成功哦,所以慎重,规划好自然没问题;
那么useradd创建用户的过程呢,首先我们执行命令后,系统会现在/etc/passwd和/etc/shadow文件中留下用户信息,一般添加文件最后一行,同时新用户一个uid,自然是没有用过的,一般是从501开始,依次分配没有使用的uid;
接着系统会创建该用户的宿主目录也就是家目录,如果没有指定的话,默认是在/home目录下创建一个和用户名称一样目录;
然后,系统会拷贝/etc/ske1目录下的内容放到宿主目录下面;好吧这其实是用户属性和环境变量模板;
[root@Moni ~]# ls -a /etc/skel/ . .. .bash_logout .bash_profile .bashrc .gnome2 .kshrc .mkshrc .mozilla
说到这目录,如果我们有一些文档如业务相关,放到这里那么新建用户时,其宿主目录里也会有一份;
最后系统会创建一个和用户名一样的默认用户组,每个用户都必须所属至少一个用户组,如果用-G指定了其他用户组,依然会创建这个用户组,如果用-g指定了default group的gid则系统会直接关联用户到此用户组;
!--指定用户uid,不克与其他用户冲突--! [root@Moni ~]#useradd -u 502 oxblog2 !--指定用户组,但系统任然会创建一个默认的组--! [root@Moni ~]#useradd -G oxblog2 oxblog3 !--指定用户宿主目录即家目录--! [root@Moni ~]#useradd -d /users/oxblog4 oxblog4
除此之外,还有-e指定终止日期;-f指定终止日期后几日停止使用;-g指定用户默认组的gid其必须是已经存在的;等等、、、
②、修改密码:passwd
创建用户后,实际上我们并没有权限直接登录,在不设置密码的情况下;
在/etc/shadow中该用户中以冒号分隔的第二列将显示为两个“!!",这说明不允许使用密码登录;
[root@Moni ~]# passwd 更改用户 root 的密码 。 新的 密码: 无效的密码: WAY 过短 无效的密码: 是回文 重新输入新的 密码:
可以看到密码也是有有复杂要求的,不能太短,不能是111,而这里直接passwd意为修改当前用户的密码;
[root@Moni ~]# passwd oxblog1 更改用户 root 的密码 。 新的 密码: 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新。
passwd username :修改指定用户密码;但是这种逼格只能是根用户root使用,其他用户无法指定!
③、修改用户:usermod
有时候由于业务的改动,我们自然也要对用户的属性进行修改,删除重建显然不可行,因为,已经赋予属主权限的目录和文件,在删除用户时,并不会清除并修改;
usermod在修改用户uid时,需确认其用户是否执行程序;修改用户名称时则需没有使用此用户名登录在线的方可修改;
usermod修改用户属性,参数和useradd一样的,这个不难理解;
!--把一个用户给锁定:-L--可以发现shadow文件密码段前加上了一个"!"--!
[root@Moni ~]# tail -n1 /etc/shadow oxblog4:$1$9OGZ.Op2$22ZiOphYRd73TvZpqs/Ff/:17310:0:99999:7::: [root@Moni ~]# usermod -L oxblog4 [root@Moni ~]# tail -n1 /etc/shadow oxblog4:!$1$9OGZ.Op2$22ZiOphYRd73TvZpqs/Ff/:17310:0:99999:7:::
!--给一个锁定的用户解锁:-U--!
[root@Moni ~]# usermod -U oxblog4
!--修改用户的宿主目录,-d,而-m意为,如果指定的目录不存在系统会自动创建--!
[root@Moni ~]# usermod -d /users/oxblog4 -m oxblog4
!--修改用户的用户名字符串,但其宿主目录名不会更改,其用户邮件文件名会随之修改--!
[root@Moni ~]#usermod -l oxblog5 oxblog4
!--将一个用户加到一个组,但不从原先的组里面剔除--!
[root@Moni oxblog1]# id oxblog1 uid=501(oxblog1) gid=502(oxblog1) 组=502(oxblog1),503(oxblog2) [root@Moni oxblog1]# usermod -a -G oxblog3 oxblog1 [root@Moni oxblog1]# id oxblog1 uid=501(oxblog1) gid=502(oxblog1) 组=502(oxblog1),503(oxblog2),504(oxblog3)
!--从一个组中把某个用户剔除-使用命令不是usermod也不是groupmod--!
[root@Moni oxblog1]# gpasswd oxblog3 -d oxblog1 Removing user oxblog1 from group oxblog3
④、删除用户:userdel
[root@Moni ~]#userdel oxblog3
删除用户,但是处于安全考虑,系统会保留其宿主目录和用户邮件文件;加“-r”参数则一并删除;
[root@Moni ~]#userdel -r oxblog2
注意:删除用户,需要在再三确认下操作,否则会有风险;
2.2、新增和删除用户组及相关修改[---TOC Heading:2.2、新增和删除用户组及相关修改---]
①、增加用户组:groupadd
和新增用户一样,我们同样可以直接新增一个用户组;
[root@Moni ~]# groupadd group1 [root@Moni ~]# tail -n1 /etc/group group1:x:505:
同样,第一列是组名,第二列是密码用x代替并不适用,第三列是GID,第四列是组成员目前显然为空;
②、删除用户组:groupdel
!--删除用户组,需要注意当前组内不可有用户成员--!
[root@Moni ~]# groupdel group1
2.3、检查用户信息[---TOC Heading:2.3、检查用户信息---]
①、查看用户:users、who、w
users,显示当前系统登录的用户,注意这里说的是直接登陆的用户,su转换的不算;
[root@Moni ~]# users root root root
who,显示当系统哪些用户通过哪些终端从哪里登录到系统中的及登陆时间;
[root@Moni ~]# who root pts/1 2017-05-24 11:48 (172.16.0.202) root pts/0 2017-05-23 19:58 (172.16.0.202) root pts/2 2017-05-24 12:45 (172.16.0.202)
w,显示who中所看到的用户,正在执行的命令;
[root@Moni ~]# w 12:52:30 up 42 days, 3:35, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 172.16.0.202 11:48 2:09 0.13s 0.02s -bash root pts/0 172.16.0.202 Tue19 21:05 0.51s 0.51s -bash root pts/2 172.16.0.202 12:45 0.00s 0.02s 0.00s w
last,显示最近用户登录在线的记录状况;
[root@Moni ~]# last -n oxblog1 oxblog1 pts/2 172.16.0.202 Wed May 24 12:45 still logged in oxblog1 pts/1 172.16.0.202 Wed May 24 11:48 11:50 logged in
!--“last -n”意为只显示指定用户进来的登录状况,其中,still代表在线状态--!
此外还有:"who am i" 查看who中,自己的登录信息等同于"who -m";而"who -q"则显示当前登录的用户和用户数量;"whoami"只显示自己在系统中的用户名;"who -s"等同于who;"who -H"显示每列的标题;“who -r"显示当前系统的运行级别;"logname"等同于whoami;"tty"显示但钱用户占用的终端;
②、调查用户:finger(默认没有,需要yum安装rpm包)
!--显示系统的登录用户列表--!
[root@Moni ~]# finger Login Name Tty Idle Login Time Office Office Phone root root pts/0 May 17 10:13 (172.16.0.202) root root pts/1 1 May 23 13:24 (172.16.0.202)
!--显示指定用户更信息的信息--!
[root@Moni ~]#finger mysql Login: mysql Name: Directory: /home/mysql Shell: /bin/bash Never logged in. ##最近一次登陆系统时间 No mail. ##用户最近一次邮件时间 No Plan. ##显示用户任务计划信息
三、切换用户[---TOC Heading:三、切换用户---]
linux中工作,为了实际需求,我们经常要在不同的用户之间切换,协调不同业务的管理;
①、切换成其他用户:su
三种情况,一种是当前用户是root也就是根用户,切换到系统用户或普通用户,一种是系统用户和普通用户之间的切换,还有一种是系统用户或普通用户切换到根用户;
其实后两者是一样的,而第一种我们知道根用户是最牛bi的,所以其切换到其他用户不需要密码;
[root@Moni ~]# su oxblog1 [oxblog1@Moni root]$ su - oxblog2 密码: [oxblog2@Moni ~]$su - root 密码: [root@Moni ~]#exit(三次)
可以看到,第一步我从root切换到oxblog1,不需输入密码直接进入;
第二步我从oxblog1切换到oxblog2用户,需要输入密码进入;
第三步我从oxblog2切换到root用户,需要输入密码进入;
注意:
(在root用户下,命令行主机工作路径注释处最后一个字符以“#”结束;而切换非管理员用户时最后是以“$”结束的)
即可以通过其判断当前用户:管理员用户是"#" ,管理员只有一个,而非管理员用户是"$";
而上面因为切换登录用户三次,目前工作是在第四个shell解释器上,所以我们需要exit三次退回到初始shell上;
其次,你会注意到我第一步切换用户,su和用户名之间没有加“-”符号,而后两步则加上了;
su命令加上“-”参数,切换用户后,不但改变了身份,还会应用新用户的用户环境,也是就是/etc/passwd中设置的用户家目录和使用的shell,以及关于这个用户的个性化设置;
不难发现,第一步执行后,我们看到当前工作目录是在/root目录下面,而后两步则直接进入新用户“~”下
而如果没有使用“-”参数,则切换后,新用户使用的shell也是继承上一用户的shell类型,如bash;
②、用其他用户身份执行root权限的命令:sudo
上面我们见到,从普通用户和系统用户切换到root用户,需要输入密码;那么工作中,我们经常需要一些root的个别权限,但是root密码显然是不可能随意提供或第三方使用的;
sudo则通过了一种可配置的方式解决这个问题,给某个用户赋予某些权限,则用户即可不切换用户shell的情况下,直接执行:sudo command;
配置sudo权限的文件是:/etc/sudoers;而编辑它,linux还专门提供了编辑工具:visudo
visudo可以在编辑保存退出时,自动检查语法配置,避免不小心错误导致无法使用;使用方法和vi一样
[root@Moni ~]# visudo ## Sudoers allows particular users to run various commands as ## the root user, without needing the root password. !-----此处省略一万多字----! ## Allow root to run any commands anywhere root ALL=(ALL) ALL oxblog1 ALL=(ALL) ALL %oxblog1 ALL=(ALL) ALL
如上在这个地方添加两行,第一行ALL=(All)意为这个用户可以从任何地方登录,并可执行任何用户的任意命令,三个任意依次代表三个ALL;而第二行开头用户前添加“%”意为用户组;
如此,我们就不需要每次切换root用户,而是直接执行命令,但是每次要输入当前用户的密码;
oxblog1 ALL=(ALL) NOPASSWD:ALL
!--如此在最后一个ALL前面加上NOPASSWD即可不用重复输入密码咯--!
但是,如果这么设置显然是不安全的,严格来说,sudo并不是切换用户,而是给其他用户赋予了root的身份和权限;如此设置,工作中是不可取的;所以一般我们需要指定赋予的权限;
oxblog1 ALL=(ALL) NOPASSWD:/sbin/poweroff、/sbin/reboot
而起visudo文件中,也列举包含了大多数系统命令,可以参考并赋予权限;
四、用户计划任务管理[---TOC Heading:四、用户计划任务管理---]
日常生活中,我们总是有大大小小计划要做的事情,工作中也是如此,对于系统,自然我们不可能在每次执行任务的时候需要人在场操作,和windows中的计划任务相同,linux也提供了用户计划任务功能;
①、单一时刻执行一次任务:at
如果是一次偶然事件,又必须在特定时间完成工作,我们不可能在哪里傻等着吧,当然,,,,,,
at命令,配置单一时刻计划任务,一次性的:
at是atd服务的命令,可以检查一下是否有atd服务安装和状态;
[root@Moni spool]#service atd status
at类似打印进程,会把任务放到/var/spool/at目录中,到指定时间运行它 。at命令相当于另一个shell,运行at time命令时,它发送一个个命令,可以输入任意命令或者程序。
[root@Moni spool]# at now + 5 minutes at>who -q | tail -n1 >> /home/123 at> !--此处Ctrl+D退出---! job 1 at 2017-05-24 14:04 [root@Moni spool]# atq !---查看当前计时任务---! 1 2017-05-24 14:04 a root [root@Moni spool]#atrm 1 !--删除id为1的at任务--!
!---如下是at计时任务时间举例说明---!
Minute at now + 5 minutes 任务在5分钟后运行 Hour at now + 1 hour 任务在1小时后运行 Days at now + 3 days 任务在3天后运行 Weeks at now + 2 weeks 任务在两周后运行 Fixed at midnight 任务在午夜运行 Fixed at 10:30pm 任务在晚上10点30分 Fixed at 23:59 12/31/2018 任务在2018年12月31号23点59分
注意:
默认情况下,所有用户都可以使用at命令来调度自己的任务,但是为了特殊原因需要禁用某些用户使用这个功能,则可以将该用户名添加到/etc/at.deny文件中即可;
②、周期性执行任务:crontab
crontab命令是crond服务的命令,当然最好也检查一下器运行状态;
[root@Moni spool]#service crond status
周期性计划任务,没毛病,比如设置,每天早上七点整和七点十五各同步时间一次;
[root@Moni spool]# crontab -e 0,15 7 * * * /usr/sbin/ntpdate 202.120.2.100 && /sbin/hwclock -w [root@Moni spool]#crontab -l !--查看当前用户的计划任务列表--! [root@Moni spool]#crontab -u root -r !--"-u"参数指定用户"-r"删除用户的cron--!
我们同样也来看看crontab的时间规则
基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示 第2列表示小时1~23(0表示0点) 第3列表示日期1~31 第4列表示月份1~12 第5列标识号星期0~6(0表示星期天) 第6列要运行的命令
!--------------例如-----------------!
- 每晚的21:30重启lighttpd ;
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
- 每月1、10、25日的5: 30重启lighttpd ;
30 5 1,10,25 * * /usr/local/etc/rc.d/lighttpd restart
- 每周六、周日的1 : 10重启lighttpd ;
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
- 每天18 : 00至23 : 00之间每隔30分钟重启lighttpd
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
- 每星期六的11 : 00 pm重启lighttpd 。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
- 每一小时重启lighttpd
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
- 晚上11点到早上7点之间,每隔一小时重启lighttpd
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
- 每月的4号与每周一到周三的11点重启lighttpd
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
- 一月一号的4点重启lighttpd
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
- 每年一月一日的晚上23点30分重启操作系统
30 23 1 1 * /sbin/reboot
③、用户计划任务文件目录:/var/spool/cron/
我们执行的crontab -e配置的计划任务,其实系统也写到了/var/spool/cron/目录下面,每个用户对应各自的任务文件;所以我们也可以这么添加计划任务,但是最好是登录到各自的用户下面执行,避免权限问题;
[root@Moni spool]# echo "0,15 7 * * * /usr/sbin/ntpdate 202.120.2.100 && /sbin/hwclock -w" >>/var/spool/cron/root
注意:
事实上,系统本身也有一个计划任务文件,即/etc/crontab文件;
(今天就到这里了,有疑问的地方欢迎大家留言哦。)
看了本篇文章的道友还要看:linux系统命令和shell