首页 > 代码库 > Linux课程笔记 Day04 课上内容总结

Linux课程笔记 Day04 课上内容总结

1. Crond介绍

1.0 定时任务比较及cron语法

Linux的任务调度可以分为两类:

  1. 系统自身执行的任务
  2. 用户执行的工作

 

 

Linux系统下另外两种定时任务软件:

at:适合仅执行一次的调度任务,需要启动一个名为atd的服务

 

anacron:这个命令主要用于非7*24小时开机的服务器,anacron并不能指定具体时间执行任务,而是以天为周期或者在系统每次开机后需要执行的任务,它会检测停机期间应该进行,但是并没有进行的crontab任务工作,执行一遍。

 

这两种比较少用

 

 

指令语法:

Crontab  [-u user] file

Crontab  [-u user] {-l |-r |-e}

 

 

指令说明:

通过crontab我们可以在固定的间隔时间执行指定的系统指令或shell脚本,时间间隔可以是分钟、小时、日、月、周及以上的任意组合(日和周不要组合)。

 

 

1.1使用者权限文件

文件

说明

/etc/cron.deny

该文件所列用户不允许使用crontab命令

/etc/cron.allow

该文件所列用户允许使用crontab命令

/var/spool/cron

所有用户crontab文件存放的目录,以用户名命名

 

1.2指令选项说明含义表

参数名称

含义

指定示例

-l(字母)

显示用户crontab文件内容,

crontab  -l

-e

进入vi编辑用户crontab文件

crontab  -e

-i

删除用户crontab文件前确认提示

crontab  -i

-r

从crontab目录中删除用户crontab文件

crontab  -r

-u user

指定使用者

crontab  –u qinbf –l

 

1.3 指令的使用格式

      默认情况下,用户所见建立的crontab文件存放于/var/spool/cron文件中,其crontab对应的文件名与用户名一致。

      格式共分为七段,前五段为时间设定段,第六段以哪个用户执行crontab(默认是当前用户),第七段为所要执行的命令段。

 

1.4 Crontab时间段的含义如表:

含义

取值范围

第一段

分钟

00-59

第二段

小时

00-23

第三段

日期

01-31

第四段

月份

01-12

第五段

星期几

0-6

 

1.5特殊符号含义如下:

特殊符号

含义

*

表示任意时间都

-

减号,表示分隔符,表示一个时间范围段

逗号,表示分隔时间段的意思

/n

n代表数字,“即每隔n单位时间”

 

1.6 crontab依赖的服务:

chkconfig   --list |grep  crond

 

/etc/init.d/crond  status

 

1.7crontab实例说明

1) 30  3,12  *  *  * /bin/sh /scripts/oldboy.sh

2) 30  */6  *  *  * /bin/sh /scripts/oldboy.sh  #--à第二列*/6表示每6个小时,也相当于6,12,18,24

3)30  8-18/2  *  *  * /bin/sh /scripts/oldboy.sh #-à第二列8-18/2代表早晨8点到下午18点之间每2小时,也相当于8,10,12,14,16,18

4)*  23-7/1  *  *  *  /application/apachectl restart   #----à实际上的效果是,晚上到早上的7点,每小时的每一分钟都重启apache,如果是想达到每小时才重启的话,前面的分钟段,可以设置为0或者30之类的

5)服务器时间同步:系统每5分钟同步一次时间

[root@test2 ~]# crontab -l

*/5 * * * * /sbin/ntpdate time.windows.com  >/dev/dull 2&>1

 

1.8 crontab命令生产环境专业写法

例1:每一分钟打印一次自己的名字到/server/log/自己的名字命令的文件中。

答案:

#print char task by oldboy for programmer A at 2010-12-12

*/1  *  *  *  *  echo  “oldboy” >>/server/log/oldboy.log 2>&1

 

例2:每周六、日上午9:00和下午14:00来老男孩linux运维实战培训中心学习(/server/script/oldboy.sh)

答案:

#cron  job for ett by oldboy 2010-12-12

00       09,14  *  *  6,0  /bin/sh /server/script/oldboy.sh >/dev/null 2>&1

针对以上两生产例子说明:

1写定时任务要写清注释是个好习惯,比如什么人,什么时间,因为谁,做了什么事

2执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh,否则有可能因为脚本没有执行权限而无法执行

3需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下,然后设置,这里要注意不同用户的环境变量问题。

4定时任务命令的结尾最好加上>/dev/null 2>&1等内容,如果需要打印日志,可以追加到指定日志,不推荐留这种不专业的做法

如果定时任务不加>/dev/null 2>&1等命令设置,时间长了,可能会导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘空间inode节点。

5在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内容命令去掉,如果还需要,可定向到日志里。

 

1.9 crontab生产解决案例

案例1:No  space  left  on  device故障1

在设置crontab时,提示No  space  left  on device。用df –k检查还有空间,用df –i显示/var已占用100%,如果inode耗尽,则系统上下将不能创建文件。

在/var/spool/clientmqueue/下有超多的文件ls半天没反应,用rm  -fr  *会自动跳出root,然后用xargs来配合解决。cd  /var/spool/clientmqueue&& ls |xargs rm –f

最后清理了该目录的内容。当然,如果文件数超多,执行ls |xargs rm –f也会长时间无反应,此时也可以直接cd /var/spool/&&rm –rf clientmqueue,然后mkdir clientmqueque && chmod 770 clientmqueue &&chown smmsp,smmsp  -R /var/spool/clientmqueue。

原因分析:系统中,cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就会产生这些文件。

解决办法:开启邮件服务,并将crontab里面的命令后面加上>/dev/null 2>&1,在做定时脚本时,把屏幕输出定向到日志中。

 

案例2:No space left on device故障2

  1. when you create a new directory of file,system will say :No space left on device

[ett@linux /var]#mkdir ett

Mkdir:cannot create directory ett’:No space left on device

 

  1. when create crontab for account ett,you will receive error information as follows;

Crotab:installing new crontab

Cron/tmp.6655:No space left on device

Crontab:edits left in /tmp/crontab.6655

解决过程

1检查分区使用率,df  -h

2检查/var/lock下的文件,删除/var/lock/subsys/nfx,touch /var/ett,成功创建文件,删除/var/ett

3发现删除/var/lock下的任意一个文件后,都可以成功创建一个文件,再创建就会失败。

4将检查扩大到/var/下的其他目录

5怀疑分区/var/de inode用尽导致上述问题,检查inode使用率

6分区/var/没有配置quota

7发现/var/spool/clientmqueue下面有太多的文件,由于系统的邮件服务配置有问题,导致系统发出的邮件堆积在队列目录中,占用大量的inode节点。

 

处理方法:确认/var/spool/clientmqueue下的文件已经无用,删除之,如果文件数量太大,无法使用rm -f * 直接删除,可以选择ls |xargs rm -f 或者直接删除上级目录,然后重建该目录,并赋予正确的属主和权限。

 

最好的解决办法是重新设置系统邮件,使其能正常发送或找到发邮件的源头,如本文的crontab任务。

 

结论:分区/var/的 inode全部用尽,free inode为0,导致无法创建新的文件或目录,以后遇到类似的问题要注意用df  -li检查inode的使用情况。

 

 

