zoukankan      html  css  js  c++  java
  • 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跳板机

    总结:

  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/bubu99/p/12297229.html
Copyright © 2011-2022 走看看