如何让一个脚本开机自启动
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
添加用户
-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]#
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
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、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跳板机