1.10生产场景如何调试crontab定时任务

 

  1. 在调试时,把任务执行频率调大一点,如:每分钟、每5分钟执行一次;
  2. 用正确的执行任务时间,设置完成后,可以修改下系统当前时间;
  3. 在脚本中加入日志输出,然后把输出打印到指定的日志中,然后观察日志内容,看是否执行正确;
  4. 注意:*/1  *  *  *  *  echo “==” >> /tmp/oldboy.log  >/dev/null  2>&1这种隐蔽的无法正确执行的任务配置;
  5. 执行脚本中>>或者>后的文件名要加上绝对路径。
  6. 注意环境变量导致的定时任务故障,比如运行java程序的时候,环境变量要在脚本中重新export一下。
  1. 通过定时任务日志查看调试定时任务

 

1.11 定时任务生产问题8条箴言

 

  1. 环境变量问题,典型的是如java程序运行案例
  2. 任务路径问题,脚本要用绝对路径
  3. 脚本权限问题,最好带上/bin/bash,防止忘了为脚本赋予执行的权限带来问题
  4. 时间变量问题,%号在crontab中被认为是newline,需要用\转义,crontab中有“date +%Y%m%d”,必须替换为“date +\%Y\%m\%d”,但写在脚本中就不需要了,这也是老师推荐用脚本文件的原因之一。
  5. >/dev/null 2>&1问题
  6. 定时任务加注释
  7. 使用脚本程序代替命令
  8. 避免不必要的程序输出

  

  1.12 定时清理垃圾文件

  

crontab  -l |tail -2

#del clientmqueue  files  by oldboy at 2010-09-26

00 00  *  *  0 /bin/bash  /server/scripts/del_sys_file.sh > /dev/null  2>&1

 

cat /server/scripts/del_sys_file.sh

find /var/spool/clientmqueue/  -type  f | xargs  rm  -f

 

  1.13 crond章节重点

1) 用户使用crontab  -e自定义定时任务项目,分为六段,[分、时、日、月、周、指令]。

2) 系统的/etc/crontab定时任务项目分为7段,[分、时、日、月、周、用户、指令]。

3) crontab定时任务的5个生产基本要领和7点调试技巧,尤其是学会看服务日志来调试

4) 生产环境使用crontab定时任务要注意的8点箴言

5) 重视生产的案例及通过案例为载体来学习巩固技术知识


2. Linux系统的用户和用户组管理

 2.1 用户管理的文件

2.1 .1 /etc/skel目录

   /etc/skel目录是用来存放新用户配置文件的目录,当我们添加用户时,这个目录下的所有文件会自动改被复制到新添加的用户的家目录下。

  

   示例:在/etc/skel目录下创建一个文件,看看新创建的用户家目录下是否有这个文件

[root@test2 skel]# ll -a /etc/skel/

总计 56

drwxr-xr-x  2 root root  4096 06-02 20:02 .

drwxr-xr-x 92 root root 12288 06-03 06:11 ..

-rw-r--r--  1 root root    33 2011-07-22 .bash_logout

-rw-r--r--  1 root root   176 2011-07-22 .bash_profile

-rw-r--r--  1 root root   124 2011-07-22 .bashrc

-rw-r--r--  1 root root    14 06-02 20:02 qinbf.txt

[root@test2 skel]# cat qinbf.txt

this is qinbf

[root@test2 skel]# useradd student

[root@test2 skel]# ll -a /home/student/

总计 48

drwx------ 2 student student 4096 06-03 06:13 .

drwxr-xr-x 8 root    root    4096 06-03 06:13 ..

-rw-r--r-- 1 student student   33 06-03 06:13 .bash_logout

-rw-r--r-- 1 student student  176 06-03 06:13 .bash_profile

-rw-r--r-- 1 student student  124 06-03 06:13 .bashrc

-rw-r--r-- 1 student student   14 06-03 06:13 qinbf.txt

[root@test2 skel]# cat /home/student/qinbf.txt

this is qinbf

 

 2.1.2 /etc/login.defs文件

/etc/login.defs文件是用来定义创建用户时需要的一些用户的配置信息,如创建用户时,是否需要家目录,UID和GID的范围等。

 

示例:修改UID的范围,看看创建的用户UID值得范围

23 # Min/max values for automatic uid selection in useradd

24 #

25 UID_MIN                 20000    #--à只修改了UID_MIN,没有修改GID_MIN

26 UID_MAX                 60000

[root@test2 etc]# useradd  teache

[root@test2 etc]# tail -1 /etc/passwd

teache:x:20000:20000::/home/teache:/bin/bash

 

 2.1.3/etc/default/useradd文件

/etc/default/useradd文件是在使用useradd添加用户时,的一个需要调用的一个默认的配置文件,可以使用useradd  -D参数。

 

[root@test2 etc]# cat /etc/default/useradd

#useradd  default  file

GROUP=100

HOME=/home  #-à把用户的家目录建在/home中

INACTIVE=-1   #--à是否启用账号过期停权,-1表示不启用

EXPIRE=       #-à账号终止日期,不设置表示不启用

SHELL=/bin/bash  #-à新用户默认所用的shell类型

SKEL=/etc/skel    #-à配置新用户家目录的默认文件存放路径,用户家目录下文件都是从这里复制过去的

CREATE_MAIL_SPOOL=yes   #--à创建mail文件

 

示例:修改/etc/default/useradd文件的内容,新建一个用户,看看新用户的配置

[root@test2 etc]# mkdir /etc/qinbf/test

[root@test2 etc]# ll -a /etc/qinbf/

总计 40

drwxr-xr-x  3 root root  4096 06-03 06:33 .

drwxr-xr-x 93 root root 12288 06-03 06:31 ..

-rw-r--r--  1 root root    14 06-02 20:02 qinbf.txt

drwxr-xr-x  2 root root  4096 06-03 06:33 test

[root@test2 etc]# sed -i ‘s#/etc/skel#/etc/qinbf#g‘ /etc/default/useradd

[root@test2 etc]# cat /etc/default/useradd

# useradd defaults file

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/qinbf

CREATE_MAIL_SPOOL=yes

[root@test2 etc]# useradd student2

[root@test2 etc]# ll -a /home/student2/

总计 32

drwx------  3 student2 student2 4096 06-03 06:34 .

drwxr-xr-x 10 root     root     4096 06-03 06:34 ..

-rw-r--r--  1 student2 student2   14 06-03 06:34 qinbf.txt

drwxr-xr-x  2 student2 student2 4096 06-03 06:34 test

 

2.2用户管理的命令

2.2.1 useradd

当使用useradd命令不加参数选项,后面直接跟所添加的用户名时,系统会首先读取配置文件/etc/login.defs和/etc/default/useradd中所定义的参数或规则,根据设置的规则添加用户,同时会向/etc/passwd和/etc/group文件内添加新建用户和用户组的记录,并同步/etc/shadows和/etc/gshadows,同时系统还会根据/etc/default/useradd文件中所配置的信息建立用户家目录,并复制/etc/skel中的所有文件(包括隐藏的系统环境配置文件)到新用户的家目录中。

useradd语法(来自man  useradd)

名 称

       useradd - 帐 号 建 立 或 更 新 新 使 用 者 的 资 讯

 

语 法

       useradd [-c comment] [-d home_dir]

               [-e expire_date] [-f inactive_time]

               [-g initial_group] [-G group[,...]]

               [-m [-k skeleton_dir] | -M] [-s shell]

               [-u uid [ -o]] [-n] [-r] login

 

       useradd -D [-g default_group] [-b default_home]

                 [-f default_inactive] [-e default_expire_date]

                     [-s default_shell]

 

