• Linux用户管理


    一、Linux用户管理

    如何让一个脚本开机自启动

    方式1、放在/etc/rc.local中

    方式2、通过chkconfig管理

    #0、创建脚本
    #1、脚本必须放在/etc/init.d/目录下面
    #2、脚本要有 执行权限 chmod +x
    #3、脚本的开头要有# chkconfig: 2345 99 99    (注意空格)
    2345表示运行级别,99表示脚本是开机启动顺序,99代表关闭顺序
    注意开启或者关系顺序不要重复了
    #4、加入到chkconfig中,让chkconfig管理 chkconfig --add 脚本名字

    以上使用文档,可以查看chkconfig帮助: man chkconfig

    chkconfig背后的故事

    之前我们修改配置,总是会有临时生效和永久生效,这两类修改

    那么这两类修改有什么规律呢?

    在我看来,临时生效是执行了命令。而永久生效需要修改某些特定文件

    但是永久关闭防火墙chkconfig  iptables  on命令 好像并不是在修改文件呀,这是怎么一回事呢?

    这就需要探寻一下chkconfig背后到底做了什么

    其本质,也是修改了文件,修改的文件是/etc/下的rc3.d这类文件夹下的文件,我们只拿rc3.d举了这个例子,etc下还有类似的rc1.d、rc2.d等

    [root@learn-Linux001 ~]# ll /etc/rc3.d/
    total 0
    lrwxrwxrwx. 1 root root 16 Jan 30 16:25 K01smartd -> ../init.d/smartd
    lrwxrwxrwx. 1 root root 16 Jan 30 16:25 K10psacct -> ../init.d/psacct
    lrwxrwxrwx. 1 root root 19 Jan 30 16:24 K10saslauthd -> ../init.d/saslauthd
    lrwxrwxrwx. 1 root root 18 Jan 30 16:25 K15svnserve -> ../init.d/svnserve
    lrwxrwxrwx. 1 root root 18 Jan 30 16:25 K61nfs-rdma -> ../init.d/nfs-rdma
    lrwxrwxrwx. 1 root root 14 Jan 30 16:25 K74ntpd -> ../init.d/ntpd
    lrwxrwxrwx. 1 root root 17 Jan 30 16:24 K75ntpdate -> ../init.d/ntpdate
    lrwxrwxrwx. 1 root root 19 Jan 30 16:25 K75quota_nld -> ../init.d/quota_nld
    lrwxrwxrwx. 1 root root 21 Jan 30 16:23 K87restorecond -> ../init.d/restorecond
    lrwxrwxrwx. 1 root root 20 Jan 30 16:24 K89netconsole -> ../init.d/netconsole
    lrwxrwxrwx. 1 root root 15 Jan 30 16:23 K89rdisc -> ../init.d/rdisc
    ...
    ...

    这些都是软连接

    做一个开启和关闭防火墙的对比

    [root@learn-Linux001 ~]# chkconfig iptables on
    [root@learn-Linux001 ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx. 1 root root 18 Jan 30 22:29 S08iptables -> ../init.d/iptables
    [root@learn-Linux001 ~]# chkconfig iptables off
    [root@learn-Linux001 ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx. 1 root root 18 Jan 30 22:30 K92iptables -> ../init.d/iptables

    发现过滤出来的文件发生了变化,所以,可以猜想

    chkconfig iptables on  ===>/etc/rc3.d/  S08iptables -> ../init.d/iptables
    chkconfig iptables off  ===>/etc/rc3.d/  K92iptables -> ../init.d/iptables
    
    S----->start
    K----->kill
    
    验证:
    #0、首先防火墙是关闭的
    [root@learn-Linux001 ~]# chkconfig iptables off
    [root@learn-Linux001 ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx. 1 root root 18 Jan 30 22:30 K92iptables -> ../init.d/ipta
    #1、移除 K92iptables
    [root@learn-Linux001 ~]# mv /etc/rc3.d/K92iptables /tmp
    [root@learn-Linux001 ~]# ll /etc/rc3.d/ |grep ipt
    #2、创建S08iptables作为iptables的软连接
    [root@learn-Linux001 ~]# ln -s /etc/init.d/iptables /etc/rc3.d/S08iptables
    [root@learn-Linux001 ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx. 1 root root 20 Jan 30 22:41 S08iptables -> /etc/init.d/iptables
    #3、查看并验证
    [root@learn-Linux001 ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:off    3:on    4:off    5:off    6:off

    通过查看iptables文件的内容,可以看到# chkconfig: 2345 08 92
    08是开启顺序,92是关闭顺序

    用户分类(回顾)

    UID相当于身份证号,GID是用户组ID号,相当于户口本编号

    root用户

    UID:0    皇帝

    虚拟用户

    UID:1-499  傀儡,为了满足每个进程、软件需要一个用户和用户组,本身无法使用

    3大特点

    1、每个进程、软件需要一个用户和用户组

    2、傀儡用户不需要,也无法登陆系统

    3、用户的命令解释器/sbin/nologin

    非虚拟用户的命令解释器是/bin/bash

    普通用户

    UID:500+

    用户相关的配置文件

    /etc/passwd 用户的信息

    root:x:0:0:root:/root:/bin/bash
    pizza:x:500:500::/home/pizza:/bin/bash
    #第一列:用户名
    #第二列:x 代表密码,如果删除x。那么这个用户就没有密码了,随便进入
    #第三列:UID
    #第四列:GID
    #第五列:用户的说明信息
    #第六列:用户家目录 ~
    #第七列:用户使用的的命令解释器(shell)
    
    解释器种类
    /bin/bash         用户默认的解释器
    /sbin/nologin    虚拟用户
    /bin/sh             和/bin/bash差不多,用于解释脚本
    ...还有几个放在/etc/shells中
    [root@learn-Linux001 ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash       Ubuntu默认的
    /bin/tcsh        Unix   csh的升级版
    /bin/csh         Unix
    
    注意:不要随便切换用户的命令解释器

    /etc/shadpw 用户密码信息

    /etc/group 用户的 用户组信息

    /etc/gshadow 用户组密码信息

    /etc/default/useradd 添加用户的时候默认的信息

    与用户相关的目录

    /etc/skel

    新用户的家目录的模板

    [root@learn-Linux001 ~]# ls -la /etc/skel/
    total 20
    drwxr-xr-x.  2 root root 4096 Jan 30 16:19 .
    drwxr-xr-x. 78 root root 4096 Feb  1 10:14 ..
    -rw-r--r--.  1 root root   18 Mar 23  2017 .bash_logout   # 用户退出的时候运行里面的命令
    -rw-r--r--.  1 root root  176 Mar 23  2017 .bash_profile  # 相当于 /etc/profile
    -rw-r--r--.  1 root root  124 Mar 23  2017 .bashrc   # 相当于 /etc/bashrc
    
    # 

    新用户家目录是什么样子,就可以在这里修改!

    [root@learn-Linux001 ~]# echo 'my wechat is: DYbest-' >/etc/skel/readme.txt
    [root@learn-Linux001 ~]# ll /etc/skel/
    total 4
    -rw-r--r--. 1 root root 22 Feb  1 12:22 readme.txt
    [root@learn-Linux001 ~]# useradd Dao
    [root@learn-Linux001 ~]# ll /home/Dao/
    total 4
    -rw-r--r--. 1 Dao Dao 22 Feb  1 12:22 readme.txt
    [root@learn-Linux001 ~]# cat /home/Dao/readme.txt 
    my wechat is: DYbest-
    [root@learn-Linux001 ~]# ll /home/pizza/
    total 0

    登陆环境故障的原理和解决办法

    故障提示:

    -bash-4.1$

    -bash-4.1$

    模拟:

    [root@learn-Linux001 ~]# su - Dao
    [Dao@learn-Linux001 ~]$ 
    m -f .bash*   搞点破坏
    [Dao@learn-Linux001 ~]$ 
    [Dao@learn-Linux001 ~]$ logout      退出再进去,故障就出来了
    [root@learn-Linux001 ~]# su - Dao
    -bash-4.1$  
    -bash-4.1$ ls -la 查看一下用户家目录下的文件
    total 16
    drwx------. 2 Dao  Dao  4096 Feb  1 12:28 .
    drwxr-xr-x. 4 root root 4096 Feb  1 12:23 ..
    -rw-------. 1 Dao  Dao    22 Feb  1 12:28 .bash_history
    -rw-r--r--. 1 Dao  Dao    22 Feb  1 12:22 readme.txt
    -bash-4.1$
    正常情况下,用户目录下还有很多文件,但是现在没有了

    出现这种情况的原因:

    用户下的与环境变量相关的隐藏文件 被删除了

    -bash-4.1$ echo $PS1
    s-v$
    正常的是:
    [root@learn-Linux001 ~]# echo $PS1
    [u@h W]$

    如何解决:

    从其他地方复制这些文件

    #方法一:从/etc/skel 复制
    [root@learn-Linux001 ~]# su - Dao
    -bash-4.1$ cp /etc/skel/.bash* ~
    -bash-4.1$ logout 
    [root@learn-Linux001 ~]# su - Dao
    [Dao@learn-Linux001 ~]$ logout 
    [root@learn-Linux001 ~]# 
    
    #方法二:从其他用户家目录复制
    -bash-4.1$ cp /home/pizza/.bash* ~
    cp: cannot stat `/home/pizza/.bash*': Permission denied
    -bash-4.1$ 
    报错了,因没有权限,你可以解决吗?

    先想一下,在看如何解决

    -bash-4.1$ logout 
    [root@learn-Linux001 home]# cp /home/pizza/.bash* /home/Dao/
    [root@learn-Linux001 home]# su - Dao
    [Dao@learn-Linux001 ~]$ 
    
    #也许还有其他办法
    从别的家目录复制

    极度危险的命令.*(点星)

    .*表示的含义
    在正则中,就是所有
    在命令行中,以点开头的所有文件和目录
    有点参与表示的含义有以下几种:
    #1、以点开头的所有东西
    #2、当前目录
    #3、.. 当前目录的上一级目录
    #4、表示以点开头隐藏的文件或目录
    #5、.bash*
    
    所以,rm .* -fr   将摧毁一切,请慎重

    用户管理的命令

    用户相关命令

    useradd

    添加用户

    1.root 用户 linux皇帝
    2.普通用户  贫民百姓
    
    [root@oldboyedu-01 oldboy]# useradd   oldboy
    [root@oldboyedu-01 oldboy]# id  oldboy
    uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
    [root@oldboyedu-01 oldboy]# id lilaoshi
    id: lilaoshi: No such user
    [root@oldboyedu-01 oldboy]# passwd    oldboy
    Changing password for user oldboy.
    New password:
    BAD PASSWORD: it is too simplistic/systematic
    BAD PASSWORD: is too simple
    Retype new password:
    passwd: all authentication tokens updated successfully.
    
     #切换用户
    [root@oldboyedu-01 oldboy]# whoami
    root
    [root@oldboyedu-01 oldboy]# su  -  oldboy
    [oldboy@oldboyedu-01 ~]$ whoami
    oldboy
    
    
    #切换回root
    [oldboy@oldboyedu-01 ~]$ su - root
    Password:
    #退出当前用户 注销
    [oldboy@oldboyedu-01 ~]$ #ctrl + d
    [oldboy@oldboyedu-01 ~]$ logout
    -u  # 指定用户的uid
    -s   # 指定用户使用的shell
    -M   # 表示不创建家目录  一般常见虚拟用户使用
    -g    # 指定 用户属于的组(组的名字) 添加用户的时候 默认创建一个与用户名一样的家庭
    -c # 添加说明信息

    题目:添加一个用户xiaodao001 ,制定uid为888 禁止用户登录系统,不创建家目录

    [root@learn-Linux001 home]# useradd xiaodao001 -u 888 -s /sbin/nologin -M 
    [root@learn-Linux001 home]# grep xiaodao /etc/passwd
    xiaodao001:x:888:888::/home/xiaodao001:/sbin/nologin
    You have new mail in /var/spool/mail/root
    [root@learn-Linux001 home]# ll
    total 8
    drwx------. 2 Dao   Dao   4096 Feb  1 12:50 Dao
    drwx------. 2 pizza pizza 4096 Jan 30 23:14 pizza
    [root@learn-Linux001 home]# 
    View Code

    userdel

    删除用户

    #一般的删除用户的操作是:把这个用户在/etc/passwd中注释
    
    userdel默认不会删除用户的家目录和邮箱
    -r 连窝端  #删除与用户相关的所有信息(家目录)

    usermod

    修改用户信息,他的参数和useradd 是差不多的

    -s  #修改用户使用的shell
    -g  #修改属于的家庭 用户组的名字
    -G  #属于多个家庭
    -c   # 修改用户信息
    
    
    [root@learn-Linux001 home]# usermod -g root pizza
    [root@learn-Linux001 home]# id pizza
    uid=500(pizza) gid=0(root) groups=0(root)
    [root@learn-Linux001 home]# usermod -G root,pizza pizza
    [root@learn-Linux001 home]# id pizza
    uid=500(pizza) gid=0(root) groups=0(root),500(pizza)
    [root@learn-Linux001 home]# usermod -c 'a new user' pizza
    [root@learn-Linux001 home]# id pizza
    uid=500(pizza) gid=0(root) groups=0(root),500(pizza)
    [root@learn-Linux001 home]# grep pizza /etc/passwd
    pizza:x:500:0:a new user:/home/pizza:/bin/bash
    [root@learn-Linux001 home]# 

    passwd

    修改密码

    [root@learn-Linux001 home]# passwd pizza
    Changing password for user pizza.
    New password: 

    非交互式设置密码

    [root@learn-Linux001 home]# echo '123456' | passwd --stdin pizza
    Changing password for user pizza.
    passwd: all authentication tokens updated successfully.

    注:- -stdin 参数只能是root用户使用

    注:这里有一个漏洞:这样设置完密码之后,通过history就可以查看到我们设置的密码

    [root@learn-Linux001 home]# history |tail -5
       39  passwd pizza
       40  echo '123456' | passwd --stdin pizza   看到密码了
       41  history 
       42  history |tail -2
       43  history |tail -5
    [root@learn-Linux001 home]# history -c  通过此命令清除历史
    [root@learn-Linux001 home]# history 
        1  history 
    

    工作中如何设置密码

    #1、密码要复杂12位以上字母数字特殊字符
    
    #2、大的企业用户和密码统一管理(相当于活动目录(AD),openidap域)
    
    #3、动态密码:动态口令,第三方提供,自己开发也简单。
    
    # 如何保存密码:
    keepass  相当于自己弄了一个保险柜
    lastpass 相当于在别人那里租了一个保险柜,是一个在线软件

    keepass使用详解

    1、运维的软件一定要从官网下载,将两个文件都下好之后,开始安装使用

    https://keepass.info/download.html

    2、下载翻译包

    3、将两个文件同时解压

    4、将翻译包KeePass-1.36-Chinese_Simplified下的Chinese_Simplified.lng文件放到软件包KeePass-1.37Languages

    5、双击KeePass.exe使用

    点击不跟新

    6、进入主界面,选择view---change language,选择chinses

    重启后,进入中文界面

    7、文件---新建,创建一个‘’保险箱‘’

    8、保险箱创建好了,可以自定义创建密码类型,右键单击常规---创建子项目server,在server下创建密码记录

    创建记录

    点击使用生成随机密码

    如果不满意,可以一直点击生成,指导满意为止,点击接受---提交

    要使用的时候,复制密码,然后在命令行中使用

    9、密码记录创建好了之后,可以将这个保险箱保存在本地,下次使用时,需要输入保险箱密码

    10、这个软件还有很多功能,欢迎尝试探究,并分享出来

    如何让系统更安全

    怎么让系统更安全呢?

    1、最小化

    安装系统和软件都最小化安装

    运行的软件越少越好

    2、保护好root用户

    禁止root用户远程登录

    修改远程连接端口号22

    进行日志分析:failed 或者failure(/var/log/secure文件)

    3、控制文件系统权限

    给系统常用命令 +i

    给系统配置文件 +a

    4、给重要文件或者命令 做一个指纹

    文件内容的变化 ====> 指纹变化

    通过对比指纹,就可以知道文件内容有没有变化

    1、给文件创建指纹

    md5sum 文件

    2、如何快速对比指纹

    把你的指纹记录下来 md5sum 文件 > 放置指纹的文件(指纹库)

    进行对比  md5sum -c 文件

    3、使用定时任务+md5sum定时检查

    [root@learn-Linux001 pizza]# echo pizza.com > learn.txt
    [root@learn-Linux001 pizza]# md5sum /pizza/learn.txt 
    4c9168f0838663a132a2d09f19caecfc  /pizza/learn.txt
    [root@learn-Linux001 pizza]# md5sum /pizza/learn.txt 
    4c9168f0838663a132a2d09f19caecfc  /pizza/learn.txt    指纹没有变化
    #将文件指纹存在一个文件中
    [root@learn-Linux001 pizza]# md5sum /pizza/learn.txt  >police.log
    [root@learn-Linux001 pizza]# 
    #对比
    ## 没有改变时候,检查结果是OK
    [root@learn-Linux001 pizza]# md5sum -c police.log 
    /pizza/learn.txt: OK
    ## 加入新内容太后,检查结果是FAILED
    [root@learn-Linux001 pizza]# echo 'talk is cheap' >>learn.txt 
    [root@learn-Linux001 pizza]# md5sum -c police.log 
    /pizza/learn.txt: FAILED
    md5sum: WARNING: 1 of 1 computed checksum did NOT match
    [root@learn-Linux001 pizza]# # 文件内容已经变化了

    :我们平时在下载一些重要的文件的时候,网站会提供MD5值,下载完成后,我们用软件(notepad++中就有这个功能)生成MD5值之后,与官网给的值进行比较,如果是一样的,就说明这个软件包是完整的,或者没有被修改过的

    参考:http://lidao.blog.51cto.com/3388056/1910889

    题目:批量添加多用户,并设置随机密码

    批量添加10个用户stu01,stu02......stu10,并设置8位随机密码(禁止使用for,while等循环)

     先想一下吧......

    题目看似非常简单,实际上,对Linux基础命令要求非常高,不能使用shell循环就是为了考同学们的基础知识的。
    
    话不多说,言归正传,说实话如果单纯为了到达这道题的结果,只要基础命令好的同学,也很简单,我先说一下我看到题目的思路吧。
    
    1、用户名称的批量生成。
    
    2、随机密码生成的方法。
    
    3、因为要一条命令搞定,所以考虑构造一个命令,使之符合要求,最后交给bash执行。
    
    思路明确之后,那我们就开始着手做吧。
    
    <1> 用户名称的批量生成
    
    因为我们要生成类似如下的序列:
    
    stu01
    
    stu02
    
    stu03
    
    ......
    
    stu08
    
    stu09
    
    stu10
    
    法一:花括号展开{..}
    echo stu{01..10}
    
    stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
    
    因为我们需要的是竖行排列的,那怎么办呢?
    
    这里说明一下为什么非要竖行排列的,因为我们后面构造命令,是期望一行一行的执行,所以需要让它竖列排序的。
    
    那我们就想办法呀,看看有什么命令能搞定或者echo本身能不能搞定啊。
    
    于是我们又有了两个思路:
    
    ①通过echo本身可以打印出竖列的效果,但是此处似乎用不上啊。
    echo -e "stu01
    stu02"
    
    stu01
    
    stu02
    
    ②想办法把echo打印出来的序列中的空格替换成回车不就行了嘛,于是,我们想到了tr命令。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@oldboylinux ~]# echo -e stu{01..10}|tr " " "
    "
    stu01
    stu02
    stu03
    stu04
    stu05
    stu06
    stu07
    stu08
    stu09
    stu10
    
    法二:利用seq命令,seq本身就是干这活的呀,是不是,哈哈。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@oldboylinux ~]# seq 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    似乎不是我们想要的结果呀,我们想要的是
    
    01
    
    02
    
    ...
    
    09
    
    10
    
    那怎么办啊,想想老师的运维思路,你想要的结果,也许就是写程序的人想要的结果,也就是说很可能有类似参数可以用啊,结果一查帮助,果然,而且还有意外的收获。
    
    ①seq的"-w"参数,就是专门生成类似序列需求而生的。
    
    ②seq的"-f"参数,可以格式化输出序列,我去这不正是我们想要的效果嘛,赶紧试试看。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [root@oldboylinux ~]# seq -w 5
    1
    2
    3
    4
    5
    [root@oldboylinux ~]# seq -w 05
    01
    02
    03
    04
    05
    [root@oldboylinux ~]# seq -w 10
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    
    如果我们单纯只是用"-w"参数,那还需要配合其他命令才能达到我们想要的这样的效果。
    
    stu01
    
    stu02
    
    stu03
    
    ......
    
    比如:用sed替换
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    seq -w 10|sed 's#.*#stu&#g'
    
    stu01
    stu02
    stu03
    stu04
    stu05
    stu06
    stu07
    stu08
    stu09
    stu10
    
    但是我们"man seq"不是看到还有"-f"参数嘛,那还不赶紧试试看。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    seq -f "stu%02g" 10
    
    stu01
    stu02
    stu03
    stu04
    stu05
    stu06
    stu07
    stu08
    stu09
    stu10
    
    解释一下,后面引号里面的内容,这个是与C语言printf格式化输出类似,%号前面指定字符串,后面的02g中的2表示输出列宽为2列,0表示用0填充不足的部分,默认是用空格填充不足的部分,g是表示整数输出。
    
    好了,序列我们有了,下一个就是想办法生成8位随机密码了。
    
    <2> 8位随机密码的生成
    
    Linux系统下生成随机密码的方法有很多,我们最容易想到的就是$RANDOM,这是一个由系统自动维护的随机数。我们参考网络资料,简单介绍其中的四种方法供大家参考。
    
    
    ①通过时间获得随机数(date)
    
    这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。
    
    例子:
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [chengmo@centos5 shell]$ date +%s
    1287764773
    #获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
    #如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
    
    [chengmo@centos5 shell]$ date +%N
    738710457
    #获得当前时间的纳秒数据,精确到亿分之一秒。
    #这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
    
    [chengmo@centos5 shell]$ date +%s%N
    1287764807051101270
    #这个可以说比较完美了,加入了时间戳,又加上了纳秒
    
    通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/bin/sh
    
    #写个随机函数,调用方法random min max
    #在min 与 max直接获得随机整数
    #copyright chengmo QQ:8292669
    
    #获得随机数返回值,shell函数里算出随机数后,更新该值
    function random()
    {
    min=$1;
    max=$2-$1;
    num=$(date +%s+%N);
    ((retnum=num%max+min));
    #进行求余数运算即可
    echo $retnum;
    #这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
    #还有一种返回,定义全价变量,然后函数改下内容,外面读取
    }
    
    #得到1-10的seq数据项
    for i in {1..10};
    do
    out=$(random 2 10000);
    echo $i,"2-10000",$out;
    done;
    
    ②通过内部系统变量($RANDOM)
    
    其实,linux已经提供有个系统环境变量了,直接就是随机数,哈哈,觉得刚学习方法,是不是白费了!!
    
    1
    2
    3
    4
    5
    6
    [chengmo@centos5 shell]$ echo $RANDOM
    10918
    [chengmo@centos5 shell]$ echo $RANDOM
    10001
    
    #连续2次访问,结果不一样,这个数据是一个小于或等于5位的整数
    可能有疑问了,如果超过5位的随机数怎么得到呢?
    
    呵呵,加个固定10位整数,然后进行求余,跟例1 一样了。接下来的例子又是我们自立更生做了。
    
    ③通过系统内部唯一数据生成随机数(/dev/random,urandom)
    
    我们知道dev目录下面,是linux一些默认设备,它给我们感觉就是放的是键盘,硬盘,光驱等设备的对应文件了。 其实linux有些设备很特殊,有特殊用途。前面我们说到的:/dev/[udp|tcp]/host/port比较特殊吧。呵呵,有扯远了。
    
    /dev/random设备,存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据。我们可以通过文件读取方式,读得里面数据。/dev/urandom这个设备数据与random里面一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。
    
    得到整型数据,然后,类似一的方法就可以获得到随机数了。 题外话:在程序里面,我们经常md5得到唯一值,然后是字符串的,如果想表示成整型方式,可以通过crc函数.crc是循环冗余校验,相同数据通过运算,都会得到一串整型数据。现在这种验证应用很广。详细要了解,可以参考:crc.
    
    ④读取linux 的uuid码
    
    在提到这个之前,有个概念,就是什么是uuid呢?
    
    UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。
    
    UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码,都是互联网整个服务器网络中唯一的。它的原信息会加入硬件,时间,机器当前运行信息等等。
    
    UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。范例;550e8400-e29b-41d4-a716-446655440000 ,所以:UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。 也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
    
    其实,大家做数据库设计时候,肯定听说过,guid(全局唯一标识符)码,它其实是与uuid类似,由微软支持。 这里编码,基本有操作系统内核产生。大家记得把,在windows里面,无论数据库,还是其它软件,很容易得到这个uuid编码。
    
    linux 的uuid码
    
    linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。其实,random目录,里面还有很多其它文件,都与生成uuid有关系的。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
    dff68213-b700-4947-87b1-d9e640334196
    [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
    7b57209a-d285-4fd0-88b4-9d3162d2e1bc
    #连续2次读取,得到的uuid是不同的
    
    [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" "
    2141807556
    #同上方法得到随机整数
    我们用的是方法是第二种,然后结合md5sum,最后取出8位作为密码,因为这样获取的密码是字符加数字
    
    1
    2
    3
    4
    5
    6
    7
    8
    [root@oldboylinux ~]# echo $RANDOM|md5sum|cut -c 1-8
    d8c57fd6
    [root@oldboylinux ~]# echo $RANDOM|md5sum|cut -c 1-8
    b6e693b6
    [root@oldboylinux ~]# echo $RANDOM|md5sum|cut -c 1-8
    6dbb7cac
    [root@oldboylinux ~]# echo $RANDOM|md5sum|cut -c 1-8
    663bda06
    
    好了,到这里为止,我们前两步都有办法解决了,那就是最后一步了,把他们拼凑成我们想要的命令效果,然后交个bash执行就可以了。
    
    <3> 拼凑想要的语句效果提交给bash执行
    
    #seq -f "stu%02g" 10|sed -nr 's#(.*)#useradd 1;random=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$random"|passwd --stdin 1#gp'|bash -x &>useradd.txt
    
    好了,我们来分开解释一下每一部分的作用。
    
    ①seq -f "stu%02g" 10
    
    这一部分就是用于批量生成用户名;
    
    ②sed -nr 's#(.*)#useradd 1;random=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$random"|passwd --stdin 1#gp'
    
    这一段,就是用sed的替换功能来拼凑我们想要的命令结果,拼凑的结果类似于如下结果,
    
    1表示前面(.*)内匹配到的字符串;
    
    useadd stu01;random=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$random"|passwd --stdin stu01
    
    ③bash -x &>useradd.txt
    
    这一段,按道理说,只要有"bash"就可以了,结果肯定会执行了,但是我们想一下,是不是哪里还有点小问题啊,那就是我们自己创建的用户,密码是什么呢?你不会告诉我,你也不知道吧,哈哈,一开始我就是干的呀,后面想测试一下能不能用创建的用户登陆系统时,发现完蛋,不知道登录密码,所以想再交个bash执行前,把内容输出一份到文件,可是前面没有执行啊,哪里有密码呢,一度以为这条路是必定有瑕疵了,后来又转念一想,bash不是有调试参数嘛,OK,那就试试,结果很不错,可是又无法追加到文件,奇怪呀,原来调试信息是当错误信息来处理的呀,那就来个绝的,管你是标准输出还是错误输出都给我到指定文件去,这下就OK了, 完美。
    
    你是不是以为到这里就结束了,哼,才不会呢!继续往下看哦,更多精彩还在后面呢。。。
    
    拼凑方法大总结:
    
    ①sed替换大法,即sed 's#要替换的内容#替换后的内容#g',例子见上面和最后面的案例。
    
    ②awk拼凑大法,例子如下:
    
    #echo -e "$(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)"|awk '{print "echo "$1"|""passwd --stdin stu0"NR}'|awk '{print "useradd " $NF";"$0}'|tee useradd.txt|bash
    
    1、echo -e "$(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)
    $(echo $RANDOM|md5sum|cut -c 1-8)"
    
    这一大段,看着好吓人啊,其实就是一个目的重复10次,你分开看就是这样的
    
    【$(echo $RANDOM|md5sum|cut -c 1-8)
    】就是用来生成8位随机密码,重复10次,还记得最开始的echo -e参数换行大法嘛,没错,这里就用上了。
    
    2、awk '{print "echo "$1"|""passwd --stdin stu0"NR}'|awk '{print "useradd " $NF";"$0}'
    
    这一行就是用来拼凑我们想要实现的效果语句,具体类似如下:
    
    useradd stu01;echo 1b487225|passwd --stdin stu01
    
    3、tee useradd.txt
    
    这一行就是为了保存生成密码和用户名到文件useradd.txt
    
    4、bash
    
    把上面拼凑的语句交给bash,执行。
    
    其他拼凑方法参考:
    
    基本上都是类似上述思路,只是实现方法有所不同罢了,各位自己斟酌吧,这些都搞定,说明我们的Linux基础就真OK了,重点关注一下加红的部分的实现思路。
    
    ①#echo a2stu{01..02}|xargs -n1|awk '{print"useradd "$0" && mkpasswd -l 8 >>/tmp/mima.txt;tail -1 /tmp/mima.txt|passwd --stdin "$0}'|bash
    #echo stu{01..10} | sed "s# #
    #g" | awk '{print "useradd " $1 " -p " "echo $[RANDOM**3]|cut -c 1-8"}'|bash
    #echo stu{01..10} | sed "s# #
    #g" | awk '{cmd="echo $[RANDOM3]|cut -c 1-8";print "useradd " $1 " -p " "`echo $[RANDOM3]|cut -c 1-8`"}' |bash
    
    ④echo stu{1..10}|xargs -n 1|awk '{print "useradd", $1,"&& " "echo date +%N|cut -c 1-8 |" "passwd --stdin",$1 }'|bash
    
    ⑤# echo stu{01..10}|xargs -n 1|sed -n 's#.*#useradd & && echo date +s%|cut -c 1-8|passwd --stdin & #gp'|bash
    #echo stu{1..10}|xargs -n 1|awk '{print "useradd", $1,"&& " "echo date +%N|cut -c 1-8 |" "passwd --stdin",$1 }'|bash
    #echo stu{01..10}|xargs -n1 useradd && echo stu{01..10}:date +%N|cut -c1-8|xargs -n1|tee -a pass.txt|chpasswd
    #echo user{01..10} | xargs -n1| sed -n 's/.*/useradd &
     echo &|md5sum|cut -c 1-8|passwd --stdin &/p'|bash
    #echo stu{01..10}|tr " " "
    "|sed -r 's#(.*)#useradd 1;pass=echo $((RANDOM+123456))|md5sum|cut -c 2-9;echo $pass|passwd --stdin 1;echo "1 echo $pass" >>/tmp/b.log#g'|bash
    #echo stu{01..10}|xargs -n1|sed -nr 's#^(.*)$#useradd 1;echo $(date +%T)|md5sum|cut -c 1-8 >/root/1.txt;cat /root/1.txt|passwd --stdin 1#gp' >>/root/useradd.txt 2>&1
    
    #echo stu{01..10}:$(date +%N)|sed 's# #
    #g' >/mnt/pass;awk -F ":" '{print $1}' /mnt/pass |xargs -n 1 useradd;pwunconv;chpasswd </mnt/pass;pwconv
    
    #echo stu{01..10}|tr " " "
    "|sed -r 's#(.*)#useradd 1;lc=$((RANDOM+10000000)); echo "$lc"|passwd --stdin 1#g'|bash
    
    #echo stu{01..10}:$(cut -c 1-8 <<< $(md5sum <<< $RANDOM))|xargs -n1|tee useradd.txt|awk -F ':' '{print "useradd "$1 " && echo " $2 "|passwd --stdin " $1}'|bash
    
    #echo stu{01..10} |tr ' ' '
    '|sed -rn 's@^(.*)$@useradd 1 ; echo $RANDOM|md5sum|cut -c 1-8 >/data/1;cat /data/1|passwd --stdin 1@gp'|bash
    
    #$echo stu{01..10}c$[$RANDOM**3] | sed 's# #
    #g' | cut -c 1-14 | awk -F'c' '{print"useradd " $1" && echo "$2" | passwd --stdin "$1}' | bash
    
    #echo stu{1..10}|xargs -n1 useradd ;echo stu{1..10}:cat /dev/urandom|tr -dc 0-9|fold -w8|head -1|xargs -n1|tee -a pass.txt|chpasswd
    View Code

    chown命令

    修改文件或目录所有者和属于的用户组

    -R 递归修改文件或者目录的所有者和用户组,危险的命令,没有提示

    chown  pizza  learnLinux.txt   # 只修改文件的所有者
    
    chown  pizza.pizza learnLinux.txt  # 修改了文件的所有者和所属组

    用户组相关命令

    groupadd

    创建用户组

    -g 指定用户组的gid数字

    题目:添加一个虚拟用户mysql,指定用户的uid、gid都是999

    [root@learn-Linux001 ~]# useradd -s /sbin/nologin -M -u 999 mysql
    [root@learn-Linux001 ~]# id mysql
    uid=999(mysql) gid=999(mysql) groups=999(mysql)

    -u 指定了uid和gid
    官方写法
    [root@learn-Linux001 ~]# groupadd -g 999 mysql
    [root@learn-Linux001 ~]# useradd -s /sbin/nologin -M -u 999 -g mysql mysql

    查询用户信息命令

    id  # 查看用户信息。查看用户是否存在,查看用户uid、gid,查看用户属于哪个组
    /etc/group  # 某个用户组下面有什么用户?(没有命令,就在这个文件中查看)
    w   # 显示系统中已经远程登录的用户
    last  # 哪个用户在什么时候 从哪里 运城登陆你的系统 用户登录的信息
    lastlog  # 显示linux中所有用户最近一次远程登录的信息 

    w详细介绍  (系统负载信息1分钟,5分钟,15分钟)

    查看系统性能的命令

    #1、w
    [root@learn-Linux001 ~]# w
     11:12:50 up 39 min,  1 user,  load average: 0.25, 0.15, 0.05
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    10.0.0.1         10:58    0.00s  0.26s  0.09s w
    #2、uptime
    [root@learn-Linux001 ~]# uptime
     11:28:27 up 55 min,  1 user,  load average: 0.00, 0.00, 0.00
    
    #3、top,交互式,相当于uptime+free -h+ps -ef三个命令
    [root@learn-Linux001 ~]# top
    top - 11:23:18 up 50 min,  1 user,  load average: 0.00, 0.01, 0.00   #和w的第一行一样
    Tasks:  90 total,   1 running,  89 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
    Mem:   1894988k total,   256244k used,  1638744k free,    48392k buffers
    Swap:   786428k total,        0k used,   786428k free,    55980k cached
    # 默认按照CPU排序,按M就按照内存排序。按P回到以cpu排序
       PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
      2072 root      20   0 15036 1220  948 R  0.3  0.1   0:00.25 top                      
         1 root      20   0 19356 1560 1236 S  0.0  0.1   0:01.76 init                     
         2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                 
         3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0              
         4 root      20   0     0    0    0 S  0.0  0.0   0:00.05 ksoftirqd/0  
    ...
    以下三个命令需要安装
    #4、htop 增强版的top命令
    #5、iotop 显示系统中每个进程使用的磁盘IO
    #6、iftop 显示系统网络流量

    Linux尚方宝剑

     /var/log/secure 和  /var/log/messages 这样的文件,普通用户是无法查看的

    [root@learn-Linux001 ~]# ll /var/log/secure
    -rw-------. 1 root root 0 Feb  3 11:11 /var/log/secure  # 权限是600

    当开发人员需要查看内容的时候,我们也不能给文间修改权限,因为修改之后所有人都能看了~!还有一个办法就是suid(运行某个命令的时候相当于命令的所有者),但是这个命令的权限太大了。

    怎么做才是安全的呢?

    SUDO 临时让用户获得root权限

    su 和su - 的区别:

    - 是su的一个参数,表示切换用户的时候更新环境变量

    尚方宝剑是什么?

    开发人员,其他人员,想临时使用 看系统日志、删除软件日志、认识添加用户

    普通用户想临时成为皇帝

    sudo -l 查看当前用户的尚方宝剑

    [pizza@learn-Linux001 ~]$ sudo -l
    
    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 pizza:
    Sorry, user pizza may not run sudo on learn-Linux001.

    怎么使用呢?

    visudo 给用户授予尚方宝剑

    pizza  ALL(ALL)  /bin/ls,/bin/touch   添加的格式

    [pizza@learn-Linux001 ~]$ sudo -l
    [sudo] password for pizza: 
    Matching Defaults entries for pizza on this host:
        !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE
        INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS
        LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
        env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
        env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
        secure_path=/sbin:/bin:/usr/sbin:/usr/bin
    
    User pizza may run the following commands on this host:
        (ALL) /bin/ls, (ALL) /bin/touch
    [pizza@learn-Linux001 ~]$ 

    在使用命令的时候,加上sudo(带上尚方宝剑)就能生效了

    [pizza@learn-Linux001 ~]$ ls /root/
    ls: cannot open directory /root/: Permission denied  没有权限
    [pizza@learn-Linux001 ~]$ sudo ls /root  有权限了
    [sudo] password for pizza: 
    learn.txt
    [pizza@learn-Linux001 ~]$ 
    visudo ======相当于在编辑 vim /etc/sudoers 
    而且还有一个简单的语法检查功能
    在visudo执行完了之后,相当于还执行visudo -c
    [root@learn-Linux001 ~]# visudo -c
    /etc/sudoers: parsed OK
    如果你要手动编辑文件,完成之后要运行一下visudo -c
    
    crontab -e(root) ====== vi /var/log/spool/cron/root 语法检查功能
    
    ##授权某个目录下的所有命令
    pizza   ALL=(ALL)       /bin/*
    但是这样有一个坑,就是可以执行sudo - root 而不需要密码
    [pizza@learn-Linux001 ~]$ su - root  执行切换,不行
    Password: 
    su: incorrect password
    带上sudo 就切过去了,因为/bin目录下有su
    [pizza@learn-Linux001 ~]$ sudo su - 
    [root@learn-Linux001 ~]# 
    
    ##授权某个目录下的所有命令 ,并排除su
    pizza   ALL=(ALL)       /bin/*,!/bin/su
    [pizza@learn-Linux001 ~]$ sudo su -
    Sorry, user pizza is not allowed to execute '/bin/su -' as root on learn-Linux001.
    ##但是还有rm vi可以使用!!!!用vi后用户自己就可以修改成ALL所以,我们在授权时,一定要指定到具体的命令,需要什么,给什么
    
    ## 不用输入密码 (只给自己用,不要给别人)
    pizza   ALL=(ALL)       NOPASSWD: ALL
    
    ###root用户是禁止远程登陆的,我们可以使用普通用户,赋予权限,然后通过 sudo su - 直接变成root

    pizza                              ALL=(ALL)                                         NOPASSWD: ALL

    用户名(用户组名)         可以在哪一台主机=(可以以什么身份)

    行为审计-跳板机

    用于管理多台服务器,方便运维人员查看和管理,不用去每台服务器单独查看和管理

    所有用户的所有操作,都通过跳板机/堡垒机,执行到服务器

    记录用户的操作  行为/日志审计

    回放用户操作

    常用的几种:

    1、堡垒机:商业产品

    2、gateone web 跳板机

    3、python开发的开源的跳板机(Jumpserver、crazyEYE)

    4、shell跳板机

    总结:

  • 相关阅读:
    小程序开发学习记录(一)
    解决移动端touch事件与click冲突的问题
    解决node.js使用fs读取文件出错
    防抖和节流
    promise
    ES6新的特性有哪些?
    css盒模型
    CSS3有哪些新特性?
    ES6新增的数据类型Map和Set。
    js求两个数组的交集|并集|差集|去重
  • 原文地址:https://www.cnblogs.com/bubu99/p/12297229.html
Copyright © 2020-2023  润新知