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跳板机

总结:

原文地址:https://www.cnblogs.com/bubu99/p/12297229.html