参数说明

说 明

-c comment

新 帐 号 password 档 的 说 明 栏

-d home_dir

新 帐 号 每 次 登 入 时 所 使 用 的 home_dir

-e expire_date

帐 号 终 止 日 期 。 日 期 的 指 定 格 式 为 MM/DD/YY

-f inactive_time

帐 号 过 期 几 日 后 永 久 停 权 。当 值 为 0 时 帐 号 则 立 刻 被 停 权 。而 当 值 为 -1 时 则 关 闭 此 功 能 , 预 设 值 为 -1

-g initial_group

group 名 称 或 以 数 字 来 做 为 使 用 者 登 入 起 始 群 组 (group) 。群 组 名 须 为 现 有 存 在 的 名 称 。群 组 数 字 也 须 为 现 有存 在 的 群 组 。预 设 的 群 组 数 字 为 1 。

-G group

定 义 此 使 用 者 为 此 一 堆 groups 的 成 员 。每 个 群 组 使 用 "," 区 格 开 来 , 不 可 以 夹 杂 空 白 字 元 。 群 组 名 同 -g 选 项 的 限 制 。定 义 值 为 使用 者 的 起 始 群 组 。

-m

使 用 者 目 录 如 不 存 在 则 自 动 建 立 。如 使 用 -k 选 项 skeleton_dir 内 的 档 案 将 复 制 至 使 用 者 目录 下 。然 而 在 /etc/skel目   录 下 的 档 案 也 会 复 制 过 去 取 代 。任 何 在 skeleton_dir or /etc/skel 的 目 录 也 相 同 会 在 使 用 者目 录 下 一 一 建 立 。The -k 同 -m 不 建 立 目 录 以 及 不 复 制 任 何 档 案 为 预 设 值

-M

不 建 立 使 用 者 目 录 , 即 使 /etc/login.defs 系 统 档 设 定 要 建立 使 用 者 目 录 。

-s shell

使 用 者 登 入 后 使 用 的 shell 名 称 。预 设 为 不 填 写 , 这 样 系 统 会 帮 你 指 定 预 设 的 登 入 shell

-u uid [ -o]

使 用 者 的 ID 值 。 必 须 为 唯 一 的 ID 值 , 除 非 用 -o 选 项 。数 字 不 可 为 负 值。预 设 为 最 小 不 得 小 于 999 而 逐 次 增  加。 0~ 999 传 统 上 是 保 留 给 系 统 帐 号 使 用 。

-n

预 设 值 使 用 者 群 组 与 使 用 者 名 称 会 相 同 。 此 选 项 将 取 消 此 预设 值

-r

此 参 数 是 用 来 建 立 系 统 帐 号。系 统 帐 号 的 UID 会 比 定 义 在 系统 档 上 /etc/login.defs.  的 UID_MIN 来 的 小。注 意 useadd 此 用 法 所 建 立 的 帐 号 不 会建 立 使 用 者 目 录, 也 不 会 在 乎 纪 录 在 /etc/login.defs. 的 定 义 值 。如 果 你 想 要 有 使用 者目录 须 额 外 指 定 -m 参 数 来 建 立 系统 帐 号 。这 是 RED HAT 额 外 增 设 的 选 项 。

 

 

useradd  -D参数选项

说明

-b default_home

定义使用者所属目录的前一个目录使用者名称会附加在 default_home后面用来建立新使用的目录。当然使用-d后则此选项无效 。

-e default_expire_date

使用者帐号停止日期

-f default_inactive

帐号过期 日后停权

-g default_group

新帐号起始群组名或ID。群组名须为现有存在的名称。群组I D也须为现有存在的群组

-s default_shell

使用者登入后使用的shell名称。往后新加入的帐号都将使用此 shell

 

useradd实例:账号过期时间实例

[root@test2 ~]# date +%F    #----à当前时间为6月3号

2013-06-03

[root@test2 ~]# useradd -e 06/04/13  student03  #----à6月4号到期

root@test2 ~]# date -s 06/05/13    #----à将时间设置为6月5号

2013年 06月 05日 星期三 00:00:00 CST

 

 

 

 

Last login: Mon Jun  3 00:02:45 2013 from 192.168.1.1

[student03@test2 ~]$    #------à可以正常登陆

 

[root@test2 ~]# date -s 06/06/13   #------à将系统时间设置为6月6号

2013年 06月 06日 星期四 00:00:00 CST

 

 

 

Your account has expired; please contact your system administrator

#-----------------à提示账号已经到期

[root@test2 ~]# su - student03

[student03@test2 ~]$ pwd    #-------à系统还是可以切换到student03账户下

/home/student03

[tmpuser1@test2 ~]$ chage -l student03

最近一次密码修改时间                                    : 6月 03, 2013

密码过期时间                                    :从不

密码失效时间                                    :从不

帐户过期时间                                            : 6月 04, 2013

两次改变密码之间相距的最小天数          :0

两次改变密码之间相距的最大天数          :99999

在密码过期之前警告的天数        :7

 

通过-e设置无法远程连接,但是可以su切换,账户并未被锁定

账户过期时间和系统时间,需要相差2天

 

useradd实例:useradd  –c -u  -G  -s  -d 多个参数组合例子

添加用户oldboy6,并设置其用户注释信息为HandsomeBoy,UID指定为806,归属用户为用户组root、oldboy、sa成员,其shell类型为/bin/sh,设置家目录为/oldboy6

 

root@test2 ~]# useradd -c HandsomeBoy -u 806 -G root,sa -s /bin/sh -d /oldboy6 oldboy6

[root@test2 ~]# grep oldboy6 /etc/passwd

  • oldboy6:x:806:806:HandsomeBoy:/oldboy6:/bin/sh

[root@test2 ~]# id oldboy6

uid=806(oldboy6) gid=806(oldboy6) groups=806(oldboy6),0(root),801(sa) context=user_u:system_r:unconfined_t:s0

#------à在添加用户时,如果不使用-n参数,系统会自动创建一个与用户名同名的用户组

 

useradd  -D的用法

[root@test2 ~]# useradd -D

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

[root@test2 ~]# useradd -D -e "06/12/13" -b "/home/test" -s /bin/sh

[root@test2 ~]# useradd -D

GROUP=100

HOME=/home/test

INACTIVE=-1

EXPIRE=06/12/13

SHELL=/bin/sh

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

#---à实验之后记得恢复之前的默认设置

 

2.2.2 添加用户组命令groupadd

与groupadd命令有关的文件有

/etc/group-用户组相关文件

/etc/gshadow-用户组加密相关文件

 

groupadd命令语法

语法

       groupadd [-g gid [-o]] [-r] [-f] group

 

groupadd参数说明

groupadd参数选项

注释说明

-g gid

指定用户组GID。除非接-o参数,否则ID值必须是唯一的数字(不能为负数)。如果不指定-g参数,则预备值会从500开始。

-r

建立系统用户组。GID会比/etc/login.defs中定义的UID_MIN值小

-f

新增一个账户,强制覆盖一个已经存在的用户组账号

 

groupadd实例

[root@test2 ~]# groupadd -g 10086 2ma

[root@test2 ~]# grep 2ma /etc/group

2ma:x:10086:

 

2.3 用户密码相关命令

2.3.1  passwd命令介绍

普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码,超级用户root则可以设置或修改所有用户的密码,

 

当直接执行passwd命令后面不接任何参数或用户名时,则表示修改当前登录用户的密码。

[root@test2 ~]# passwd

Changing password for user root.

New UNIX password:

[root@test2 ~]# passwd qinbf

Changing password for user qinbf.

New UNIX password:

[root@test2 ~]# passwd root

Changing password for user root.

New UNIX password:

 

passwd命令参数选项

 

命令参数

说明

-k, --keep-tokens

保留即将过期的用户在期满后仍能使用

-d,--delete

删除用户密码,仅能以root权限操作

-l,--lock

锁住用户无权更改其密码,仅能通过root权限操作

-u,--unlock

解除锁定

-f,--force

强制操作,仅root权限操作

-x,--maximum=DAYS

两次密码修改的最大天数,后面接数字;仅能root权限操作

-n,--minimin=DAYS

两次密码修改的最小天数,后面接数字,仅能root权限操作

-w,--waring=DAYS

在距多少天提醒用户修改密码;仅能root权限操作

-I,--inactive=DAYS

在密码过期多少天后,用户被禁掉,仅能以root操作

-S,--status

查询用户的密码状态,仅能root用户操作

--stdin

从stdin读入密码

 

passwd命令实例

实例1:用-l参数来锁定oldboy用户,使之不能修改密码,然后再用-u来解除锁定。

[root@test2 ~]# passwd -l oldboy

Locking password for user oldboy.

passwd: Success

[root@test2 ~]# passwd -S oldboy

  • oldboy LK 2013-06-15 0 99999 7 -1 (Password locked.)

 

实例2:我们用-d参数清除test用户密码,然后通过-S参数查看

[root@test2 ~]# passwd -d oldboy

Removing password for user oldboy.

passwd: Success

[root@test2 ~]# passwd -S oldboy

  • oldboy NP 2013-06-15 0 99999 7 -1 (Empty password.)

疑问:用户密码为空,那么是否通过远程ssh链接就不要密码了呢?

解答:空密码登陆不了。

 

实例3:举一个组合参数-x -w -i控制密码时效的例子

要求odlboy用户7天内不能更改密码,60天以后必须修改密码。过期前10天通知odlboy用户,过期30天后禁止用户登陆。

[root@test2 ~]# passwd -n 7 -x 60 -w 10 -i 30 test

Adjusting aging data for user test.

#--àchage  -m  7  -M  60  -W 10  -I  30  odlboy命令也可以实现同样功能,只是参数的写法不同

 

实例4:用--stdin参数实现非交互的批量设置或修改密码

#-à记得使用history  -c清除历史记录

[root@test2 ~]# vi us.sh

 

1 #!/bin/bash

2 userchars="oldstudent"  #用户字符串,就是用户的前面部分

3 for num in `seq 3`  #seq 3 表示1-3

4

5 do     

6         useradd $userchars$num  #创建用户的命令

7         passwd=`date|md5sum|cut -c3-20` #按照时间md5加密取3-20之间的字符作为用户的密码。此处要注意,密码部分应该要事先定义好变量,否则取值会变化,导致密码生成错误

8         echo "$passwd" |passwd --stdin $userchars$num  #这行就是利用--stdin无交互设置密码的参数

9         echo -e "user:$userchars$num\tpasswd:$passwd">>/tmp/user.log #输出创建的用户和密码到user.log文件

10        

11         sleep 1

12 done

13 echo --------------------------

14 cat /tmp/user.log

 

[root@test2 ~]# sh us.sh

Changing password for user oldstudent1.

passwd: all authentication tokens updated successfully.

Changing password for user oldstudent2.

passwd: all authentication tokens updated successfully.

Changing password for user oldstudent3.

passwd: all authentication tokens updated successfully.

--------------------------

user:oldboy1    passwd:7246382a2ba141f2db

user:oldboy2    passwd:7aeea9dd5537c975dd

user:oldboy3    passwd:4ee64c9a8e85bba809

user:oldstudent1        passwd:9bc57124663721831d

user:oldstudent2        passwd:57934e619ad637f218

user:oldstudent3        passwd:5a54c4db74389a02dc

 

总结:在实际工作中,最常用的用法就是直接使用passwd加用户名设置和修改密码,其次是加--stdin参数批量无交互设置密码,其他参数用的很少(包括-l,-u,-S等)。

 

2.3.2 修改用户密码有效期相关命令chage

chage说明

chage和passwd等命令功能有不少是重复的,用来修改用户密码。

 

chage语法

用法:chage [选项] 用户名

chage参数选项

注释说明

-d,--lastday 最近日期

将最近一次密码设置时间设为“最近日期”

-E,--expiredate 过期日期

将账户过期时间设为“过期时间”,日期格式为mm/dd/YY

-h,--help

显示帮助信息,并退出

-I,--inactive 失效密码

将因过期而失效的密码设为“失效密码”

-l.--list

显示账户年龄信息

-m,--mindays 最小天数

将两次改变密码之间相距最小天数设为“最小天数”

-M,--maxdays 最大天数

将两次改变密码之间相距最大天数设为“最大天数”

-W,--warndays 警告天数

将过期警告天数设为“警告天数”

 

chage实例

实例1:使用-l参数显示账户年龄信息

[root@test2 ~]# chage -l qinbf

最近一次密码修改时间                                    : 5月 21, 2013

密码过期时间                                    :从不

密码失效时间                                    :从不

帐户过期时间                                            :从不

两次改变密码之间相距的最小天数          :0

两次改变密码之间相距的最大天数          :99999

在密码过期之前警告的天数        :7

 

实例2:举一个组合参数-m、-M、-W、-I控制密码时效的例子(同passwd命令的实例3)

[root@test2 ~]# chage -l oldboy1

最近一次密码修改时间                                    : 6月 03, 2013

密码过期时间                                    :从不

密码失效时间                                    :从不

帐户过期时间                                            :从不

两次改变密码之间相距的最小天数          :0

两次改变密码之间相距的最大天数          :99999

在密码过期之前警告的天数        :7

[root@test2 ~]# chage -m 7 -M 60 -W 10 -I 30 oldboy1

[root@test2 ~]# chage -l oldboy1

最近一次密码修改时间                                    : 6月 03, 2013

密码过期时间                                    : 8月 02, 2013

密码失效时间                                    : 9月 01, 2013

帐户过期时间                                            :从不

两次改变密码之间相距的最小天数          :7

两次改变密码之间相距的最大天数          :60

在密码过期之前警告的天数        :10

 

实例3:使用-E参数修改账户有效期

#也可以使用usermod  -e 06/10/13来实现

[root@test2 ~]# chage -E 06/13/13 oldboy1

[root@test2 ~]# chage -l oldboy1

……

帐户过期时间                                       : 6月 13, 2013

……

[root@test2 ~]# usermod -e "" oldboy1

[root@test2 ~]# chage -l oldboy1

……

帐户过期时间                                            :从不

……

 

有关用户密码失效

设置用户密码时效有利有弊,可以防止离职人员过期登录,也可以强制定期修改密码,提升系统安全性,缺点是有一些本应该保留的用户过期无法登录,再者服务器数量很大的情况下,修改密码是很大的工作量。在大规模的运维环境中,使用LDAP服务实行对linux账户统一认证,批量修改,是不错的方法。

 

2.4 删除用户相关命令userdel

userdel语法

userdel [-r] 用户名

 

总结

使用“userdel 用户名”删除用户时,仅会删除用户本身,其家目录及相关文件并不会被删除。

 

我们可以直接使用vi编辑/etc/passwd,找到要处理的用户吗,先注释一段时间,确认真的没问题,然后再清理其家目录,注释的作用和userdel命令删除的效果是一样的。注释取消注释之后,还可以恢复。对/etc/passwd这样重要的文件进行修改,最好先备份。

 

实例

[root@test2 ~]# sed -i "s/tmpuser1/\#tmpuser1/g"  /etc/passwd

[root@test2 ~]# grep \# /etc/passwd

#tmpuser1:x:20003:20003::/home/#tmpuser1:/bin/bash

[root@test2 ~]# ll -d /home/tmpuser1/

drwx------ 2 20003 tmpuser1 4096 06-03 07:08 /home/tmpuser1/

[root@test2 ~]# su - tmpuser1

su: 用户 tmpuser1 不存在

 

[root@test2 ~]# userdel tmpuser1   #-à没有使用参数-r

[root@test2 ~]# ll -d /home/tmpuser1   #-->家目录还在

drwx------ 2 20003 20003 4096 06-03 07:08 /home/tmpuser1

[root@test2 ~]# cd /var/spool/mail/

[root@test2 mail]# ll |grep tmpuser1  #--à邮件队列还存在

-rw-rw---- 1       20003 mail     0 06-03 07:07 tmpuser1

 

[root@test2 ~]# tail -3 /etc/passwd

  • oldstudent1:x:20007:20007::/home/oldstudent1:/bin/bash
  • oldstudent2:x:20008:20008::/home/oldstudent2:/bin/bash
  • oldstudent3:x:20009:20009::/home/oldstudent3:/bin/bash

[root@test2 ~]# userdel -r oldboy3   #-à使用-r参数

[root@test2 ~]# ll -d /home/oldboy3  #-à家目录不存在

ls: /home/oldboy3: 没有那个文件或目录

[root@test2 ~]# ll /var/spool/mail/ |grep oldboy3  #--à邮件队列不存在

 

2.5 删除用户组相关命令groupdel

语法格式

groupdel  用户组

[root@test2 ~]# cat /etc/group

…..

  • oldboy2:x:20002:

……

[root@test2 ~]# userdel oldboy2

[root@test2 ~]# ll -d /home/oldboy2

ls: /home/oldboy2: 没有那个文件或目录

[root@test2 ~]# grep oldboy2 /etc/group

[root@test2 ~]# grep oldboy2 /etc/passwd

 

2.6 用户信息修改相关命令usermod

usermod语法

 

 

usermod参数选项

注释说明

-c comment

增加用户账户/etc/passwd中的注解说明

-d home_dir

更新家目录,如果给定-m选项,用户旧的家目录会搬到新的家目录中去

-e expire_date

加上用户账号停止日期,格式为mm/dd/yy

-f inactive_days

账户过期几日后永久停权,当值为-1时,则关闭此功能

-g install_group

更新用户新的起始登入用户组,用户组名须已存在

-G group […]

定义用户为一堆groups成员

-l login_name

变更用户login时的名称为login_name。其余信息不变

-s shell

指定新登入shell

-u uid

指定用户的UID,除非接-o参数,否则ID值必须唯一

-L

冻结用户的密码,使之无法登陆,实际就是间接修改/etc/passwd的密码栏,在密码栏的开头加上“!”

-U

取消冻结用户的密码,使之恢复登陆,取消/etc/passwd中的“!”。

 

实例:

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:$1$Nh65QzTp$IX.AFlh.F/9EAZ1KAnsw40:15859:0:99999:7:::

[root@test2 ~]# usermod -L oldstudent3

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:!$1$Nh65QzTp$IX.AFlh.F/9EAZ1KAnsw40:15859:0:99999:7:::

[root@test2 ~]# usermod -U oldstudent3

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:$1$Nh65QzTp$IX.AFlh.F/9EAZ1KAnsw40:15859:0:99999:7:::

 

[root@test2 ~]# usermod -L oldstudent3

[root@test2 ~]# passwd -S oldstudent3

  • oldstudent3 LK 2013-06-05 0 99999 7 -1 (Password locked.)

[root@test2 ~]# grep oldstudent3 /etc/shadow    

  • oldstudent3:!$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

[root@test2 ~]# passwd -u oldstudent3

Unlocking password for user oldstudent3.

passwd: Success.

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

 

[root@test2 ~]# passwd -S oldstudent3      

  • oldstudent3 PS 2013-06-05 0 99999 7 -1 (Password set, MD5 crypt.)

[root@test2 ~]# passwd -l oldstudent3   #使用passwd  -l锁定

Locking password for user oldstudent3.

passwd: Success

[root@test2 ~]# passwd -S oldstudent3

  • oldstudent3 LK 2013-06-05 0 99999 7 -1 (Password locked.)

[root@test2 ~]# usermod -U oldstudent3  #使用usermod  -U解除锁定

[root@test2 ~]# passwd -S oldstudent3

  • oldstudent3 LK 2013-06-05 0 99999 7 -1 (Password locked.) #还是锁定状态

[root@test2 ~]# usermod -U oldstudent3  #再次使用usermod  -U解除锁定

[root@test2 ~]# passwd -S oldstudent3    #成功解除

  • oldstudent3 PS 2013-06-05 0 99999 7 -1 (Password set, MD5 crypt.)

从上面可以发现,使用usermod  -U参数锁定,用passwd -l来解除锁定,只需要输入一次命令,而使用passwd  -l参数锁定,用usermod  -U来解除锁定,需要输入两次命令。以下可以通过分别使用两个命令,/etc/shadow文件的变化来验证。

[root@test2 ~]# passwd -l oldstudent3

Locking password for user oldstudent3.

passwd: Success

[root@test2 ~]# grep oldstudent3 /etc/shadow  #passwd锁定一开始有两个“!”

  • oldstudent3:!!$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

[root@test2 ~]# usermod -U oldstudent3     

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:!$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

[root@test2 ~]# usermod -U oldstudent3     

[root@test2 ~]# grep oldstudent3 /etc/shadow

  • oldstudent3:$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

[root@test2 ~]# usermod -L oldstudent3

[root@test2 ~]# grep oldstudent3 /etc/shadow  #usermod锁定一开始就只有一个“!”

  • oldstudent3:!$1$/pAJLrtB$2WBRM7PiWkJVxqipIgXPd0:15861:0:99999:7:::

总结:在众多命令中,usermod是一个不常使用,但是一个功能强大的命令。

2.7 用户查询相关命令

用户查询工具的原理也是读取与用户和用户组有关的配置文件以及相关的用户日志记录信息,然后按照一定的规则和条件输出。

 

2.7.1  id命令语法

       id [参数]  [用户名]

 

       实例:

[qinbf@test2 ~]$ id test  #普通用户也可以查看其它用户

uid=502(test) gid=502(test) groups=502(test) context=user_u:system_r:unconfined_t:s0

2.7.2  finger命令语法

       finger [参数] [用户名]

           

            finger命令侧重用于用户信息的查询;查询内容包括用户名、家目录、登录shell类型、用户真实的名字(name)……办公地址、办公电话等等

 

           

finger参数选项

注释说明

-l

采用长格式

-m

禁止对用户真实名字进行匹配

-p

把.plan和.projet文件中的内容省略

-s

显示短格式(默认项)

 

实例:finger -s和w、who、last、lastlog的比较

finger是一个非常简单的命令工具,当用到-s参数时,我们可以和w、who、last、lastlog对照

[root@test2 ~]# w  #显示已经登陆的用户,并且都做了什么的信息,查看信息与/var/run/utmp文件有关

10:40:09 up 33 min,  1 user,  load average: 0.00, 0.00, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

qinbf    pts/0    192.168.1.1      10:10    0.00s  0.06s  0.08s sshd: qinbf [priv]

 

[root@test2 ~]# who  #显示哪些用户在登陆,终端及登陆时间,来源主机

qinbf    pts/0        2013-06-05 10:10 (192.168.1.1)

 

[root@test2 ~]# users  #仅显示哪些用户在登陆

qinbf

 

[root@test2 ~]# finger  #不加参数也表示显示登陆用户的相关信息,但这个命令还可以显示其他未登陆的用户信息

Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host

qinbf     qinbf      pts/0          Jun  5 10:10 XM35       0592-2957777   (192.168.1.1)

 

[root@test2 ~]# last   #显示已登陆的用户列表及登陆时间等,查看的信息与/var/run/.wtmp/和/var/run/btmp两个文件有关

qinbf    pts/0        192.168.1.1      Wed Jun  5 10:10   still logged in  

reboot   system boot  2.6.18-308.4.1.e Wed Jun  5 10:07          (00:32)   

qinbf    pts/0        192.168.1.1      Tue Jun  4 15:47 - down   (09:22)   

reboot   system boot  2.6.18-308.4.1.e Tue Jun  4 15:46          (09:23)   

qinbf    pts/1        192.168.1.1      Mon Jun  3 19:43 - down   (01:37)   

qinbf    pts/1        192.168.1.1      Thu Jun  6 05:52 - 19:03 (-2+-10:-48)

student0 pts/1        192.168.1.1      Wed Jun  5 00:00 - 00:00 (1+00:00)  

student0 pts/1        192.168.1.1      Wed Jun  5 00:00 - 00:00  (00:00)   

student0 pts/1        192.168.1.1      Mon Jun  3 00:03 - 00:00 (1+23:56)  

student0 pts/1        192.168.1.1      Mon Jun  3 00:02 - 00:02  (00:00)

……

 

[root@test2 ~]# lastlog   #报告最近的所有系统用户的登录信息

用户名           端口     来自             最后登陆时间

root             pts/0    192.168.1.1      四  5月 16 23:43:45 +0800 2013

bin                                        **从未登录过**

daemon                                     **从未登录过**

adm                                        **从未登录过**

lp                                         **从未登录过**

sync                                       **从未登录过**

shutdown                                   **从未登录过**

halt                                       **从未登录过**

mail                                       **从未登录过**

news                                       **从未登录过**

 


3. Linux用户身份切换命令     

超级用户root具有超级管理权限,由于权限太大,如果管理不好,就会对系统安全带来安全隐患。在工作场景中,一般临时性处理工作,都是以普通用户的身份完成,只在必要时才使用超级用户root。

 

3.1  su命令

3.1.1  su介绍 

通过su命令可以在用户之间切换,超级用户root向普通用户或虚拟用户切换不需要密码(这就是超极权限所在)。其他普通用户之间或者普通用户切换到root,都需要切换用户的秘密验证。

   

su参数选项

注释说明

-,-l,--login

使一个shell成为登陆的shell,如执行su - oldboy,表示该用户改变身份为oldboy,并且使用oldboy用户的环境变量配置。

-c,--command=COMMAND

切换到一个shell下,执行一个命令,然后退出所切换的用户环境

-m,--presserve-environment

切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,较少使用

-s,--shell=SHELL

如果/ec/shell允许,则运行指定的shell

 

  su实例:

[qinbf@qinbf ~]$ whoami

qinbf

[qinbf@qinbf ~]$ su -  #输入的是root的密码

口令:

[root@qinbf ~]# whoami

root

[root@qinbf ~]# env

HOSTNAME=qinbf

SHELL=/bin/bash

TERM=linux

HISTSIZE=1000

USER=root

……

PWD=/root

LANG=zh_CN.UTF-8

SHLVL=1

HOME=/root

LOGNAME=root

[root@qinbf ~]# su - qinbf

[qinbf@qinbf ~]$ whoami

qinbf

[qinbf@qinbf ~]$ env

HOSTNAME=qinbf

SHELL=/bin/bash

TERM=linux

HISTSIZE=1000

USER=qinbf

…….

PWD=/home/qinbf

LANG=zh_CN.UTF-8

SHLVL=1

HOME=/home/qinbf

LOGNAME=qinbf

[qinbf@qinbf ~]$ exit   # exit退出当前用户,这个命令可以用ctrl+d替换

logout

 

[root@qinbf ~]#

总结:su切换到其他用户不加“-”,环境变量是不会改变的,可能会导致异常,比较规范的写法是“su  -  用户”

 

如何让系统在每一次开机时自动普通用户启动指定的服务脚本?

把要执行的脚本放入开机自启动配置文件/etc/rc.local

su  -  tddoc  -c  ‘/bin/sh /home/tddoc/bin/deploy.sh’

 

su命令优缺点

            su命令为我们管理linux带来方便,但是也带来了很大的安全管理问题,切换到root身份,可以改掉root的密码,让其他用户无法再切换到root。使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择。建议使用sudo代替su。

     su致命的缺点:

1)   普通用户必须知道root密码才可以切换到root,这样root密码就泄露开了。

2)   使用su命令切换身份,无法对切换后的身份做精细的控制,可以为所欲为,甚至改掉root密码。

 

3.2 sudo命令

通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细)授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权。

3.2.1  sudo执行的流程

1)                当用户执行sudo时,系统会首先查找/var/run/sudo/%HOME(如果是新用户会先生成此目录)目录中是否有用户时间戳文件,如果时间戳文件过期,则提示用户是否输入自身的密码(不是root或者要切换的用户密码)

2)                当密码验证成功后,系统会查找/etc/sudoers配置文件,判断用户是否有执行相应sudo命令权限

3)                如果具备执行相应sudo权限,就会自动由当前用户切换到root,然后以root身份执行该命令

4)                执行完成后,又会自动直接退回到当前用户shell下。

3.2.2  sudo语法

      sudo [参数选项] 命令

sudo参数选项

注释说明

-l

列出用户在主机上可用的和被禁止的命令

-v

验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接运行sudo,可用-v可以跟踪最新的时间戳

-u

指定以某个用户身份执行特定的操作

-k

同-K,删除时间戳,下一个sudo命令提供密码。前提是该用户授权中不能有NOPASSWD参数

 

                            sudo授权的方法

1)   执行visudo命令

2)   直接修改/etc/sudoers文件

直接修改sudoers配置文件方法有以下需要注意的几点:

  1. echo命令是追加>>,不是重定向>,除了echo外,可以用cat、sed等命令实现此功能;
  2. 修改操作完成一定要执行visudo  -c进行语法检查,这弥补了直接修改的不足
  3. 确保/etc/sudoers权限是正确的(-r--r-----),权限不对会导致sudo功能异常
  4. 及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口)
  5. 确保知道正确root用户密码,以便在出现问题时可以通过普通用户等候执行su-命令切换到root进行恢复。

3)   使用用户组的方式实现sudo授权

通过授权一个用户组的方式来配置/etc/sudoers,这样以后有增加用户需要相同的授权时,直接将用户加入到sa组就可以享受sa组的sudo授权了。

 

%sa                     ALL=(All)            ALL

#注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的。

 

3.2.3  sudo实例:

[root@qinbf ~]# useradd sun

[root@qinbf ~]# echo "qbf" |passwd --stdin sun

Changing password for user sun.

passwd: all authentication tokens updated successfully.

[root@qinbf ~]# su - sun

[sun@qinbf ~]$ touch /root/sun.txt

touch: 无法触碰 “/root/sun.txt”: 权限不够

[sun@qinbf ~]$ sudo /root/sun.txt

 

We trust you have received the usual lecture from the local System

Administrator. It usually boils down to these three things:

 

    #1) Respect the privacy of others.

    #2) Think before you type.

    #3) With great power comes great responsibility.

 

[sudo] password for sun:

Sorry, try again.

[sudo] password for sun:

sun is not in the sudoers file.  This incident will be reported.

 

方法一:

[root@qinbf ~]# visudo

81 ## Allow root to run any commands anywhere

     82

     83 root    ALL=(ALL)       ALL

     84 qinbf   ALL=(ALL)       ALL

     85 sun     ALL=(ALL)       ALL #允许sun用户在任何主机、对任何用户、执行任何操作

 

方法二:

[root@qinbf ~]# echo "sun   ALL=(ALL)   ALL">>/etc/sudoers

[root@qinbf ~]# visudo -c    #检查/etc/sudoers文件的语法

/etc/sudoers: parsed OK

[root@qinbf ~]# ll /etc/sudoers  #检查/etc/sudoers文件的权限

-r--r----- 1 root root 3438 06-05 15:05 /etc/sudoers

 

方法三:

[root@qinbf ~]# grep sa /etc/group

sa:x:801:oldboy6

[root@qinbf ~]# echo "%sa   ALL=(ALL)   ALL">>/etc/sudoers

[root@qinbf ~]# usermod -G sa sun

 

验证:

[sun@qinbf ~]$ sudo touch /root/sun.doc

[sun@qinbf ~]$ sudo ls -l /root/sun.doc

-rw-r--r-- 1 root root 0 06-05 15:10 /root/sun.doc

 

  3.3  /etc/sudoers配置文件

    3.3.1    /etc/sudoers的规则大致可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

                

1)   Host_Alias定义主机别名

# Host_Alias     FILESERVERS = fs1, fs2

# Host_Alias     MAILSERVERS = smtp, smtp2

                  

2)   User_Alias定义用户别名

User_Alias  ADMINS = jsmith, mikem

 

3)   Runas_Alias定义runas别名

这个别名指定的是“用户身份”,即sudo允许切换至的用户

Runas_Alias SUPER = root

 

4)   Cmnd_Alias定义命令别名

## Services

#Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

 

## Updating the locate database

#Cmnd_Alias LOCATE = /usr/bin/updatedb

 

       3.3.2 别名实例

                            实例1:定义用户别名

User_Alias  ADMINS = oldboy,  ett,  %oldboy

#-->定义用户别名ADMINS,包含oldboy,ett及oldboy组的成员

                           

                            实例2:定义命令别名

Cmnd_Alias  NETWORK = /sbin/ifconfig, /etc/init.d/network

#

1)  所有的命令别名下的成员必须是文件或目录的绝对路径

2) 命令别名超过一行时,可以通过“\”号换行

3) 在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*。

 

                            实例3:定义Runas别名

Runas_Alias  OP = root, oldboy

特别说明:runas别名的定义也不多见

 

       3.3.3  /etc/sudoers配置文件中的授权规则

                           

oldboy      ALL=(ALL)    ALL

#-->授权中的所有ALL字符串必须大写。其中,第一、二个ALL字符串不大写的话,visudo语法检查可以过,但是授权实际配置达不到配置需求,最后一个ALL必须大写,否则visudo语法检查通不过。

 

这一行代表的意思是:

授权用户    主机=(指定的可切换的用户) 可以执行的命令动作

因此,上面一行授权内容的实际意思就是,oldboy用户可以在所有的主机上,切换到所有用户,执行所有的命令。

 

如果忽略上面括号的内容,如写成:

oldboy      ALL=         ALL

那么只能切换到root执行所有命令。

 

如果希望在执行命令时不提示密码,就用这个NOPASSWD:ALL语法来授权

如果不希望执行某个命令,那么就在这个命令前面加上“!”

 

       3.3.4  /etc/sudoers配置文件授权规则实例

在/etc/sudoers文件的末尾添加以下两行:

Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

 

test  ALL=(ALL)    USER_ADMIN

"/etc/sudoers" 109L, 3595C 已写入

[root@test2 ~]# visudo -c

/etc/sudoers: parsed OK

[root@test2 ~]# ll /etc/sudoers

-r--r----- 1 root root 3595 06-08 10:07 /etc/sudoers

 

[test@test2 ~]$ vi .bash_profile

#修改test用户的环境变量,添加以下黄色部分的变量

PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

[test@test2 ~]$ source .bash_profile

[test@test2 ~]$ sudo useradd bifeng 

[sudo] password for test:

[test@test2 ~]$ sudo passwd bifeng

Changing password for user bifeng.

New UNIX password:

Retype new UNIX password:

Sorry, passwords do not match.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

 

[test@test2 ~]$ sudo passwd root

[sudo] password for test:

Sorry, user test is not allowed to execute ‘/usr/bin/passwd root‘ as root on test2.localdomain.

[test@test2 ~]$ sudo passwd

[sudo] password for test:

Sorry, user test is not allowed to execute ‘/usr/bin/passwd‘ as root on test2.localdomain.

 

再添加一行:

Cmnd_Alias USER_CHANGE = /bin/chown

修改test的权限:

test  ALL=(ALL)    USER_ADMIN, NOPASSWD: USER_CHANGE

 

[test@test2 ~]$ sudo /bin/chown sun.sun /root/sun.txt

[test@test2 ~]$

#-----à不再需要密码提示

 

       3.3.5 sudo配置文件/etc/sudoers授权规则注意事项总结:

1)   授权规则中的所有ALL字符串必须为大写字母

2)   Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel,!/usr/bin/passwd、/usr/bin/passwd[A-Za-z]*,/bin/chown, !/usr/bin/passwd root

允许执行的命令是有顺序的,从老师的测试结果来看,命令的顺序是从后面向前,即把允许执行的命令放在禁止命令的后面

3)   一行内容超长可以用“\”斜线换行

4)   “!”叹号表示非,就是命令取反的意思,即禁止执行的命令。

5)   测试之前要记得修改普通用户的环境变量.bash_profile文件,把root的环境变量加入到普通用户的后面。

 

   3.3.6 远程执行sudo命令

在默认情况下,我们是无法通过ssh远程执行sudo命令的

 

在/etc/sudoers有这样的配置:

53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear.

 54 #         You have to run "ssh -t hostname sudo <cmd>".

 55 #

 56 Defaults    requiretty

 

根据注释我们可以知道,这个“Default  requiretty”就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh  sudo  命令格式为“ssh  hostname  sudo <cmd>”,禁止的原因是因为会明文显示密码,但是我们可以通过“ssh  -t  hostname sudo <cmd>”的方式

 

 

  3.4 配置sudo命令审计

   3.4.1 日志文件配置

1)安装sudo,syslog命令服务

yum  install  sudo syslog

[root@test2 ~]# yum install sudo syslog

 

2)配置系统日志/etc/syslog.conf

           echo “local2.debug    /var/log/sudo.log”>>/etc/syslog.conf

31news.=crit                             /var/log/news/news.crit

 32news.=err                             /var/log/news/news.err

 33news.notice                           /var/log/news/news.notice

 34local2.debug                          /var/log/sudo.log

 

3) 配置/etc/sudoers

           增加配置“Defaults      logfile=/var/log/sudo.log”>>/etc/sudoers

 

4) 重启syslog内核日志记录器

           /etc/init.d/syslog  restart

[root@test2 ~]# /etc/init.d/syslog restart

关闭内核日志记录器:                                       [确定]

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:                                       [确定]

启动内核日志记录器:                                       [确定]

 

5) 测试sudo日志审计配置结果

[test@test2 ~]$ sudo useradd bill

[test@test2 ~]$ sudo passwd bill

Changing password for user bill.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

 

[test@test2 ~]$ sudo useradd lily

[test@test2 ~]$ passwd lily

passwd: Only root can specify a user name.

[test@test2 ~]$ sudo passwd lily

Changing password for user lily.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

 

[test@test2 ~]$ sudo chown root.root /root/sun.txt

 

[root@test2 ~]# tail /var/log/sudo.log

 6月  8 11:02:45 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/sbin/useradd bill

 6月  8 11:02:52 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/bin/passwd bill

 6月  8 11:03:32 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=list

 6月  8 11:03:51 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=validate

 6月  8 11:04:12 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/sbin/useradd lily

 6月  8 11:04:22 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

COMMAND=/usr/bin/passwd lily

6月  8 11:07:04 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/bin/chown root.root /root/sun.txt

 

3.5.2 日志写到其他主机:
  1. 配置syslog服务器配置文件(/etc/sysconfig/syslog)中添加:

SYSLOGD_OPTIONS=”-m O -r -x”  # -r是指接收远程日志的意思

重启syslog服务器

/etc/init.d/syslog   restart

 

  1. 客户端配置

编辑/etc/syslog.conf

修改

local2.debug   /var/log/sudo.log

修改为

local2.debug   @中央服务器的IP

 


4. Linux系统集权分治管理sudoer配置案例

4.1完成本案例,可以在增加以下项目经验:

服务器用户权限管理改造方案与实施项目

  1. 提出权限整改解决方案改进公司超级权限root泛滥的现状
  2. 召集大家开会讨论确定方案后推进实施
  3. 实施后使得公司的权限管理更加清晰了

 

4.2问题现状

公司服务器管理人员多,(开发+运维+架构+DBA+产品+市场),使用Linux服务器时,不同职能的员工操作不规范,root权限泛滥

 

4.3 项目需求

既希望超级用户root密码掌握在少数或者唯一的管理员手中,又希望多个系统管理员有相关权限

 

4.4 实施方案

4.4.1 信息采集

  1.1 召集相关各部门领导通过会议讨论或是与各组领导沟通确定权限方案的可行性

      需要支持人员:运维经理、CTO支持、各组的领导。我们作为运维人员,拿着类似老师给大家讲解的这个文档,通过会议形式做演讲,慷慨激昂的演说,取得大佬们的支持

 

  1.2 汇总、提交、审核所有相关员工对Linux服务器的权限需求

      取得大佬们的支持后,通过发邮件或者联系相关人员取得需要的信息。比如说,让各个部门的经理整理归类本部门需要权限的人员名单、职位及对应的业务及权限

 

1.3 按照linux命令及服务规划权限

    主要是运维人员根据上面手机的名单,对应账号配置权限

 

1.4权限方案实施后,所有员工必须通过《员工Linux服务器管理权限申请表》来申请对应的权限,确定审批流程,规范化管理。

 

4.4.2收集员工职能和对应权限

  1)初级运维3名

  权限分配:普通用户的权限,所管理的服务器的ALL权限,但是排除一些危害及切换root的权限

 

Cmnd_Alias  C_CMD_1 = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root, !/sbin/fdisk, !/sbin/parted, !/bin/rm, !/bin/su, !/usr/sbin/visudo, !/usr/bin/vi * *sudo*, !/bin/vi*sudo*

 

   2) 运维经理和高级运维:各一名

权限分配:普通用户的权限,所管辖的服务器的ALL权限

 

4)   网络工程师:1名

权限分配:普通用户的权限,查看网络配置,并排除故障的权限

Cmnd_Alias  N_CMD_1 = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/cat, /var/log/*

 

5)  普通开发:10名

 权限分配:普通用户的权限,对应服务的查看日志的权限,重启对应服务权限

 大公司:项目负责制的规定

 

Cmnd_Alias   P_CMD_1 = /bin/cat  ~/log/*, /bin/cat /var/log/message, /bin/cat /app/log/*, /bin/sh /  ~/scripts/deploy.sh

 

4.4.3 创建用户角色

   建立3个初级运维,一个网络工程师,一个运维经理,一个高级运维经理的用户,密码是111111

for  user  in  chuji001 chuji002 chuji003  net001 senior001 manager001

do

useradd  $user

echo  “111111” | passwd --stdin  $user

done

  

建立10个开发人员,属于phpers组

groupadd   -g  999  phpers

for  n   in  `seq  10`

do

     useradd -g phpers  php00$n

done

 

4.4.4 sudoers配置内容

   事先要备份/etc/sudoers文件,cp/etc/sudoers  /etc/sudoers.ori

##Cmnd_Alias  by  oldboy##2012

Cmnd_Alias  C_CMD_1 = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root, !/sbin/fdisk, !/sbin/parted, !/bin/rm, !/bin/su, !/usr/sbin/visudo, !/usr/bin/vi * *sudo*, !/bin/vi*sudo*

 

Cmnd_Alias  N_CMD_1 = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/cat, /var/log/*

 

Cmnd_Alias   P_CMD_1 = /bin/cat  ~/log/*, /bin/cat /var/log/message, /bin/cat /app/log/*, /bin/sh /  ~/scripts/deploy.sh

## User_Alias by oldboy###2012

User_Alias    ADMINS = senior001, manager01

User_Alias    CHUJIADMINS = chuji001, chuji002, chuji003

User_Alias    NETADMINS = net001

User_Alias    PROGRAMERS = %phpers

 

##Runas_Alias  by oldboy##2012/11/30

Runas_Alias   SUUSER = root

 

#pri config

ADMINS        ALL=(ALL)       NOPASSWD:ALL

CHUJIADMINS   ALL=(SUUSER)    NOPASSWD:ALL,C_CMD_1

NETADMINS     ALL=(SUUSER)   NOPASSWD:N_CMD_1

PROGRAMERS   ALL=(SUUSER)    NOPASSWD:P_CMD_1

Linux课程笔记 Day04 课上内容总结