首页 > 系统服务 > 详细

Linux系统初识

时间:2020-02-07 12:10:37      阅读:180      评论:0      收藏:0      [点我收藏+]

一、远程连接排错

1.查看道路是否通畅

ip地址是什么:就是我们要找的服务器在哪里

公网IP地址:全世界的任何地方都能访问到

私网IP地址:也指内网,私有环境,只在当前环境中。比如:192.168.0.??? 或者 10.0.0.???

端口:用于连接不同的服务,常见端口SSHD-22(工作中必须要改,否则全世界的人都会连你)

桥接的三种模式:

NAT(皇帝-宰相-贫民)、桥接(皇帝-贫民)、仅主机模式(皇帝-贫民(无法连接外网))

如果连不上我们要查看什么?

路不通的原因

1、网卡是否运行且IP是否正确(主机IP是否和远程连接用的IP一样)

ifconfig eth0

2、DNS是否配置

cat /etc/sysconfig/network-scripts/ifcfg-eth0  查看网卡的配置是否配置DNS

cat /etc/resolv.conf 查看DNS中是否配置DNS

网卡的配置是优先于DNS中的

3、软件连接的配置

检查vm软件是否设置正确:
#1).vmware服务是否允许
win+r
services.msc
#2).vmware网络配置---编辑---虚拟网络编辑器

子网IP是否设置为10.0.0.0

4、计算机中的网络连接

VMware Network Adapter VMnet8配置的ip(静态,不要更改)和共享(不能打钩)
空格和tab键

ping 服务器ip地址
ping 10.0.0.200
 
注:重新配置后,需要重启

2.是否有人打劫

SElinux和Iptables

3.查看是否提供服务

查看系统是否开启ssh进程:ps -ef |grep sshd

查看系统中开启了哪些端口:ss -lntup

不建议使用的命令,当高并发时,服务器连接多容易卡死(古老的命令):netstat -lntup |grep 22

查看端口是不是开启了:telnet

telnet 服务器ip地址 22
 [e:\~]$ telnet 10.0.0.200 22

4、Linux常用工具

[root@Dao ~]# yum install tree telnet nc nmap lrzsz dos2unix -y

telnet、nc、nmap查看端口是否开启

nc和telnet的用法是一样的
[root@Dao ~]# nc 10.0.0.200 22
^C
[root@Dao ~]# telnet 10.0.0.200 22
nmap的用法复杂一点
[root@Dao ~]# nmap -p22 10.0.0.200

lrzsz:windows与linux互传文件

[root@Dao ~]# rz    上传
[root@Dao ~]# sz /etc/hosts   下载

安装完这个软件后,上传的时候可以直接拖进去

dos2Linux,以后shell编程中讲解

二、关闭 SElinux

SELinux 主要由美国国家安全局开发

SElinux是限制root用户的权限的软件

临时关闭-重启服务器失效

[root@oldboyedu-01 ~]# #查询selinux状态
[root@oldboyedu-01 ~]# getenforce 
Enforcing

# 共3种状态

[root@oldboyedu-01 ~]# #enforcing   selinux正在运行
[root@oldboyedu-01 ~]# #permissive  selinux临时关闭 还是提示警告
[root@oldboyedu-01 ~]# #disabled    selinux彻底关闭

#临时关闭

[root@oldboyedu-01 ~]# setenforce
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@oldboyedu-01 ~]# setenforce 0
[root@oldboyedu-01 ~]# getenforce 
Permissive
[root@oldboyedu-01 ~]# 重启服务器,又会开启

永久关闭-重启服务器生效

需要使用vim修改/etc/selinux/config中的文件内容

[root@oldboyedu-01 ~]# vim /etc/selinux/config

# 然后查看

[root@oldboyedu-01 ~]# grep "=disabled" /etc/selinux/config 
SELINUX=disabled
[root@oldboyedu-01 ~]# grep "disabled" /etc/selinux/config 
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

三、关闭Iptables

临时关闭

# 查询防火墙是否在运行 
/etc/init.d/iptables  status
[root@oldboyedu-01 ~]# /etc/init.d/iptables  stop  临时关闭iptables
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@oldboyedu-01 ~]# /etc/init.d/iptables  stop
[root@oldboyedu-01 ~]# /etc/init.d/iptables  status 
iptables: Firewall is not running.

永久关闭

临时关闭后,开机还会自动启动
#如何让iptables在开机的时候 不自动启动
命令:chkconfig 
# 数字3 的状态是on 就表示开机启动 [root@oldboyedu
-01 ~]# chkconfig |grep ipt 检查iptables 是否开机启动 iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@oldboyedu-01 ~]# chkconfig iptables off 关闭iptables的开机自启动 [root@oldboyedu-01 ~]# chkconfig |grep ipt iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

四、显示中文乱码的排查

1.什么是字符集?
######表示字符 文字的方法
UTF-8      万国码 系统默认的字符集
GBK GB2312 
2.如何查看系统的字符集
[root@oldboyedu-01 ~]# echo $LANG
en_US.UTF-8
[root@oldboyedu-01 ~]# #语言.字符集
3.如何修改字符集-临时
[root@oldboyedu-01 ~]# export   LANG=zh_CN.UTF-8
[root@oldboyedu-01 ~]# echo $LANG
zh_CN.UTF-8
4.如何修改字符集-永久
[root@oldboyedu-01 ~]# cat /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
5.生效 
[root@oldboyedu-01 ~]# source  /etc/sysconfig/i18n 
[root@oldboyedu-01 ~]# echo $LANG
en_US.UTF-8

乱码之后如何排查

#####1.查看中文乱码的原因******
####1)linux使用的字符集  echo $LANG
####2)远程连接工具使用的字符集 即Xshell中的(单击小地球就会显示,或者在文件-属性-终端中(最下面)会有显示)
####1) 与 2) 不同 就会导致乱码 

#####2.排查 ####1)linux使用的字符集 ####2)远程连接工具使用的字符集

#####3.解决 ####方法1 修改远程连接工具字符集 ####方法2 修改linux系统的字符集

####1.如何修改字符集-临时 ####2.如何修改字符集-永久 ####3.生效

五、查看系统版本

[root@luffy-01 /]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@luffy-01 /]# uname -m
x86_64
[root@luffy-01 /]# uname -r
2.6.32-696.el6.x86_64
[root@luffy-01 /]# uname -a
Linux luffy-01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

一般不使用 -a ,因为信息太长,不需要看这么多

六、Linux核心目录简介

技术分享图片

1./bin - 重要的二进制 (binary) 应用程序


包含二进制文件,系统的所有用户使用的命令都在这个目录下。

2./boot - 启动 (boot) 配置文件


包含引导加载程序相关的文件,系统引导程序+系统的内核

3./dev - 设备 (device) 文件


包含设备文件,包括终端设备,USB或连接到系统的任何设备。

4./etc - 配置文件、启动脚本等 (etc)

包含所有程序所需的配置文件,也包含了用于启动/停止单个程序的启动和关闭shell脚本。

5./home - 本地用户主 (home) 目录

所有用户用home目录来存储他们的个人档案

6./lib - 系统库 (libraries) 文件

包含支持位于/bin和/sbin下的二进制文件的库文件。

7./lost+found - 在根 (/) 目录下提供一个遗失+查找(lost+found) 系统

必须在root用户下才可以查看当前目录下的内容。

8./media - 挂载可移动介质 (media),诸如 CD、数码相机等

用于挂载可移动设备的临时目录

9./mnt - 挂载 (mounted) 文件系统

临时安装目录,系统管理员可以挂载文件系统

10./opt - 提供一个供可选的 (optional) 应用程序安装目录

包含从各个厂商的附加应用程序,附加的应用程序应该安装在/opt或者/opt的子目录下。

11./proc - 特殊的动态目录,用以维护系统信息和状态,包括当前运行中进程 (processes) 信息。

包含系统进程的相关信息,是一个虚拟的文件系统,包含有关正在运行的进程的信息,系统资源以文本信息形式存在。

为了解决一切皆文件

12./root - root (root) 用户主文件夹,读作“slash-root”

 

13./sbin - 重要的系统二进制 (system binaries) 文件

也是包含的二进制可执行文件。在这个目录下的linux命令通常都是由系统管理员使用的,对系统进行维护。

14./sys - 系统 (system) 文件

虚拟的目录

15./tmp - 临时(temporary)文件

包含系统和用户创建的临时文件。当系统重启时,这个目录下的文件将都被删除

16./usr - 包含绝大部分所有用户(users)都能访问的应用程序和文件

包含二进制文件,库文件。文档和二级程序的源代码

17./var - 经常变化的(variable)文件,诸如日志或数据库等

代表变量文件。在这个目录下可以找到内容可能增长的文件

七、etc目录

技术分享图片

1、网卡的配置文件

setup命令的本质就是修改这个文件

--/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0                                ###网卡的名字
HWADDR=00:0c:29:1e:67:61                   #@@hardware address硬件地址 MAC地址
TYPE=Ethernet                              ###互联网  
UUID=3405d22b-1aab-45a5-b57f-c0d005e4f269  ###UUID 系统中唯一的标识
ONBOOT=yes                                 #@@booton 在重启的时候是否开启网卡(自动运行)
NM_CONTROLLED=yes                          ###是否能被network软件进行管理
BOOTPROTO=none                             #@@网卡获取ip地址的方式
#none/static ip地址是固定的,服务器的IP如果是动态的,可就乱了
#dhcp        自动获取ip地址
IPADDR=10.0.0.200                          #@@ ip address ip地址
NETMASK=255.255.255.0                      ### 子网掩码 局域网内最多能有多少机器
GATEWAY=10.0.0.2                           #@@ 网关 默认的出口
USERCTL=no                                 ### 是否准许普通用户管理网卡 开 关 重启
PEERDNS=yes                                ### 网卡的配置优先于DNS
DNS1=223.5.5.5                             #@@
DNS2=223.6.6.6                             #@@

2、DNS域名解析系统

把使用的域名转换为ip地址

常见的DNS服务器

###阿里云的DNS
#223.5.5.5
#223.6.6.6

###114
#114.114.114.114
#114.114.115.115

###谷歌
#8.8.8.8

常见的DNS有关的错误

ERROR 6 - "Couldn‘t resolve host ‘mirrorlist.centos.org‘"
错误       无法     解析    域名  mirrorlist.centos.org

[root@oldboyedu-01 ~]# yum  install  tree
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock error was
14: PYCURL ERROR 6 - "Couldn‘t resolve host ‘mirrorlist.centos.org‘"
Error: Cannot find a valid baseurl for repo: base


ERROR 6 - "Couldn‘t resolve host ‘mirrorlist.centos.org‘"
错误       无法     解析    域名  mirrorlist.centos.org
           无法解析域名##linux无法上网
1.ping www.baidu.com   #是否能上网

2.ping 223.5.5.5       #DNS是否有问题

[root@oldboyedu-01 ~]# ping www.baidu.com
ping: unknown host www.baidu.com
      未知的   域名
[root@oldboyedu-01 ~]# ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=128 time=50.7 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=128 time=50.4 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=128 time=49.9 ms
64 bytes from 223.5.5.5: icmp_seq=4 ttl=128 time=49.8 ms
64 bytes from 223.5.5.5: icmp_seq=5 ttl=128 time=50.3 ms
^C
--- 223.5.5.5 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4810ms
rtt min/avg/max/mdev = 49.840/50.257/50.744/0.416 ms
[root@oldboyedu-01 ~]# #1.有问题
[root@oldboyedu-01 ~]# #2.ping通畅
[root@oldboyedu-01 ~]# #DNS有问题


##如何修改DNS
####1.在网卡配置文件中添加上
DNS1=223.5.5.5
DNS2=223.6.6.6

[root@oldboyedu-01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0c:29:1e:67:61
TYPE=Ethernet
UUID=3405d22b-1aab-45a5-b57f-c0d005e4f269
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=10.0.0.200
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
USERCTL=no
PEERDNS=yes
IPV6INIT=no
DNS1=223.5.5.5
DNS2=223.6.6.6

###2.网卡的配置生效-重启网卡

#####重启某一个网卡
ifdown eth0 && ifup eth0

#####重启所有网卡
/etc/init.d/network restart

网卡配置小结:
1.屌丝逃离洗浴中心之路
2.如何修改DNS
3.IPADDR,GATEWAY,ONBOOT,BOOTPROTO,DNS1,DNS2

配置DNS

--/etc/resolv.conf

##网卡配置文件里面的DNS优先于 /etc/resolv.conf
##配置DNS都在网卡里面配置

3、修改主机名

--/etc/sysconfig/network
#######第一个里程碑-查看当前的主机名
[root@oldboyedu-01 ~]# hostname
oldboyedu-01


#######第二个里程碑-临时修改主机名-重启服务器之后失效
[root@oldboyedu-01 ~]# hostname oldboyedu01-nb
[root@oldboyedu-01 ~]# hostname
oldboyedu01-nb


#######第三个里程碑-永久修改主机名-重启服务器之后生效
[root@oldboyedu01-nb ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=oldboyedu01-nb

 #######最后一步:让主机名能解析(ping主机名可以畅通)

[root@Dao ~]# ping $(hostname)

vim /etc/hosts

添加10.0.0.200  Linux_dao(你的hostname)

新学一个快捷键:esc + .  使用上一个命令的最后一个

4、HOST文件

--/etc/hosts 

ip地址与域名解析关系  对主机名进行解析

作用:
在网站需要更新之前,把地址配置到本地的虚拟环境中,而不是真实的


##上线之前需要进行测试-www.jd.com www.baidu.com  www.oldboyedu.com
##真实访问的时候 www.baidu.com ---->通过ping 得到 119.75.216.20
###在测试的时候 下单---www.jd.com www.baidu.com 这就成了真的下单,东西过几天就送到了你的手上
####想办法把 www.jd.com www.baidu.com 解析到 10.0.0.200(测试机器)

 

在文件中添加设置
10.0.0.200  www.baidu.com www.jd.com 
##进行测试

 

win中的host文件
/etc/hosts
C:\Windows\System32\drivers\etc\hosts

5、开机的时候自动挂载的文件

--/etc/fstab       开机的时候给每个磁盘分区开一个入口


#第一列 --表示设备/分区
#第二列 --表示入口/目录/挂载点

df -h 查看系统磁盘的大小和使用情况

blkid 查看 设备详细列表

6、开机的时候自动运行的文件

--/etc/rc.local    需要开机自启动的软件/命令/服务放在这个文件中
Startup
如何让一个软件/脚本/服务开机自动运行?
1./etc/rc.local                 # 服务器运行软件的清单
2.通过chkconfig管理      # 开机自启动

7、开机的时候运行级别的配置文件

--/etc/inittab 
#init tab(table)


######       1.linux运行级别讲解
0     关机状态,不要把运行级别设置为0
1     单用户模式 root用户密码忘记了
2     多用户模式,但是没有NFS
3     完全的多用户模式,命令模式,文本模式
4     未使用
5     X11,桌面模式,图形化界面模式
6     重启状态,不要把运行级别设置为6
######     2.如何查看当前运行级别
[root@oldboyedu01-nb ~]# runlevel
N 3
[root@oldboyedu01-nb ~]# #                  N                                            3
[root@oldboyedu01-nb ~]# #上一次使用的运行级别     当前系统的运行级别
######     3.如何切换运行级别-临时
[root@oldboyedu01-nb ~]# #上一次使用的运行级别     当前系统的运行级别
[root@oldboyedu01-nb ~]# init 5
[root@oldboyedu01-nb ~]# runlevel
3 5
######     4.如何永久修改运行级别-重启生效
[root@oldboyedu01-nb ~]# tail -1 /etc/inittab
id:3:initdefault:


小结:
1.0-6含义
2.如何查看
3.如何修改 临时 永久

8、服务管理的命令

Linux放置命令的地方有哪些?

--/etc/init.d/

9、系统环境变量 别名

--/etc/profile


#PS1 PATH
#LANG==>/etc/sysconfig/i18n  单独放置

10、别名

--/etc/bashrc  正统存放别名的地方

######国法(全国各地生效)
/etc/profile     系统环境变量 别名   √√√√√---常用
/etc/bashrc      别名


######家规(地方政策 当前用户生效)
~/.bashrc       
~/.bash_profile

~ 表示当前用户的家目录
root   ~ ===== /root
oldboy ~ ===== /home/oldboy

11、编译安装的软件默认的位置

/usr/local


C:\Program Files ---------windows安装软件默认的位置


Linux下面安装软件安装的3种方法
1.yum   (自动解决安装依赖的软件)  点外卖-你缺少什么外面给你解决
yum   install  tree

yum   install  tree   -y

2.rpm    (缺啥少啥自己解决)         速冻水饺-半成品-缺少的东西自己解决

3.编译安装                              自己做饭
  买菜切菜---------炒菜-----上菜
  ./configure-------make----make install
[root@oldboyedu01-nb ~]# ##查看软件是否安装成功
[root@oldboyedu01-nb ~]# rpm -qa |grep tree
tree-1.5.3-3.el6.x86_64

/usr/share   另一个安装软件的地方,主要是系统文档,了解一下

12、系统日志

系统默认日志信息

#######/var/log/messages

系统用户的登录信息
#######/var/log/secure   (谁 什么时候 从哪里登录的 是否成功)

grep   “Failed Password”  /var/log/secure  从登陆信息日志中获取是否有人在尝试破解密码

13、虚拟目录proc

--/proc/meminfo    内存信息


[root@oldboyedu01-nb ~]# free
             total       used       free     shared    buffers     cached
Mem:       3908500     386300    3522200        236      39192     165944
-/+ buffers/cache:     181164    3727336
Swap:       786428          0     786428
[root@oldboyedu01-nb ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          3.7G       377M       3.4G       236K        38M       162M
-/+ buffers/cache:       176M       3.6G
Swap:         767M         0B       767M


--/proc/cpuinfo 查看cpu信息

 

lscpu    显示CPU信息


--/proc/loadavg 系统的负载


负载:系统的繁忙程度
最近1分钟 最近5分钟 最近15分钟 平均负载
[root@oldboyedu01-nb ~]# w
22:20:05 up 12:18,  4 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         19:16    2:08m  0.18s  0.18s -bash
root     pts/1    10.0.0.1         11:03    3:02m  0.06s  0.06s -bash
root     pts/2    10.0.0.1         20:32    1.00s  0.18s  0.07s w
root     pts/4    10.0.0.1         20:18    2:01m  0.03s  0.03s -bash
#系统的负载接近系统cpu的核心数量   表示cpu越忙


--/proc/mounts 显示系统挂载信息


df –h        查看磁盘空间的使用情况,人类可读
findmnt  相似于   cat /proc/mounts

八、Linux分区的几种方案

通用方法
/boot 引导分区 200M
swap 交换分区 内存的1.5倍(内存小于8G) 大于8G 给8G
/ 根分区 剩下多少给多少

数据非常重要
/boot
swap
/ 50-200G
/data 剩下多少给多少

不知道数据是否重要
/boot
swap
/ 50-200G
剩余的空间 不分配留着.

九、Linux之文件属性

文件属性是什么?

[root@luffy_boy-001 /]# ls -lhi /etc/hosts
129822 -rw-r--r--. 2 root root 198 Jan 11  2019 /etc/hosts

文件属性就是 ls  -lhi 命令输出结果每一列的含义

l   list one file per line
i   --inode   print the index number of each file
h  --human-readable       with -l, print sizes in human readable format
                               (e.g., 1K 234M 2G)
129822      # inode号码
-           # 文件类型
rw-r--r--.  # 文件的权限.(.与selinux有关)
2           # 文件硬链接数量
root        # 主人
root        # 家人
198         # 文件大小
Jan  11 2019    # 最后修改时间
/etc/hosts      # 文件名不是文件的属性

inod和block简介

我们从获得一个硬盘,到可以向硬盘中存放数据,都经历了哪些阶段?

做一个比喻,把硬盘比作房子的话。

有房子----------------->买了个硬盘

划分隔断-------------->分区

装修-不同风格-------->格式化创建文件系统

安装门窗--------------->挂载

住人--------------------->存数据

inode

1、inode的含义

用来存放文件属性的空间

我们通过iNode号码来找到这个空间

inode号码----家庭住址
inode空间----家

文件名不存放在inode中。

2、inode怎么出来的

通过格式化创建文件系统,得到

3、inode的特点

  1. inode存放文件属性
  2. 存放block的位置(指向block的指针)
  3. 创建一个文件要占用一个inode
  4. inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口
  5. inode在某一个文件系统(分区),是唯一的

4、怎么使用inode和查看

[root@luffy_boy-001 /]# df -i (系统里面inode用了多少,剩余多少)
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      462384 55433 406951   12% /
tmpfs          488562     1 488561    1% /dev/shm
/dev/sda1       51200    39  51161    1% /boot
/dev/sr0            0     0      0     - /mnt
[root@luffy_boy-001 /]# df -ih (-h人类可读)
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda3        452K   55K  398K   12% /
tmpfs            478K     1  478K    1% /dev/shm
/dev/sda1         50K    39   50K    1% /boot
/dev/sr0            0     0     0     - /mnt
[root@luffy_boy-001 /]# ls -ilh (查看某些文件的inode)
total 122K
143585 drwxr-xr-x.   3 root root 4.0K Jan 12  2019 app
    29 dr-xr-xr-x.   2 root root 4.0K Jan 10  2019 bin
     2 dr-xr-xr-x.   5 root root 1.0K Jan 10  2019 boot
143562 drwxr-xr-x.   2 root root 4.0K Jan 10  2019 data
143552 drwxr-xr-x.   3 root root 4.0K Jan 10  2019 data_bak
     4 drwxr-xr-x.  20 root root 3.7K Jan 10  2019 dev
129795 drwxr-xr-x.  78 root root 4.0K May 20 01:08 etc
    30 drwxr-xr-x.   3 root root 4.0K Jan 11  2019 home

block

1、block的含义

 数据块,实际存放数据的位置

2、block是怎么来的

也是格式化创建文件系统

3、block的特点

  1. block是实际存放数据的位置
  2. block 默认4k(centos 6.x) 1k 8k
  3. 创建大文件会占用多个block,如果文件很小1k,4k剩余的空间会被浪费。
  4. 创建一个非空文件要占用一个inode和至少1个block
  5. 每读取一个block就会消耗一次磁盘I/O(input/output 磁盘读写)。

4、怎么使用和查看

[root@luffy_boy-001 /]# df -h  (查看磁盘block使用情况)
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       6.9G  1.5G  5.1G  22% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sr0        3.7G  3.7G     0 100% /mnt
[root@luffy_boy-001 /]# ls -lh  
total 122K
drwxr-xr-x.   3 root root 4.0K Jan 12  2019 app
dr-xr-xr-x.   2 root root 4.0K Jan 10  2019 bin
dr-xr-xr-x.   5 root root 1.0K Jan 10  2019 boot
drwxr-xr-x.   2 root root 4.0K Jan 10  2019 data
drwxr-xr-x.   3 root root 4.0K Jan 10  2019 data_bak
drwxr-xr-x.  20 root root 3.7K Jan 10  2019 dev

oldboyfile寻宝

技术分享图片

经典案例:磁盘空间不足

no space left on device磁盘空间不足-因为block满了。
seq 100000000 >/tmp/big
#第一个里程碑-看看到底哪里满了
[root@oldboyedu01-nb ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot

#第二个里程碑-是哪一个目录占得空间大,最终定位到目录或文件
[root@oldboyedu01-nb ~]#
[root@oldboyedu01-nb ~]# du -sh /*|grep G
1.1G    /usr
7.4G    /var
[root@oldboyedu01-nb ~]# du -sh /var/*|grep G
7.3G    /var/log
[root@oldboyedu01-nb ~]# du -sh /var/log/*|grep G
7.3G    /var/log/messages
[root@oldboyedu01-nb ~]# ls -lh /var/log/messages
-rw------- 1 root root 7.3G Oct 16 19:20 /var/log/messages
#第三个里程碑-问清楚是否可以删除,然后在操作。

 【Y】企业案例:如果向磁盘写入数据提示如下错误:No space left on device(磁盘空间不足),通过df -h查看磁盘空间,发现没满,请问可能原因是什么?企业场景什么情况下会导致这个问题发生?
inode用光了。

模拟环境的命令。
mkdir -p /app/logs
dd if=/dev/zero of=/dev/sdc bs=8K  count=10
ls -l /dev/sdc
mkfs.ext4 /dev/sdc

mount -o loop /dev/sdc /app/logs


[root@oldboyedu01-nb ~]# cd /app/logs/
[root@oldboyedu01-nb logs]# touch stu{1..6}.log
touch: cannot touch `stu6.log: No space left on device
[root@oldboyedu01-nb logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  1.6G  6.9G  19% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sdc         73K   14K   55K  21% /app/logs
[root@oldboyedu01-nb logs]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      593344 58530 534814   10% /
tmpfs          488562     1 488561    1% /dev/shm
/dev/sda1       51200    39  51161    1% /boot
/dev/sdc           16    16      0  100% /app/logs

解决办法:删除一些不需要的文件,释放一些inode

linux文件类型和扩展名

常见文件类型的种类

- f    file           普通文件
  d   directory  目录
   l   softlink     软链接(快捷方式)

普通文件的分类

普通文件 都显示的是 - ,但是也是有区别的,怎么查看不同类型的普通文件呢? 
[root@oldboyedu01-nb ~]# ls -l /tmp/etc.tar.gz  /bin/ls /etc/hosts
-rwxr-xr-x. 1 root root  117048 Mar 23  2017 /bin/ls
-rw-r--r--. 2 root root     200 Sep 25 20:19 /etc/hosts
-rw-r--r--  1 root root 9744299 Oct 20  2017 /tmp/etc.tar.gz

用file 查看文件详细类型
##二进制文件 命令 [root@oldboyedu01-nb ~]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped ##文本文件 [root@oldboyedu01-nb ~]# file /etc/hosts /etc/hosts: ASCII text ##数据文件 data [root@oldboyedu01-nb ~]# file /tmp/etc.tar.gz /tmp/etc.tar.gz: gzip compressed data, from Unix, last modified: Fri Oct 20 01:36:16 2017

Linux下面的扩展名

windows     windows下通过扩展名区分不同类型的文件。
linux           扩展名是用来给我们自己看的。就算手动修改或者添加了扩展名,他的文件类型还是不会改变

# 创建压缩包文件
[root@luffy_boy-001 ~]# tar zcf /oldbo_y.txt /oldboy/alex.txt 
tar: Removing leading `/ from member names
# 查看文件
[root@luffy_boy-001 ~]# cat /oldboy.txt           
 ? Y@P²P?F;MpM??)´ê½吾43e¹???R·?¡o??s?sL±?¯g?ºµ¯????}?"(
# 查看压缩包文件
[root@luffy_boy-001 ~]# tar tf /oldboy.txt 
oldboy/alex.txt

linux有以下常见的扩展名

.sh     脚本文件

.conf  配置文件

Linux里面用户角色分类

整体对于一个文件/目录来说:用户可以分为3类
主人         所有者的名字

家人         所有者属于的组的名字

陌生人

[root@oldboyedu01-nb tmp]# ll -hi /etc/hosts
390174 -rw-r--r--. 2 root root 200 Sep 25 20:19 /etc/hosts

假设我是pizza用户,如何查询我与这个文件有什么关系?

[root@luffy_boy-001 ~]# id pizza
uid=500(pizza) gid=500(pizza) groups=500(pizza)
#id查询用户信息 #属于哪个用户组

linux中存在于系统中的用户如何分类

linux中存在于系统中的用户如何分类
UID   user  id 用户的id号码=====身份证号码    √√√√√
GID   group id 用户组的id号码===户口本的号码



                     UID
1.皇帝 root            0


2.傀儡 虚拟用户        1-499   系统中每个进程要有一个对应的用户,无法使用的.


3.贫民百姓 普通用户     500+


如何保护皇帝root
1.禁止root远程登录
2.修改ssh默认的端口号22
3.定期分析/var/log/secure 记录着用户的登录信息


#与用户有关的文件

/etc/passwd     存放的是用户的信息

/etc/shadow     用户密码的信息
/etc/group      用户组的信息

/etc/passwd

root  :x:0  :0  :root:/root       :/bin/bash
oldboy:x:500:500:    :/home/oldboy:/bin/bash
第一列:用户名字
第二列:存放密码的地方
第三列:UID
第四列:GID
第五列:用户的说明信息,默认为空
第六列:用户的家目录

~
root     ~  /root
oldboy   ~  /home/oldboy

第七列:用户使用的shell,用户使用的命令解释器

/bin/bash--------centos默认的命令解释器
/sbin/nologin----用户无法登陆系统,相当于是傀儡用户

Linux基础权限(9位权限)介绍

r    4   read可以读取文件内容
w   2   write修改文件内容
x    1   execute可以运行文件(命令 脚本)
-    0   什么权限都没有

[root@luffy_boy-001 ~]# ls -l
total 40
-rw-------. 1 root root  1061 Jan 10  2019 anaconda-ks.cfg
-rw-r--r--. 1 root root 21736 Jan 10  2019 install.log

# 权限的显示,和查看方法,分割成三部分
# rw-   ---   ---
# rw-   r--   r--
# 主人   家人  陌生人
 420  000  000
 420  400  400
  6    0  0
  6    4  4
[root@oldboyedu01-nb ~]# ls -l /bin/ls
-rwxr-xr-x. 1 root root 117048 Mar 23  2017 /bin/ls
 421401401
 7  5  5

软链接--相当于win的快捷方式

也叫作,符号链接

如何创建软链接

[root@luffy_boy-001 oldboy]# ln -s alex.txt alex.txt-soft
[root@luffy_boy-001 oldboy]# ll
total 36
-rw-r--r--. 1 root root    0 Jan 10  2019 alex.txt
lrwxrwxrwx. 1 root root    8 May 20 23:02 alex.txt-soft -> alex.txt

软链接的特点

1、存放着源文件的位置

2、源文件被删除,软链接会找不到原链接,并失效,显示为红色,并闪动

3、节约时间

硬链接

相当于,超市的前后门,通过不同的大门进入超市

在同一个分区中,两个文件或多个文件的inode号码相同,这些文件互为硬链接

如何创建硬链接

[root@luffy_boy-001 oldboy]# ln alex.txt alex.txt-hard
[root@luffy_boy-001 oldboy]# ll
total 44
-rw-r--r--. 2 root root    4 May 20 23:04 alex.txt
-rw-r--r--. 2 root root    4 May 20 23:04 alex.txt-hard
lrwxrwxrwx. 1 root root    8 May 20 23:02 alex.txt-soft -> alex.txt
观察到硬链接数量由 1 变成了 2

硬链接的特点

1.相当于是超市的前后门,硬链接数量就是超市一共有多少门
2.删除硬链接或源文件,文件还是可以使用的
3.把硬链接和源文件都删除,文件被删除====>硬链接数量为0

技术分享图片

软链接和硬链接的区别

描述linux下软链接和硬链接的区别
解答:
 1) 如何创建:
    a)默认不带参数情况下,ln命令创建的是硬链接,带-s参数的ln命令创建的是软链接。
 2) 含义:
    a)硬链接文件与源文件的inode节点号相同,而软链接文件相当于windows下面的快捷方式(inode节点号与源文件不同)
  b)硬链接主要用来防止误删,因为备份会占大量空间
3) 特点: a)不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到 b)软链接可以跨文件系统,硬链接不可以跨文件系统。 4) 怎么没的(源文件,软链接,硬链接与删除) a)删除软链接文件,对源文件及硬链接文件无任何影响; b)删除文件的硬链接文件,对源文件及软链接文件无任何影响; c)删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状); d)删除源文件及其硬链接文件,整个文件才会被"真正"的删除。

文件删除原理

什么情况,才是文件被删除了?

1、硬链接数为0,使用rm

2、进程调用数为0

3、当某个文件没有被彻底删除,会导致磁盘空间满了,因为只删除了硬链接数,而一直有进程调用,这个文件会越来越大

4、如何解决:查找机器自身的服务,然后重启apache和tomcat

 

技术分享图片

模拟问题

模拟思路
向/var/log/secure 追加8亿行
seq 800000000
#首先收到报警
[root@oldboyedu01-nb oldboy]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sdc         73K   14K   55K  21% /app/logs

#正常的排错过程。
[root@oldboyedu01-nb oldboy]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sdc         73K   14K   55K  21% /app/logs
[root@oldboyedu01-nb oldboy]# du -sh /* |grep G
du: cannot access `/proc/2904/task/2904/fd/4: No such file or directory
du: cannot access `/proc/2904/task/2904/fdinfo/4: No such file or directory
du: cannot access `/proc/2904/fd/4: No such file or directory
du: cannot access `/proc/2904/fdinfo/4: No such file or directory
1.1G    /usr
7.4G    /var
[root@oldboyedu01-nb oldboy]# du -sh /var/* |grep G
7.3G    /var/log
[root@oldboyedu01-nb oldboy]# du -sh /var/log/* |grep G
7.3G    /var/log/secure
[root@oldboyedu01-nb oldboy]# \rm -f /var/log/secure

#磁盘空间满了
[root@oldboyedu01-nb oldboy]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.8G  8.8G     0 100% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   40M  141M  22% /boot
/dev/sdc         73K   14K   55K  21% /app/logs
[root@oldboyedu01-nb oldboy]# du -sh /* |grep G
du: cannot access `/proc/2914/task/2914/fd/4: No such file or directory
du: cannot access `/proc/2914/task/2914/fdinfo/4: No such file or directory
du: cannot access `/proc/2914/fd/4: No such file or directory
du: cannot access `/proc/2914/fdinfo/4: No such file or directory
1.1G    /usr
占用空间明明很小,空间却满了
这就是因为,系统中某个文件没有被彻底删除。

如何找出硬链接数量为0,进程调用数不为0 lsof 显示系统中所有的文件 [root@oldboyedu01
-nb oldboy]# lsof |grep delete rsyslogd 1250 root 2w REG 8,3 7803924480 130420 /var/log/secure (deleted) 软件名称 文件大小 文件名 (deleted)---标记 这个文件的硬链接数量为0,进程调用数不为0。 ##重启对应的服务 [root@oldboyedu01-nb oldboy]# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] [root@oldboyedu01-nb oldboy]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.6G 6.9G 19% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot /dev/sdc 73K 14K 55K 21% /app/logs 磁盘空间不足-no space left on device 1.block满了正常-500G 存放505G视频 2.inode满了,大量的小文件 3.block 硬链接数量为0 进程调用数不为零 文件没有被彻底删除磁盘空间不足

磁盘空间不足问题小结(no space left on device)

1.block满了正常-500G 存放505G视频
2.inode满了,大量的小文件
3.block 硬链接数量为0 进程调用数不为0 ,文件没有被彻底删除磁盘空间不足

 

排查:

 技术分享图片

Linux文件属性之时间

3种
mtime   modified  time 文件的修改时间             文件内容的变化时间
ctime    change   time 文件属性的改变时间       硬链接数量 文件大小 文件权限
atime   access    time 文件的访问时间              cat

十、Linux之权限

如何知道你有什么权限

我能干什么?这是我最关心的问题!

切换到普通用户

[root@luffy-01 ~]# su - pizza
[pizza@luffy-01 ~]$ ls /root
ls: cannot open directory /root: Permission denied
[pizza@luffy-01 ~]$ rm -f /etc/passwd
rm: cannot remove `/etc/passwd: Permission denied  无权限,无法操作

1、看看你是谁

whoami

[pizza@luffy-01 ~]$ whoami
pizza

2、你与至个文件有什么关系

是 主人,家人,还是陌生人

先查看文件

[pizza@luffy-01 ~]$ ls -l  /oldboy/alex.txt
-rw-r--r--. 2 root root 19 Jan 15 11:33 /oldboy/alex.txt

id  查看身份======>groups,查看是不是和文件的主人是一家子

[pizza@luffy-01 ~]$ id
uid=500(pizza) gid=500(pizza) groups=500(pizza)

[pizza@luffy-01 ~]$ id root
uid=0(root) gid=0(root) groups=0(root)

结果:文件属于root家族,pizza是这个文件的陌生人,pizza的权限是9位权限的最后3位r--

权限的计算

r======4
w      2
x      1
-      0

-rw-------
 420000000
 6  0  0

-rw-r--r--
 420400400
 6  4  4

drwxr-xr-x
 421401401
 7  5  5

修改权限

chmod ===change mode

  1]使用数字的方法修改权限
  chmod 755 oldboy.txt

  2]使用字符
主人  家人    陌生人
user  group   other
u     g       o

[root@oldboyedu01-nb oldboy]# ls -l oldboy.txt
-rw-r--r--. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chmod u+x oldboy.txt  添加执行权限
[root@oldboyedu01-nb oldboy]# ls -l oldboy.txt
-rwxr--r--. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chmod u-x oldboy.txt   去除x权限
[root@oldboyedu01-nb oldboy]# ls -l oldboy.txt
-rw-r--r--. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chmod u=x oldboy.txt   先清空,再添加
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
---xr--r--. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chmod u=rwx oldboy.txt
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
-rwxr--r--. 2 root root 252 Oct 18 09:10 oldboy.txt
 3]给文件添加上执行权限
chmod +x oldboy.txt === chmod ugo+x oldboy.txt  === chmod a+x oldboy.txt

 4]修改文件的所有者和所属用户组
chown  change owner

[root@oldboyedu01-nb oldboy]# ls -l oldboy.txt
-rwxr-xr-x. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chown oldboy.oldboy oldboy.txt
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
-rwxr-xr-x. 2 oldboy oldboy 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]# chown root oldboy.txt
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
-rwxr-xr-x. 2 root oldboy 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]# chown root.root oldboy.txt
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
-rwxr-xr-x. 2 root root 252 Oct 18 09:10 oldboy.txt
[root@oldboyedu01-nb oldboy]# chown oldboy.oldboy oldboy.txt
[root@oldboyedu01-nb oldboy]# ll oldboy.txt
-rwxr-xr-x. 2 oldboy oldboy 252 Oct 18 09:10 oldboy.txt

对于文件来说,rwx权限的含义

准备环境

mkdir -p /oldboy
echo -e hostname\npwd >/oldboy/alex.sh
chown oldboy.oldboy /oldboy/alex.sh
ll /oldboy/alex.sh
root用户
oldboy用户

前提:对于普通非root用户

root用户下面修改 r权限

[root@luffy-01 ~]# chown oldboy.oldboy /oldboy/alex.sh
[root@luffy-01 ~]# ll /oldboy/alex.sh
-rw-r--r-- 1 oldboy oldboy 13 Jan 15 23:23 /oldboy/alex.sh
[root@luffy-01 ~]# chmod u=r /oldboy/alex.sh
[root@luffy-01 ~]# ll /oldboy/alex.sh
-r--r--r-- 1 oldboy oldboy 13 Jan 15 23:23 /oldboy/alex.sh

oldboy用户下验证

[oldboy@luffy-01 ~]$ ll /oldboy/alex.sh
-r--r--r-- 1 oldboy oldboy 13 Jan 15 23:23 /oldboy/alex.sh  # 可读
[oldboy@luffy-01 ~]$ cat /oldboy/alex.sh
hostname
pwd [oldboy@luffy
-01 ~]$ echo ls -ld /root >>/oldboy/alex.sh #没有写入权限 -bash: /oldboy/alex.sh: Permission denied [oldboy@luffy-01 ~]$ /oldboy/alex.sh # 没有执行权限 -bash: /oldboy/alex.sh: Permission denied

root下面修改 w

chown: invalid user: `u=w[root@luffy-01 ~]# chmod u=w /oldboy/alex.sh

oldboy用户下面验证

[oldboy@luffy-01 ~]$ ll /oldboy/alex.sh
--w-r--r-- 1 oldboy oldboy 13 Jan 15 23:23 /oldboy/alex.sh
[oldboy@luffy-01 ~]$ cat /oldboy/alex.sh
cat: /oldboy/alex.sh: Permission denied
[oldboy@luffy-01 ~]$ echo ls -ld /root >>/oldboy/alex.sh
[oldboy@luffy-01 ~]$ /oldboy/alex.sh
-bash: /oldboy/alex.sh: Permission denied
[oldboy@luffy-01 ~]$ cat /oldboy/alex.sh
cat: /oldboy/alex.sh: Permission denied

写进去了,却不能查看,那就是然并卵了

用VIM进去,什么也看不了,写入后,提示只读权限,

退出后vim后,在root用户下查看,显示的是已经被修改的内容。

所以,只有w权限是没什么用的

小结:

1.r读取文件内容
2.w修改文件的内容,但是需要r的配合
  没有r配合强制修改退出,会清空文件的内容

root下面修改 x

[root@luffy-01 ~]# ll /oldboy/alex.sh
---xr--r-- 1 oldboy oldboy 26 Jan 15 23:44 /oldboy/alex.sh

更改为x权限会变成绿色

oldboy用户下面验证

[oldboy@luffy-01 ~]$ ll /oldboy/alex.sh
---xr--r-- 1 oldboy oldboy 26 Jan 15 23:44 /oldboy/alex.sh
[oldboy@luffy-01 ~]$ echo w >> /oldboy/alex.sh
-bash: /oldboy/alex.sh: Permission denied
[oldboy@luffy-01 ~]$ /oldboy/alex.sh
bash: /oldboy/alex.sh: Permission denied

运行不了

加上r权限

[oldboy@luffy-01 ~]$ ll /oldboy/alex.sh
-r-xr--r-- 1 oldboy oldboy 26 Jan 15 23:44 /oldboy/alex.sh
[oldboy@luffy-01 ~]$ /oldboy/alex.sh
luffy-01
/home/oldboy
dr-xr-x---. 2 root root 4096 Jan 15 15:00 /root
可以运行了

小结:

对于文件来说rwx小结:
     1.r读取文件内容
     2.w修改文件的内容,但是需要r的配合
       没有r配合强制修改退出,会清空文件的内容
     3.x权限执行,需要r权限的配合

目录权限详解

  r 查看目录里面的内容,    ls
  w 可以在目录里面创建      删除 重命名文件
  x 可以进入(cd)到这个目录

创建环境

mkdir -p /oldboy/alexdir
chown oldboy.oldboy /oldboy/alexdir
touch    /oldboy/alexdir/luffy{01..5}.txt

root下修改目录权限r

[root@luffy-01 oldboy]# ll -d alexdir/    加-d是为了把目录当做文件对待,否则就是查看目录里面的内容了
drwxr-xr-x 2 oldboy oldboy 4096 Jan 16 00:03 alexdir/
[root@luffy-01 oldboy]# chmod u=r alexdir/
[root@luffy-01 oldboy]# ll -d alexdir/
dr--r-xr-x 2 oldboy oldboy 4096 Jan 16 00:03 alexdir/

oldboy下验证

[oldboy@luffy-01 oldboy]$ ls -ld alexdir/
dr--r-xr-x 2 oldboy oldboy 4096 Jan 16 00:03 alexdir/
[oldboy@luffy-01 oldboy]$ ls -l alexdir/
ls: cannot access alexdir/luffy01.txt: Permission denied
ls: cannot access alexdir/luffy05.txt: Permission denied
ls: cannot access alexdir/luffy04.txt: Permission denied
ls: cannot access alexdir/luffy02.txt: Permission denied
ls: cannot access alexdir/luffy03.txt: Permission denied
total 0
-????????? ? ? ? ?            ? luffy01.txt
-????????? ? ? ? ?            ? luffy02.txt
-????????? ? ? ? ?            ? luffy03.txt
-????????? ? ? ? ?            ? luffy04.txt
-????????? ? ? ? ?            ? luffy05.txt
[oldboy@luffy-01 oldboy]$ ls alexdir/
ls: cannot access alexdir/luffy01.txt: Permission denied
ls: cannot access alexdir/luffy05.txt: Permission denied
ls: cannot access alexdir/luffy04.txt: Permission denied
ls: cannot access alexdir/luffy02.txt: Permission denied
ls: cannot access alexdir/luffy03.txt: Permission denied
luffy01.txt  luffy02.txt  luffy03.txt  luffy04.txt  luffy05.txt

无法看到文件的详细信息

root下加入x权限

[oldboy@luffy-01 oldboy]$ ls alexdir/
luffy01.txt  luffy02.txt  luffy03.txt  luffy04.txt  luffy05.txt
[oldboy@luffy-01 oldboy]$ ls -l alexdir/
total 0
-rw-r--r-- 1 root root 0 Jan 16 00:03 luffy01.txt
-rw-r--r-- 1 root root 0 Jan 16 00:03 luffy02.txt
-rw-r--r-- 1 root root 0 Jan 16 00:03 luffy03.txt
-rw-r--r-- 1 root root 0 Jan 16 00:03 luffy04.txt
-rw-r--r-- 1 root root 0 Jan 16 00:03 luffy05.txt

可以查看了

小结:

1.对于目录来说 r表示 查看目录里面内容的权限,ls  需要x配合
2.没有x权限,那么显示的时候文件的属性无法显示

root下修改目录的w

[root@luffy-01 oldboy]# chmod u=w alexdir/
[root@luffy-01 oldboy]# ls -ld alexdir/
d-w-r-xr-x 2 oldboy oldboy 4096 Jan 16 00:03 alexdir/

oldboy下验证

[oldboy@luffy-01 oldboy]$ ll alexdir/
ls: cannot open directory alexdir/: Permission denied
[oldboy@luffy-01 oldboy]$ touch alexdir/txt.txt
touch: cannot touch `alexdir/txt.txt: Permission denied
[oldboy@luffy-01 oldboy]$ rm alexdir/luffy01.txt
rm: cannot remove `alexdir/luffy01.txt: Permission denied

各种操作都不行

添加x权限

[oldboy@luffy-01 oldboy]$ ll alexdir/
ls: cannot open directory alexdir/: Permission denied
[oldboy@luffy-01 oldboy]$ ll alexdir/ -d
d-wxr-xr-x 2 oldboy oldboy 4096 Jan 16 00:03 alexdir/
[oldboy@luffy-01 oldboy]$ touch alexdir/txt.txt

可以添加和删除了,但是无法查看目录

小结;

1.w表示 可以在目录中创建 删除文件 重命名文件权限
2.只有w无法删除 创建文件,w需要x配合

root下修改x

[root@luffy-01 oldboy]# chmod u=x alexdir/
[root@luffy-01 oldboy]# ls -ld alexdir/
d--xr-xr-x 2 oldboy oldboy 4096 Jan 16 00:22 alexdir/

oldboy下面验证

[oldboy@luffy-01 oldboy]$ cd alexdir/
[oldboy@luffy-01 alexdir]$ ll
ls: cannot open directory .: Permission denied

总结:

           文件                    目录
   r    读取文件的内容           查看目录的内容(需要x权限)
   w    修改文件的内容(需要r)    在目录下面创建 删除文件(需要x权限)
   x    执行文件(需要r)          进入到目录的权限(cd)

!!!!!!删除一个文件,要看你对这个文件所在的目录是否有wx权限。

网站整体权限规划

Linux 系统默认权限(默认的,比较安全的)

对于文件来说

所有者、家庭、隔壁老王======>rw- r- - r--  644

对于目录来说

所有者、家庭、隔壁老王======>rwx r-x r-x  755

文件或者目录的所有者

root root

网站比较安全的权限

blog.youxiaodao.com

网站程序放在/app/blog目录下面

#0.网站需要被运行起来,通过一个傀儡用户运行起来的www


#1.blog目录下面
 file 644 
dir 755
root root
#2.blog目录下面 /app/blog/ndd.jpg /app/blog/snow.jpg /app/blog/budongde.avi /app/blog/上传/lwang.jpg /app/blog/上传/lzhang.avi blog/上船
file644 dir755
www www

小结:

 1.网站是通过傀儡用户运行的www
 2.网站用户上传目录,file 644 dir 755 www www
 3.除了上传目录之外 file 644 dir 755 root root

Linux控制系统默认权限的命令umask

[root@luffy-01 oldboy]# umask
0022

[oldboy@luffy-01 alexdir]$ umask
0002

文件的最大的权限 666
目录的最大的权限 777

那么,0022 和666/777有什么关系呢?

####umask 022

#umask
##根据umask计算文件的默认权限
##666
#-022    减去022
#=644

##根据umask计算目录的默认权限
##777
#-022   
#=755


####umask 032

##根据umask计算文件的默认权限
##666
#-032
#=634
#+010   遇到奇数 +1
 =644



##根据umask计算目录的默认权限
##777
#-032
#=745



[root@online01 oldboy]# touch file032
[root@online01 oldboy]# mkdir dir032
[root@online01 oldboy]# ls -ld *032
drwxr--r-x. 2 root root 4096 Nov  8 05:22 dir032
-rw-r--r--. 1 root root    0 Nov  8 05:22 file032


根据umask计算出系统默认的权限规则
1.对于目录 777直接减去umask
2.对于文件 666减去umask的值,如果umask某一位上面是奇数,减完umask之后奇数位需要+1

umask的修改

[oldboy@luffy-01 alexdir]$ umask 032
[oldboy@luffy-01 alexdir]$ umask
0032

文件系统的属性

[oldboy@luffy-01 alexdir]$ lsattr txt.txt 
-------------e- txt.txt
查看系统属性,或者叫做隐藏的属性
共有9个,常用的有两个a和i

文件系统属性中的a和i

[root@online01 ~]# #a=====append 只能追加
[root@online01 ~]# #i=====immutable 无敌的 不可修改的
[root@online01 ~]# lsattr oldboy.txt
-------------e- oldboy.txt
[root@online01 ~]# chattr +a oldboy.txt
chattr授予文件或者目录隐藏的权限
+a 或者 -a
[root@online01 ~]# lsattr oldboy.txt -----a-------e- oldboy.txt [root@online01 ~]# cat oldboy.txt hello.txt [root@online01 ~]# echo hello >>oldboy.txt [root@online01 ~]# echo hello >>oldboy.txt [root@online01 ~]# cat oldboy.txt hello.txt hello hello [root@online01 ~]# echo hello >oldboy.txt -bash: oldboy.txt: Operation not permitted [root@online01 ~]# rm -f oldboy.txt rm: cannot remove `oldboy.txt: Operation not permitted [root@online01 ~]# mv oldboy.txt /tmp/ mv: cannot move `oldboy.txt to `/tmp/oldboy.txt: Operation not permitted [root@online01 ~]# echo hello >>oldboy.txt -bash: oldboy.txt: Permission denied [root@online01 ~]# echo hello >oldboy.txt -bash: oldboy.txt: Permission denied [root@online01 ~]# rm -f oldboy.txt rm: cannot remove `oldboy.txt: Operation not permitted [root@online01 ~]# mv oldboy.txt /tmp/ mv: cannot move `oldboy.txt to `/tmp/oldboy.txt: Operation not permitted

Linux特殊权限

suid setuid ------password命令

S s -rws r-x r-x

作用:运行某一个命令的时候相当于这个命令的所有者(root)

设置方法:chmod u+s /bin/rm 或者 chmod 4755 /bin/rm

危险:所有用户运行命令的时候都相当于是root

例子:passwd命令

看一下设置s属性后的文件权限信息

[root@luffy-01 oldboy]# chmod u+s /bin/cat
[root@luffy-01 oldboy]# ll /bin/cat
-rwsr-xr-x. 1 root root 48568 Mar 23  2017 /bin/cat
[root@luffy-01 oldboy]# stat /bin/cat
  File: `/bin/cat  Size: 48568         Blocks: 96         IO Block: 4096   regular file
Device: 803h/2051d    Inode: 13599       Links: 1
Access: (4755/-rwsr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-15 08:42:00.072999999 +0800
Modify: 2017-03-23 02:52:45.000000000 +0800
Change: 2019-01-16 01:31:49.911687040 +0800

权限变成了4 755

sticky粘滞位---1777 /tmp目录

特点:

1、任何用户都可以在这个目录里面创建文件(原来的权限是777)

2、每个人只能管理自己的文件,其他人处理不了

[root@luffy-01 oldboy]# stat /tmp/
  File: `/tmp/  Size: 4096          Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d    Inode: 12          Links: 3
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-01-15 17:29:10.881710386 +0800
Modify: 2019-01-15 15:28:55.581985449 +0800
Change: 2019-01-15 15:28:55.581985449 +0800

sgid locate

运行这个命令的时候,相当于这个命令的家人

总结

1、Linux权限体系
    1.rwx是啥
    2.rwx对应的数字 及计算方法 rwxr-xr-x
    3.chmod 命令的使用
     4.对于文件来说r w x 是什么含义 *****
    5.对于目录来说r w x 是什么含义 *****
    6.网站权限-通过控制权限让网站安全
    7.linux系统默认权限控制命令umask
    8.文件系统属性(文件属性)

前面的知识总结
1、正则总结
2、特殊符合总结 无分类系列 $ ! | # 引号系列 $() `` ‘‘ "" 重定向系列 > >> 2> 2>> < << 位置系列 ~ . .. 判断系列 && || 3.第三关练习题-取出ip地址 权限 4.使用三剑客进行过滤grep sed awk 如何使用三剑客命令过滤出文件中以oldboy开头的行(文件名是oldboy.txt,至少3种方法) 5.修改时间 linux快捷键 vi/vim快捷键 6.文件还有目录权限 rwx含义 7.网站权限-通过控制权限让网站安全 8.linux系统默认权限控制命令umask 9.文件系统属性(文件属性) 10.linux无法上网 11.无法远程连接服务器 进阶知识: 安装和使用lrzsz htop

十一、Linux命令进阶

绝对路径,相对路径

绝对路径  从根开始的路径 -精确定位
        /data
        /etc/hosts
相对路径  不从根开始的路径
          容易 迷路

漏斗家族

1、标准输出 执行正确的内容才会通过漏斗

#>   1>    标准输出重定向  先把文件的内容清空   把内容放在文件的最后一行
#>>  1>>   追加重定向      把内容放在文件的最后一行

2、< 输入重定向

# 支持的命令很少
echo 1 2 3 4 5 >/data/num.txt 
[root@oldboyedu-01 ~]# cat /data/num.txt 
1 2 3 4 5

[root@oldboyedu-01 ~]# xargs -n2 </data/num.txt 
1 2
3 4
5
为什么要用xargs
echo ‘--help’ |cat
echo ‘--help’ |xargs cat
参考:https://www.cnblogs.com/wangqiguo/p/6464234.html

3、<< 追加输入重定向

cat >>/data/oldboy.txt<<EOF
I
am 
studying 
linux 
EOF

复制cp

###3.4 把oldboy.txt拷贝(复制)到/tmp下。
#copy ----cp  三个参数:-r 递归的复制  -p 复制的时候保持原素性不变  -a 复制所有 相当于-pdr
[root@oldboyedu-01 ~]# cp /data/oldboy.txt /tmp/
[root@oldboyedu-01 ~]# ls -l /tmp/
total 4
-rw-r--r--. 1 root root 140 Sep 20 01:29 oldboy.txt
-rw-------. 1 root root   0 Sep 18 15:40 yum.log

备份cp

# 操作前备份 操作后检查
# 备份就是 复制需要被分的文件,然后给文件加上后缀
[root@oldboyedu-01 ~]# cp /data/oldboy.txt /data/oldboy.txt.bak
[root@oldboyedu-01 ~]# ls -l /data/oldboy.txt
-rw-r--r--. 1 root root 140 Sep 20 01:12 /data/oldboy.txt
[root@oldboyedu-01 ~]# ls -l /data/
total 12
-rw-r--r--. 1 root root  10 Sep 20 01:15 num.txt
-rw-r--r--. 1 root root 140 Sep 20 01:12 oldboy.txt
-rw-r--r--. 1 root root 140 Sep 20 01:31 oldboy.txt.bak

复制整个目录cp -r

-r 递归的复制整个目录

[root@oldboyedu-01 ~]# cp /data/   /tmp/
cp: omitting directory `/data/----忽略这个命令,Linux很多命令没办法直接处理目录

-r  复制整个目录及目录下的内容

[root@oldboyedu-01 ~]# cp -r /data/ /tmp/
[root@oldboyedu-01 ~]# ls -l /tmp/
total 8
drwxr-xr-x. 2 root root 4096 Sep 20 01:35 data
-rw-r--r--. 1 root root  140 Sep 20 01:29 oldboy.txt
-rw-------. 1 root root    0 Sep 18 15:40 yum.log

移动mv

题目: 把 /data 移动到 /root目录下面
#移动----搬家---move-mv
[root@oldboyedu-01 ~]# mv /data/ /root/
[root@oldboyedu-01 ~]# ls -l /root/
total 40
-rw-------. 1 root root  1052 Sep 18 15:44 anaconda-ks.cfg
drwxr-xr-x. 2 root root  4096 Sep 20 01:31 data
-rw-r--r--. 1 root root 21736 Sep 18 15:44 install.log
-rw-r--r--. 1 root root  5890 Sep 18 15:43 install.log.syslog
[root@oldboyedu-01 ~]# ls -l /data 
ls: cannot access /data: No such file or directory

删除rm –r  -rf

###3.6 进入/root目录下的data目录,删除oldboy.txt文件
[root@oldboyedu-01 tmp]# rm data/
rm: cannot remove `data/: Is a directory默认无法直接删除目录

[root@oldboyedu-01 tmp]# rm -r data 使用-r删除目录
rm: descend into directory `data? y   
rm: remove regular file `data/oldboy.txt? n
rm: remove regular file `data/.oldboy.txt.swp? n
rm: remove regular file `data/num.txt? n
rm: remove regular file `data/oldboy.txt.bak? n
rm: remove directory `data? n

[root@oldboyedu-01 tmp]# rm -rf data/     -rf 强制删除
[root@oldboyedu-01 tmp]# ls -l
total 4
-rw-r--r--. 1 root root 140 Sep 20 01:29 oldboy.txt
-rw-------. 1 root root   0 Sep 18 15:40 yum.log

查找命令find

找出你想要的东西再删除

##find命令
[root@oldboyedu-01 tmp]# find /root/ -type f -name "oldboy.txt"
/root/data/oldboy.txt
[root@oldboyedu-01 tmp]# #find /root/ -type f -name "oldboy.txt"
[root@oldboyedu-01 tmp]# #find 在哪里找 找什么类型的  找什么名字

type

-type  找什么类型的
       f ----file 文件
       d---- directory 目录

管道 |

用来传递数据

技术分享图片

| 和 xargs 是黄金搭档

[root@oldboyedu-01 tmp]# find /root/ -type f -name "oldboy.txt"|xargs ls -l
-rw-r--r--. 1 root root 0 Sep 20 02:27 /root/data/oldboy.txt

*

找出以.txt结尾的文件-用*

[root@oldboyedu-01 tmp]# find /root/  -type f  -name "*.txt"
/root/data/oldboy.txt
/root/data/num.txt

目录跳转cd

返回上一级

题目:退出到上一级目录删除data目录。(原来在/root/data)
[root@oldboyedu-01 ~]# cd /root/data/
[root@oldboyedu-01 data]# pwd
/root/data

cd .. 和cd../../../

[root@oldboyedu-01 data]# cd ..
[root@oldboyedu-01 ~]# pwd
/root

[root@oldboyedu-01 ~]# #进入当前目录的上一级目录 
[root@oldboyedu-01 ~]# cd ..
[root@oldboyedu-01 /]# cd ../../../
[root@oldboyedu-01 ~]# rm data/  -fr   把危险的参数放在后面
[root@oldboyedu-01 ~]# ls data 
ls: cannot access data: No such file or directory

注意:一个点指当前目录,不用与cd,配合其他命令,指当前目录

过滤命令

题目: 已知文件test.txt内容
oldboy
test
lidao
请给出输出test.txt文件内容时,不包含oldboy字符串的命令。
创建测试文件:
mkdir /data
cat >/data/test.txt<<EOF
test
liyao
oldboy
EOF

#方法1-grep -v

[root@oldboyedu-01 ~]# cd /data/
[root@oldboyedu-01 data]# cat test.txt 
test
liyao
oldboy
[root@oldboyedu-01 data]# #过滤 在文件中找到你想要的内容
[root@oldboyedu-01 data]# grep   "oldboy"      test.txt 
oldboy
[root@oldboyedu-01 data]# grep   "ol"      test.txt 
oldboy
[root@oldboyedu-01 data]# #排除
[root@oldboyedu-01 data]# grep -v   "oldboy"      test.txt 
test
liyao

#方法2-head取前几行

[root@oldboyedu-01 data]# head test.txt 
test
liyao
oldboy
[root@oldboyedu-01 data]# head -n2 test.txt 
test
liyao
[root@oldboyedu-01 data]# head -2 test.txt 
test
liyao

tail取最后几行

[root@oldboyedu-01 data]# tail test.txt 
test
liyao
oldboy
[root@oldboyedu-01 data]# tail -2 test.txt 
liyao
oldboy
[root@oldboyedu-01 data]# tail -1 test.txt 
oldboy

#方法3-awk 配合’!/oldboy/’

[root@oldboyedu-01 data]# awk ‘/oldboy/‘ test.txt 
oldboy
[root@oldboyedu-01 data]# grep "oldboy" test.txt 
oldboy
[root@oldboyedu-01 data]# grep -v "oldboy" test.txt   
test
liyao
[root@oldboyedu-01 data]# awk ‘!/oldboy/‘ test.txt 
test
liyao

[root@oldboyedu-01 data]# #awk中 !表示取反 非

#方法4-sed(替换) 配合’/opldoy/d’

[root@oldboyedu-01 data]# sed ‘/oldboy/d‘ test.txt 
test
liyao

无文件存在的排错


无文件存在用ls一层一层排错

##3.9 请用一条命令完成创建目录/oldboy/test,即创建/oldboy目录及/oldboy/test

[root@oldboyedu-01 data]# mkdir /oldboy/test
mkdir: cannot create directory `/oldboy/test: No such file or directory


No such file or directory错误排查过程
1.ls 命令一层一层查看
2.查看每一层目录/文件是否存在

创建多层目录mkdir -p

[root@oldboyedu-01 data]# mkdir -p /oldboy/test 
[root@oldboyedu-01 data]# ls /oldboy/
test
[root@oldboyedu-01 data]# ls -l /oldboy/
total 4
drwxr-xr-x. 2 root root 4096 Sep 25 10:28 test

使用:mkdir -pv 查看命令每一步的操作
注意:在word文档中的- ,复制到命令行中会出错

关于Linux别名

即给命令设置一个昵称
##小名 昵称 爱称 外号
为什么会有别名
###1.防止运行危险命令******
###2.省事 简化命令

我们总会遇到:提示你是否覆盖?   是否删除?


#为何我们执行cp的时候就相当于cp -i
#为何我们执行rm的时候就相当于rm -i

题目:已知/tmp下已经存在test.txt文件,如何执行命令才能把/mnt/test.txt拷贝到/tmp下覆盖掉/tmp/test.txt,而让系统不提示是否覆盖(root权限下)。

[root@oldboyedu-01 data]# cp /mnt/test.txt  /tmp/
cp: overwrite `/tmp/test.txt? ^C

如何直接跳过这个提示

#方法1 撬棍

[root@oldboyedu-01 data]# \cp /mnt/test.txt  /tmp/

#方法2 使用命令的绝对路径 全路径

[root@oldboyedu-01 data]# which cp  先找到命令的路径
alias cp=cp -i
    /bin/cp
[root@oldboyedu-01 data]# which mkdir 
/bin/mkdir
[root@oldboyedu-01 data]# ls -l /bin/cp 
-rwxr-xr-x. 1 root root 122896 Mar 23  2017 /bin/cp
[root@oldboyedu-01 data]# /bin/cp /mnt/test.txt /tmp/

怎么设置Linux别名-alias命令

###第一个里程碑-查看系统中的别名

[root@oldboyedu-01 data]# alias rm cp mv
alias rm=rm -i
alias cp=cp -i
alias mv=mv -i



###第二个里程碑-模仿

#执行rm命令的时候提示 do not use rm 
root@oldboyedu-01 data]# echo do not use rm
do not use rm
[root@oldboyedu-01 data]# alias rm=‘echo do not use rm‘
[root@oldboyedu-01 data]# alias rm
alias rm=echo do not use rm
[root@oldboyedu-01 data]# rm /tmp/test.txt 
do not use rm /tmp/test.txt
[root@oldboyedu-01 data]# rm -f /tmp/test.txt 
do not use rm -f /tmp/test.txt
[root@oldboyedu-01 data]# rm -fr /tmp/test.txt 
do not use rm -fr /tmp/test.txt


###第三个里程碑-永久生效

#/etc/profile
#vim 快捷键
##移动光标到文件的最后一行                             G
##移动光标到文件的  第一行                             gg
##在光标所在位置的下一行插入一个空行 并进入编辑模式    o(小写字母)
[root@oldboyedu-01 ~]# tail -1 /etc/profile
alias rm=echo do not use rm
让命令生效
[root@oldboyedu-01 ~]# source /etc/profile   会用到source命令生效的很少。
[root@oldboyedu-01 ~]# alias rm
alias rm=echo do not use rm


###第四个里程碑-填坑

编辑 /root/.bashrc
把 alias rm=rm -i这一行前面加上一个注释#

# 非要删除就使用撬棍或者绝对路径

生成序列seq

seq 100 >/oldboy/ett.txt

显示指定行sed、head+tail、awk、grep

题目3.11 只查看ett.txt文件(共100行)内第20到第30行的内容
###方法1-sed

[root@oldboyedu-01 ~]# #sed 默认输出 sed命令会把文件的内容 默认都显示出来
[root@oldboyedu-01 ~]# sed -n ‘20p‘ /oldboy/ett.txt 
20
[root@oldboyedu-01 ~]# sed -n ‘20,30p‘ /oldboy/ett.txt 
20
21
22
23
24
25
26
27
28
29
30


###方法2-head + tail 

[root@oldboyedu-01 ~]# head -30 /oldboy/ett.txt |tail -11
20
21
22
23
24
25
26
27
28
29
30


###方法3-awk 

[root@oldboyedu-01 ~]# awk ‘NR==20‘ /oldboy/ett.txt 
20
#NR表示行号
#== 表示等于
[root@oldboyedu-01 ~]# awk ‘NR==20,NR==30‘ /oldboy/ett.txt 
[root@oldboyedu-01 ~]# sed -n ‘20,30p‘ /oldboy/ett.txt 


###方法4-grep

[root@oldboyedu-01 ~]# grep "20" /oldboy/ett.txt 
20
[root@oldboyedu-01 ~]# #文件的内容 ====等于这一行的行号
[root@oldboyedu-01 ~]# grep -A10 "20" /oldboy/ett.txt   A显示20以及下面的10行
20
21
22
23
24
25
26
27
28
29
30

查找文件Find 与 替换sed

题目:把/oldboy目录及其子目录下所有以扩展名 .sh结尾的文件中,文件包含oldboy的字符串全部替换为oldgirl 
创建测试环境:
mkdir -p /oldboy/test
cd /oldboy
echo "oldboy">test/del.sh
echo "oldboy">test.sh
echo "oldboy">t.sh
touch oldboy.txt
touch alex.txt


#第一个里程碑-找出你要的文件

[root@oldboyedu-01 oldboy]# find /oldboy/ -type f 
/oldboy/t.sh
/oldboy/oldboy.txt
/oldboy/test.sh
/oldboy/test/del.sh
/oldboy/ett.txt
/oldboy/alex.txt
[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"
/oldboy/t.sh
/oldboy/test.sh
/oldboy/test/del.sh


#第二个里程碑-oldboy替换为oldgirl 处理一个文件

[root@oldboyedu-01 oldboy]# cat /oldboy/t.sh 
oldboy
[root@oldboyedu-01 oldboy]# #sed ‘s#找谁#替换为什么#g‘   /oldboy/t.sh 
[root@oldboyedu-01 oldboy]# #替换
[root@oldboyedu-01 oldboy]# sed  ‘s#oldboy#oldgirl#g‘   /oldboy/t.sh 
oldgirl
[root@oldboyedu-01 oldboy]# cat /oldboy/t.sh   默认是无法修改文件的,除了vim
oldboy
[root@oldboyedu-01 oldboy]# #sed修改文件的内容   用 -i
[root@oldboyedu-01 oldboy]# sed -i ‘s#oldboy#oldgirl#g‘   /oldboy/t.sh  
[root@oldboyedu-01 oldboy]# cat /oldboy/t.sh 
oldgirl


#第三个里程碑-把find命令找到的文件交给sed命令处理

[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"
/oldboy/t.sh
/oldboy/test.sh
/oldboy/test/del.sh
[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs ls -l
-rw-r--r--. 1 root root 7 Sep 25 11:59 /oldboy/test/del.sh
-rw-r--r--. 1 root root 7 Sep 25 11:59 /oldboy/test.sh
-rw-r--r--. 1 root root 8 Sep 25 12:08 /oldboy/t.sh
[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs sed ‘s#oldboy#oldgirl#g‘
oldgirl
oldgirl
oldgirl
[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs sed ‘s#oldboy#oldgirl#g‘ -i
[root@oldboyedu-01 oldboy]# find /oldboy/ -type f -name "*.sh"|xargs cat 
oldgirl
oldgirl
oldgirl

 

Linux系统的启动过程

1.开机自检 BIOS
2.MBR引导
3.GRUB菜单
4.加载内核
5.运行init进程
6.从/etc/inittab读取运行级别
7.根据/etc/rc.sysinit 初始化系统(设置主机名 设置ip)
8.根据运行级别启动对应的软件(开机自启动软件)
9.运行mingetty显示登录界面

技术分享图片

 

PATH环境变量

什么是环境变量

1、大写

2、在系统大部分地方都可以使用,含义相同

3、常见的环境变量

LANG     PATH    PS1

PATH含义

路径-存放的是Linux命令的位置/路径

[root@luffy_boy-001 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 
# 用冒号分割 [root@luffy_boy
-001 ~]# echo $LANG en_US.UTF-8

linux下面运行命令过程

1、输入命令

2、在PATH里面 进行查找

3、找到了就运行,找不到就提示:command not found

查看目录

如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是第一级目录)?

##创建环境
mkdir /oldboy -p
cd /oldboy
mkdir ext/oldboy test xiaodong xiaofan xingfujie -p
touch jeacen oldboy wodi.gz yingsui.gz
##方法1-tree
yum install  tree -y
[root@oldboyedu43-lnb oldboy]# tree -Ld 1
.
├── ext
├── test
├── xiaodong
├── xiaofan
└── xingfujie

5 directories

##方法2-find
[root@oldboyedu43-lnb oldboy]# find  -maxdepth 1 -type d   把-maxdepth放在前面,否则会有警告信息
.
./xingfujie
./test
./xiaodong
./xiaofan
./ext


[root@oldboyedu43-lnb oldboy]# find  -maxdepth 1 -type d  -name "."
.
[root@oldboyedu43-lnb oldboy]# find  -maxdepth 1 -type d ! -name "."
./xingfujie
./test
./xiaodong
./xiaofan
./ext


##方法3-grep
[root@oldboyedu43-lnb oldboy]# ls -l |grep "以d开头的行"
[root@oldboyedu43-lnb oldboy]# ls -l |grep "^d"
drwxr-xr-x  3 root root 4096 Dec 15 00:26 ext
drwxr-xr-x. 2 root root 4096 Dec 11 21:22 test
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xiaodong
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xiaofan
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xingfujie

^  高级货色(三剑客使用) 正则表达式 以.....开头的行

##方法4-awk

[root@oldboyedu43-lnb oldboy]# ls -l |awk ‘第2列大于1‘
awk: 第2列大于1
awk: ^ invalid char 奠in expression
[root@oldboyedu43-lnb oldboy]# ls -l |awk ‘$2>1‘
total 32
drwxr-xr-x  3 root root 4096 Dec 15 00:26 ext
drwxr-xr-x. 2 root root 4096 Dec 11 21:22 test
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xiaodong
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xiaofan
drwxr-xr-x  2 root root 4096 Dec 15 00:26 xingfujie
这种方法其实是不准确的,了解一下

##方法5-ls
[root@oldboyedu43-lnb oldboy]# ls -F|grep "/"
ext/
test/
xiaodong/
xiaofan/
xingfujie/
[root@oldboyedu43-lnb oldboy]# #-F 给不通类型的文件 加上不通的标记/尾巴


##方法6-ls
ls -ld */
## 查看某个软件包里面有什么
[root@luffy_boy-001 oldboy]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.5.3
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz
查看某个软件是否安装
rpm -qa |grep tree

跳转目录

 如何快速的回到 上一次所在的位置/目录

 cd -   快速回到上一次的位置。- 相当于 环境变量

cd  -  #cd $OLDPWD
cd  -  #如何快速的回到 上一次所在的位置
cd  .  #当前目录
        复制/移动
cd  .. #进入当前目录的上级目录
cd  ~  #进入当前目录的家目录 回老家
cd     #进入当前目录的家目录 回老家

查找最近跟新的文件

一个目录中有很多文件(ls查-看时好多屏),想最快速度查看到最近更新的文件。如何看?

[root@luffy_boy-001 etc]# ls -lrt
t 按时间排序
r 逆序

实时查看日志内容的实时跟新

调试系统服务时,希望能实时查看系统日志/var/log/messages 的更新,如何做?

#1、重新打开一个窗口
[root@luffy_boy-001 etc]# tail -f /var/log/messages 

tailf ==== tail -f 一样的

查找文件内容以及行号

三剑客sed、grep、awk都能过滤,但是在过滤方面还是grep的比较快一些

sed跟擅长替换,修改文本内容

awk擅长取行,取列

打印配置文件nginx.conf的内容的行号以及内容,该如何做?

打造环境

echo stu{01..10} |xargs -n1 >nginx.conf

###方法1
[root@oldboyedu-39-nb oldboy]# cat -n nginx.conf
     1    stu1
     2    stu2
     3    stu3
     4    stu4
     5    stu5

###方法2 vi /vim
:set nu   #显示行号
:set nonu #取消显示行号


###方法3 grep

[root@oldboyedu-39-nb oldboy]# grep -n "." nginx.conf
1:stu1
2:stu2
3:stu3
4:stu4
5:stu5

####. 正则表达式里面的  表示任意一个字符

###方法4 sed
[root@oldboyedu-39-nb oldboy]# sed ‘=‘ nginx.conf |xargs -n2
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5


###方法5 awk
[root@oldboyedu-39-nb oldboy]# awk ‘显示行号‘ nginx.conf
awk: 显示行号
awk: ^ invalid char ?in expression
[root@oldboyedu-39-nb oldboy]# awk ‘{print NR}‘ nginx.conf
1
2
3
4
5
[root@oldboyedu-39-nb oldboy]# awk ‘{print NR,$0}‘ nginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5

###方法6
[root@oldboyedu-39-nb oldboy]# nl nginx.conf
     1    stu1
     2    stu2
     3    stu3
     4    stu4
     5    stu5

文件处理(日志仅保留7天)

已知apache/nginx服务的访问日志按天记录在服务器本地目录/app/logs下,由于磁盘空间紧张,现在要求只能保留最近7天访问日志!请问如何解决? 请给出解决办法或配置或处理命令。(提示:可以从apache服务配置上着手,也可以从生成出来的日志上着手。)

# 创建环境
mkdir -p /app/logs
cd /app/logs
for  time in  {01..20};do  date -s "201705$time"; touch access_www_$(date +%F).log ;done
date -s "20170520"  修改系统时间

技术分享图片

# 前第七天
[root@luffy_boy-001 logs]# find -type f -name ‘*.log‘ -mtime 7
./access_www_2017-05-13.log
# 7天之前
[root@luffy_boy-001 logs]# find -type f -name ‘*.log‘ -mtime +7
./access_www_2017-05-11.log
./access_www_2017-05-12.log
./access_www_2017-05-10.log
./access_www_2017-05-08.log
./access_www_2017-05-09.log
./access_www_2017-05-01.log
./access_www_2017-05-02.log
./access_www_2017-05-03.log
./access_www_2017-05-06.log
./access_www_2017-05-07.log
./access_www_2017-05-05.log
./access_www_2017-05-04.log
# 最近7天
[root@luffy_boy-001 logs]# find -type f -name ‘*.log‘ -mtime -7
./access_www_2017-05-18.log
./access_www_2017-05-15.log
./access_www_2017-05-20.log
./access_www_2017-05-16.log
./access_www_2017-05-19.log
./access_www_2017-05-17.log
./access_www_2017-05-14.log
找出/app/logs下面以.log结尾的并且修改时间是7天之前的文件并删除(ls -l)
find /app/logs/ -type f -name "*.log"  -mtime +7

#find /app/logs/ -type f -name "*.log"  -mtime +7|xargs ls -l
#ls -l $(find /app/logs/ -type f -name "*.log"  -mtime +7)
#find /app/logs/ -type f -name "*.log"  -mtime +7  -exec ls -l {}  \;


通过系统软件对日志进行切割。

补充find命令相关题目:

查找/oldboy 下所有以log 结尾的大于1M 的文件复制到/tmp

[root@oldboyedu43-lnb logs]# cat /etc/services  /etc/services > 1m.log
[root@oldboyedu43-lnb logs]# ls -lh 1m.log
-rw-r--r-- 1 root root 1.3M Dec 12 00:14 1m.log


find /oldboy  -type f -name "*.log"  -size +1M

-size +1M
-size +100k



find /oldboy  -type f -name "*.log"

mkdir -p /tmp/a /tmp/b /tmp/c /tmp/d

方法1 find+$()
#cp 次处是find命令的结果  /tmp/a/
cp   $(find /app/logs/ -type f -name "*.log")  /tmp/a/

方法2 find + -exec
find /app/logs/ -type f -name "*.log" -exec cp {} /tmp/b/  \;


方法3 find + |xargs
find /app/logs/ -type f -name "*.log" |xargs cp -t /tmp/c

设置服务的开启级别

装完系统后,希望让网络文件共享服务NFS(iptables),仅在3级别上开机自启动,应该怎么做?

[root@luffy_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:on    4:on    5:on    6:off
[root@luffy_boy-001 logs]# chkconfig --level 3 iptables off
[root@luffy_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:off    4:on    5:on    6:off
[root@luffy_boy-001 logs]# chkconfig --level 35 iptables off
[root@luffy_boy-001 logs]# chkconfig |grep ipt
iptables           0:off    1:off    2:on    3:off    4:on    5:off    6:off

备份一堆文件-打包tar

/etc/目录是linux系统默认的配置文件以及服务启动命令的目录

a、请用tar打包/etc整个目录(打包以及压缩)

b、请把a点命令的压缩包,解压到/tmp 指定目录下(最好用tar命令实现)

c、请用tar打包/etc整个目录(打包及压缩,但需要排除/etc/services文件)

 tar - 创建查看解压 压缩包

####创建一个压缩包

#tar zcvf /tmp/etc.tar.gz /etc/


#z----压缩工具---gzip    最常用一种  压缩之后我们一般给 压缩包命名位 xxxx.tar.gz
#c----创建-------create
#v----显示压缩/解压过程
#f----file------指定压缩包的名字


###查看压缩包里面的内容
tar ztf /tmp/etc.tar.gz

#t---list------列表 显示

###解压----解压到当前目录
# cd /tmp/
# pwd
/tmp
# tar zxvf /tmp/etc.tar.gz

#x-----extract 解压

 技术分享图片

提示的是什么?:

[root@luffy_boy-001 etc]# tar zcf /etc/haha.tar.gz /etc/
tar: Removing leading `/ from member names
tar: Removing leading `/ from hard link targets
tar: /etc: file changed as we read it

###问题:"创建压缩包"的时候会提示
tar: Removing leading `/ from member names
tar:把每个文件开头的/删除掉了。
/etc/hosts ------>  etc/hosts
tar命令提示你:我在创建压缩包的时候 把压缩包中的文件 绝对路径----->相对路径

tar: Removing leading `/ from hard link targets
打包的时候使用相对路径,就不会出现提示了
###小结:核心 为了安全----tar命令 把你使用的绝对路径----变化为-----相对路径

b和c的答案:

b.请用tar打包/etc整个目录(打包及压缩,但需要排除/etc/services文件)。

[root@oldboyedu-39-nb /]# tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=services   ###排除所有文件名叫services的文件
tar: Removing leading `/ from member names
tar: Removing leading `/ from hard link targets
[root@oldboyedu-39-nb /]# tar tf /tmp/etc-pai.tar.gz |grep services
etc/init/readahead-disable-services.conf
[root@oldboyedu-39-nb /]# tar tf /tmp/etc.tar.gz |grep services
etc/services
etc/init/readahead-disable-services.conf


##排除---精确版本 加上位置
[root@oldboyedu-39-nb /]# tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=etc/services
tar: Removing leading `/ from member names
tar: Removing leading `/ from hard link targets
[root@oldboyedu-39-nb /]# tar tf /tmp/etc-pai.tar.gz |grep services
etc/sysconfig/services
etc/init/readahead-disable-services.conf


#把你要排除的名单写到一个文件中 /tmp/paichu.txt(了解)
#tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude-from=/tmp/paichu.txt


c.请把a点命令的压缩包,解压到/tmp指定目录下(最好只用tar命令实现)。
tar xf /tmp/etc-pai.tar.gz -C /opt


把/etc/hosts /etc/sysconfig/network /etc/sysconfig/i18n /etc/init.d/  打包压缩 /tmp/conf.tar.gz
解压到/opt目录


[root@oldboyedu-39-nb /]# tar zcf /tmp/conf.tar.gz /etc/hosts /etc/sysconfig/network /etc/sysconfig/i18n /etc/init.d/
tar: Removing leading `/ from member names
[root@oldboyedu-39-nb /]# tar tf /tmp/conf.tar.gz
etc/hosts
etc/sysconfig/network
etc/sysconfig/i18n
etc/init.d
[root@oldboyedu-39-nb /]# tar xf /tmp/conf.tar.gz -C /opt/
[root@oldboyedu-39-nb /]# ls  /opt/
etc  rh

小结:

#1.创建压缩包
tar zcf /tmp/oldboy.tar.gz   /oldboy

#2.查看压缩包中的内容
tar tf /tmp/oldboy.tar.gz

#3.解压---解压到当前目录
tar xf  /tmp/oldboy.tar.gz
tar xf  /tmp/oldboy.tar.gz  -C /opt

#4.创建压缩包的时候 排除
tar zcf /tmp/etc-pai.tar.gz  /etc/  --exclude=etc/services

tar zcf /tmp/etc-pai.tar.gz /etc/ --exclude-from=/tmp/paichu.txt

sed和awk筛选出文件中的指定内容

已知如下命令及结果:
mkdir -p /oldboy
echo "I am oldboy,myqq is 31333741">/oldboy/oldboy.txt

a.现在需要从文件中过滤出“oldboy”和“31333741”字符串,请给出命令.
b.如果需要从文件中过滤出“oldboy,31333741”字符串,请再给出命令.

a.现在需要从文件中过滤出“oldboy”和“31333741”字符串,请给出命令.
方法1-sed-sed
[root@oldboyedu01-nb oldboy]# sed ‘s#I am ##g‘ oldboy.txt |sed ‘s#,myqq is##g‘
oldboy 31333741
方法2-sed/tr+awk [root@oldboyedu01-nb oldboy]# sed ‘s#,# #g‘ oldboy.txt |awk ‘{print $3,$6}‘ oldboy 31333741 [root@oldboyedu01-nb oldboy]# tr "," " " <oldboy.txt |awk ‘{print $3,$6}‘ oldboy 31333741 方法3-awk指定多个分隔符号 [root@oldboyedu01-nb oldboy]# cat oldboy.txt I am oldboy,myqq is 31333741 [root@oldboyedu01-nb oldboy]# awk -F "," ‘{print $1}‘ oldboy.txt I am oldboy [root@oldboyedu01-nb oldboy]# awk -F "[, ]" ‘{print $3,$6}‘ oldboy.txt oldboy 31333741 -F "[, ]" 表示以逗号或者空格作为菜刀 分隔符 b.如果需要从文件中过滤出“oldboy,31333741”字符串,请再给出命令. [root@oldboyedu01-nb oldboy]# awk -F "[, ]" ‘{print $3,$6}‘ oldboy.txt oldboy 31333741 [root@oldboyedu01-nb oldboy]# awk -F "[, ]" ‘{print $3","$6}‘ oldboy.txt oldboy,31333741 [root@oldboyedu01-nb oldboy]# awk -F "[, ]" ‘{print $3"$1"$6}‘ oldboy.txt oldboy$131333741 [root@oldboyedu01-nb oldboy]# awk -F "[, ]" ‘{print $3" $1 "$6}‘ oldboy.txt oldboy $1 31333741 小结: 1.tr命令 2.awk指定分隔符 指定多个分隔符

awk分割列的方式

技术分享图片

统计文件信息  wc  -l

可以统计文件有多少行,有多少单词,多大等

如何查看/etc/services文件的有多少行?

[root@oldboyedu01-nb oldboy]# wc -l /etc/services
10774 /etc/services

查看程序是否运行 ps  -ef

屌丝去洗浴中心之路
3.
1)查看22端口是否开启 telnet
2)sshd远程连接进程是否在运行******
ps -ef

[root@oldboyedu01-nb oldboy]# ps -ef |grep "sshd"
root       1509      1  0 17:51 ?        00:00:00 /usr/sbin/sshd
root       1669   1509  0 17:51 ?        00:00:00 sshd: root@pts/0
root       1795   1509  0 18:17 ?        00:00:00 sshd: root@pts/1
root       1813   1671  0 18:17 pts/0    00:00:00 grep sshd

[root@oldboyedu01-nb oldboy]# ps -ef |grep "/sshd"
root       1509      1  0 17:51 ?        00:00:00 /usr/sbin/sshd
root       1817   1671  0 18:19 pts/0    00:00:00 grep /sshd
[root@oldboyedu01-nb oldboy]# ps -ef |grep "/sshd"|wc -l   得到数字
2

过滤指定内容所在行的内容 egrep

过滤出/etc/services 文件包含3306或1521两数字所在的行的内容。

[root@oldboyedu01-nb oldboy]# egrep "3306|1521" /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
ncube-lm        1521/tcp                # nCube License Manager
ncube-lm        1521/udp                # nCube License Manager
[root@oldboyedu01-nb oldboy]# #egrep === grep -E 支持高级正则(公鸡里的战斗机)

命令行及shell中加单引号和加双引号的区别

 单引号 所见即所得 吃啥吐啥
[root@oldboyedu01-nb oldboy]# echo ‘hello lls $LANG $(hostname) `pwd`‘
hello lls $LANG $(hostname) `pwd`

 双引号 里面的特殊符号会被解析

[root@oldboyedu01-nb oldboy]# echo "hello lls $LANG $(hostname) `pwd`"
hello lls en_US.UTF-8 oldboyedu01-nb /oldboy

十二、Linux之特殊符号与正则表达式

Linux中常用的特殊符号

‘‘     所见即所得,吃啥吐啥
""     特殊符号会被解析运行
``     ==== $() 先运行里面的命令 把结果留下

>     重定向符号        先清空文件的内容 然后追加文件的最后
>>    追加重定向        追加文件的最后
2>    错误重定向        只有错误的信息 才会通过这个漏洞进入文件中
2>>   错误追加重定向

~     当前用户的家目录
root   ~ /root
oldboy ~ /home/oldboy
!     查找并运行历史命令
!awk  包含awk的命令 最近的一条运行
      history |grep awk
#     注释
      root用户的命令提示符

$     取出变量的内容
      awk $取某一列的内容
      普通用户的命令提示符
*     所有 任何东西
\     撬棍  转义字符

&&    前一个命令执行成功然后在执行后一个命令
      ifdown eth0 && ifup eth0


||    前一个命令支持失败了再执行后面的命令

通配符

通配符是用来查找文件的。如:‘*.txt’ 表示匹配所有以  . txt结尾的文件
##1. * 所有,任意 找出文件名包含oldboy的文件 mkdir -p /oldboy cd /oldboy touch oldboy.txt oldboy oldboyfile oldboy.awk eduoldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "oldboy" /oldboy/oldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "*oldboy" /oldboy/oldboy /oldboy/eduoldboy [root@oldboyedu01-nb oldboy]# find /oldboy/ -type f -name "*oldboy*" /oldboy/oldboyfile /oldboy/oldboy.txt-hard /oldboy/oldboy.awk /oldboy/oldboy.txt /oldboy/oldboy /oldboy/eduoldboy ##2. {} 生成序列 [root@oldboyedu01-nb oldboy]# echo {1..6} 1 2 3 4 5 6 [root@oldboyedu01-nb oldboy]# echo {1..10} 1 2 3 4 5 6 7 8 9 10 [root@oldboyedu01-nb oldboy]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@oldboyedu01-nb oldboy]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@oldboyedu01-nb oldboy]# echo {01..10} 01 02 03 04 05 06 07 08 09 10 [root@oldboyedu01-nb oldboy]# echo stu{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10 [root@oldboyedu01-nb oldboy]# echo 20{01..10} 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 [root@oldboyedu01-nb oldboy]# [root@oldboyedu01-nb oldboy]# echo {1,9,20} 1 9 20 #通过{}进行备份 [root@oldboyedu01-nb oldboy]# echo A{B,C} AB AC [root@oldboyedu01-nb oldboy]# echo A{,C} A AC [root@oldboyedu01-nb oldboy]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@oldboyedu01-nb oldboy]# touch oldboy.txt [root@oldboyedu01-nb oldboy]# cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# ls -l oldboy.txt* -rw-r--r--. 2 root root 29 Oct 18 07:42 oldboy.txt -rw-r--r-- 1 root root 29 Oct 18 07:42 oldboy.txt.bak -rw-r--r--. 2 root root 29 Oct 18 07:42 oldboy.txt-hard lrwxrwxrwx 1 root root 10 Oct 17 09:27 oldboy.txt-soft -> oldboy.txt [root@oldboyedu01-nb oldboy]# cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# #cp oldboy.txt{,.bak} [root@oldboyedu01-nb oldboy]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@oldboyedu01-nb oldboy]# echo A{,B} A AB

正则表达式

1)什么是正则?为何使用它?
  通过符号表示文字内容。

  提高效率,省事。
  支持正则表达式:Linux三剑客 grep sed awk

2)使用正则的时候注意事项
    #1] 正则表达式是按照行进行处理的
    #2] 禁止使用中文符号
    #3] 给grep和egrep配置别名
cat >>/etc/profile<<EOF
alias grep=grep --color=auto
alias egrep=egrep --color=auto
EOF

source /etc/profile

正则与统配符的区别

  用途                                 匹配的内容                       支持的命令
  通配符---用来匹配查找文件名      *.txt *.log 以.txt .log结尾的文件    大部分命令都可以使用
  正则-----在文件中匹配查找内容    包含oldboy的行                       Linux三剑客

正则表达式的分类

      名称                                       符号                     命令
基础正则(basic regular expression BRE) ^ $ . * [] [^] grep sed awk 扩展正则(extended regular expression ERE) | + {} () ? grep -E/egrep sed -r awk

基础正则

准备测试环境
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
#1].  ^  以....开头的行
[root@oldboyedu01-nb oldboy]# grep ‘^m‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!

#2].  $  以....结尾的行
[root@oldboyedu01-nb oldboy]# grep ‘m$‘ oldboy.txt
my blog is http://oldboy.blog.51cto.com

#3].  ^$ 空行 这一行中没有任何的符号
[root@oldboyedu01-nb oldboy]# grep -n ‘^$‘ oldboy.txt
3:
8:

排除文件中的空行
[root@oldboyedu01-nb oldboy]# grep  -v ‘^$‘ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!

#4].  .(点)  任意一个字符 不包含空行
    #-o 表示grep的执行过程 正则每次匹配到了什么?

    找出文件中以点结尾的行
[root@oldboyedu01-nb oldboy]# grep ‘.$‘ oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
因为 . 是正则符号,所以并没有匹配出我们需要的内容。我们需要使用\将其转义
#5].  \(撬棍)  转义符号  脱掉马甲,打回原形
[root@oldboyedu01-nb oldboy]# grep ‘\.$‘ oldboy.txt
I teach linux.
my qq num is 49000448.
  # \n     表示回车换行

#6].  *  前一个字符连续出现了0次或1次以上  >=0
    A
    AA
    AAA
    AAAA
[root@oldboyedu01-nb oldboy]# grep ‘0‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# grep -o ‘0‘ oldboy.txt
0
0
0
0
0
0
0
0

[root@oldboyedu01-nb oldboy]# grep ‘0*‘ oldboy.txt
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu01-nb oldboy]#
[root@oldboyedu01-nb oldboy]# grep -o ‘0*‘ oldboy.txt
000
00000

Linux正则表达式之问题1.
为何会取出000 而不是
00 和0 0 0 0 #因为正则在表示 连续出现的时候表现出贪婪性 有多少吃多少 有多少匹配多少 Linux正则表达式之问题2.
为何使用
0* 会把整个文件的内容都显示出来 #A*表示 # 连续出现了0次A ====>相当于什么也没有,就像是在匹配 ‘ ’ 。因此就会把整个文件的内容都显示出来 # A连续出现了1次以上 A # 小结: 什么是连续出现 -o的使用 #7]. .* 所有字符 所有符号 所有 #正则中表示连续出现 或 所有的时候 贪婪性 有多少匹配多少 找出文件中以m开头的行并且以m结尾的行 [root@oldboyedu01-nb oldboy]# grep ‘^m.*m$‘ oldboy.txt my blog is http://oldboy.blog.51cto.com #8]. [] 中括号 [abc] 相当于是一个字符 找出包含a或b或c的行 [root@oldboyedu01-nb oldboy]# grep ‘[abc]‘ oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my god ,i am not oldbey,but OLDBOY! [root@oldboyedu01-nb oldboy]# grep -on ‘[abc]‘ oldboy.txt 1:a 1:b 1:a 1:c 2:a 2:c grep [a-z] oldboy.txt grep [A-Z] oldboy.txt grep [0-9] oldboy.txt grep [a-zA-Z0-9] oldboy.txt 练习3:以 m或n或o开头的 并且以 m或g 结尾的行 [root@oldboyedu01-nb oldboy]# grep ‘^[mno].*[mg]$‘ oldboy.txt my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org [root@oldboyedu01-nb oldboy]# grep ‘[m,n,o]‘ oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! #9]. [^] [^abc] 排除a或b或c的内容 [root@oldboyedu01-nb oldboy]# grep ‘[^abc]‘ oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY! #10].基础正则小结 ##1)) ^ $ ^$ . * .* [] [^] ##2)) grep grep -o

扩展正则

+  | () {} ?

    #1].  +前一个符号连续出现了1次或多次  ,贪婪匹配,尽可能多的匹配
[root@oldboyedu01-nb oldboy]# egrep  ‘0‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# egrep  ‘0+‘ oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu01-nb oldboy]# egrep  ‘0+‘ oldboy.txt -o
000
00000
[root@oldboyedu01-nb oldboy]# egrep  ‘0‘ oldboy.txt -o
0
0
0
0
0
0
0
0
符号 + 的应用
#把文件中连续出现的小写字母取出来     #1.取出小写字母 [root@oldboyedu01-nb oldboy]# egrep ‘[a-z]‘ oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY!     #2.连续出现的小写字母 [root@oldboyedu01-nb oldboy]# egrep ‘[a-z]+‘ oldboy.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our site is http://www.etiantian.org my qq num is 49000448. not 4900000448. my god ,i am not oldbey,but OLDBOY!     #3.只保留连续出现的小写字母 [root@oldboyedu01-nb oldboy]# egrep ‘[a-z]+‘ oldboy.txt -o am oldboy teacher teach linux like badminton ball billiard ball and chinese chess my blog is http oldboy blog cto com our site is http www etiantian org my qq num is not my god i am not oldbey but 小结: 1.可以把连续的东西通过正则取出来 2.一般与[]配合 #2]. | 或者 [root@oldboyedu01-nb oldboy]# egrep ‘oldboy|linux‘ oldboy.txt I am oldboy teacher! I teach linux. my blog is http://oldboy.blog.51cto.com Linux正则表达式之问题3:[] 与 | 区别 都可以表示或者 [abc] a|b|c 区别: 1.[]基础正则 |扩展正则 2.[]表示的是单个字符或者 |单个字符的或多个字符的都可 [a-z] oldboy|linux #3]. () 括号中的内容相当于是一个整体 后向引用(反向引用) [root@oldboyedu01-nb oldboy]# egrep ‘oldb(o|e)y‘ oldboy.txt I am oldboy teacher! my blog is http://oldboy.blog.51cto.com my god ,i am not oldbey,but OLDBOY! 先乘除再加减,有括号的先算括号里面的。 #后向引用,反向引用,一般是在sed命令中使用 sed,把你想要的内容先保护起来(通过小括号),然后再使用他。
    实例:需求,我要把123456用<>包起来 [root@oldboyedu01
-nb oldboy]# echo ‘<123456>‘ 当然不是这种玩赖的做法 <123456> [root@oldboyedu01-nb oldboy]# echo 123456|sed ‘s#(.*)#\1#g‘ 注意:\1 表示第一个小括号 sed: -e expression #1, char 11: invalid reference \1 on `s‘ command‘s RHS [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#(.*)#\1#g‘ 123456 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#(.*)#<\1#g‘ <123456 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#(.*)#<\1>#g‘ <123456> [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#.(.)..(.).#\1#g‘ 2 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#.(.)..(.).#\2#g‘ 5 [root@oldboyedu01-nb oldboy]# echo 123456|sed -r ‘s#.(.).(.)(.).#\3#g‘ 5
#4]. o{n,m} 前一个字符连续出现了至少n次,最多m次。 o{n} 前一个字符连续出现了n次 o{n,} 前一个字符连续出现了至少n次 o{,m} 前一个字符连续出现了最多m次 [root@oldboyedu01-nb oldboy]# egrep ‘0{1,4}‘ oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep -o ‘0{1,4}‘ oldboy.txt 000 0000 0 [root@oldboyedu01-nb oldboy]# egrep ‘0{3,4}‘ oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep ‘0{3,4}‘ oldboy.txt -o 000 0000 [root@oldboyedu01-nb oldboy]# egrep ‘0{3,}‘ oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep ‘0{3,}‘ oldboy.txt -o 000 00000 [root@oldboyedu01-nb oldboy]# egrep ‘0{3}‘ oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep ‘0{3}‘ oldboy.txt -o 000 000 [root@oldboyedu01-nb oldboy]# egrep ‘[0-9]‘ oldboy.txt my blog is http://oldboy.blog.51cto.com my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep ‘[0-9]{8,}‘ oldboy.txt my qq num is 49000448. not 4900000448. [root@oldboyedu01-nb oldboy]# egrep ‘[0-9]{8,}‘ oldboy.txt -o 49000448 4900000448 #5]. ? 表示前一个字符连续出现0次或1次 gd good god gooood [root@oldboyedu01-nb oldboy]# egrep ‘gd|god‘ li.log gd god [root@oldboyedu01-nb oldboy]# egrep ‘go?d‘ li.log gd god [root@oldboyedu01-nb oldboy]# egrep ‘go*d‘ li.log gd good god gooood

正则总结

# 1、正则符号
     连续出现(重复)
            *        >=0    0次或者多次
            +        >=1   1次以上
            ?        0 1     0次或者1次
            {n,m}    >=n  <=m   至少n次,最多m次
            {n}      ==n     取n次
     其他
            .        任意一个字符
            [abc]    一个整体 相当于是一个字符a或者b或者c
                     [a-z] [0-9] [A-Z]
            [^abc]   排除
            |        或者
            ()       后向引用  反向引用  先保护再使用
            ^        以什么什么开头
            $     以什么什么结尾
            .*       所有
            ^$       空行

#2、基础正则与扩展正则区别:
      支持基础正则            基础+扩展
         grep            egrep === grep -E
         sed                  sed -r
         awk                  awk
    使用撬棍\ 也可以命令支持扩展正则(一般不用,遇到稍微复杂的会很麻烦)
    [root@luffy-01 oldboy]# grep ‘god\|gd‘ alex.txt 
     gd
     god

#3、查询帮助:
    man grep(简单的帮助)
    查看详细的帮助信息info grep

练习题

过滤文本(awk、sed)

1、请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答)

思路
1.定位-取出第2行
2.取出你要的ip地址

方法1-awk方法+awk+awk
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘
addr:10.0.0.200
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘|awk -F":" ‘{print $2}‘
10.0.0.200

方法2-awk+awk 
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $4}‘

[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $11}‘
inet
[root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]" ‘{print $13}‘
10.0.0.200
#遇到空格便切,前面有10个空格,切了10刀才遇到第一个非空格,太费劲了
#下面使用不费劲的方法,用+匹配(一个或者多个) [root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘ inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk -F "[: ]+" ‘{print $4}‘ 10.0.0.200 ##理解连续出现 理解 [] + [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |egrep ‘[@#]‘ ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |egrep ‘[@#]‘ -o # # # # # # @ @ @ @ @ @ @ @ [root@oldboyedu01-nb ~]# [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |egrep ‘[@#]+‘ ######1@@@@@@@@2 [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |egrep ‘[@#]+‘ -o ###### @@@@@@@@ [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |awk -F "[@#]+" ‘{print $2}‘ 1 [root@oldboyedu01-nb ~]# echo ‘######1@@@@@@@@2‘ |awk -F "[@#]+" ‘{print $3}‘ 2 方法3-awk #预备姿势-通过awk取出 ifconfig eth0 结果中的 第二行的第二列 [root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘ inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2‘|awk ‘{print $2}‘ addr:10.0.0.200 [root@oldboyedu01-nb ~]# ifconfig eth0|awk ‘NR==2{print $2}‘ addr:10.0.0.200 [root@oldboyedu01-nb ~]# #awk ‘找谁{干啥}‘ #最终结果 [root@oldboyedu01-nb ~]# ifconfig eth0|awk -F "[: ]+" ‘NR==2{print $4}‘ 10.0.0.200 方法4-sed+sed+sed [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘ inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*:##g‘ 255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘ 10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘|sed ‘s# Bc.*$##g‘ 10.0.0.200 方法5-sed命令的后向引用 ****** #原则-先把你想要的内容保护起来,然后在后面使用 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘ inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed -r ‘s#^.*dr:##g‘ 10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed -r ‘s#^.*dr:(.*) Bc.*$#\1#g‘ 10.0.0.200 方法6-sed #预备姿势-ifconfig eth0第二行的inet替换为oldboy [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘ inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2p‘|sed ‘s#inet#oldboy#g‘ oldboy addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 [root@oldboyedu01-nb ~]# ifconfig eth0|sed -n ‘2s#inet#oldboy#gp‘ oldboy addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0 #最终结果- [root@oldboyedu01-nb ~]# ifconfig eth0|sed -nr ‘2s#^.*dr:(.*) Bc.*$#\1#gp‘ 10.0.0.200 小结: 1.理解第2 3 5方法 2.了解6 3.awk指定多个连续的分隔符,sed的反向引用

2、如何取得/etc/hosts文件的权限对应的数字内容,如-rw-r--r-- 为644,要求使用命令取得644或0644这样的数字。

#方法1-awk
[root@oldboyedu01-nb ~]# stat /etc/hosts |awk ‘NR==4‘
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |awk -F "[(/]" ‘NR==4{print $2}‘
0644


#方法2-sed
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -n ‘4p‘
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr ‘4s#^.*\(##gp‘
    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr ‘4s#^.*\([0-9]+##gp‘
/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
[root@oldboyedu01-nb ~]# stat /etc/hosts |sed -nr ‘4s#^.*\(([0-9]+).*$#\1#gp‘
0644

#方法3-stat命令的参数
[root@oldboyedu01-nb ~]# stat -c%a /etc/hosts
644

小结:
1.sed 反向引用  awk方法指定分隔符

3、已知/oldboy/test.txt 文件内容为:

oldboy

 

youxiaodao

 

pizza

请问如何把文件中的空行过滤掉(要求命令行实现)

#方法1-grep   -v表示排除
[root@oldboyedu01-nb oldboy]# grep ‘^$‘ test.txt


[root@oldboyedu01-nb oldboy]# grep -n ‘^$‘ test.txt
2:
4:
[root@oldboyedu01-nb oldboy]# grep -v ‘^$‘ test.txt
oldboy
xizi
xiaochao


#方法2-awk
[root@oldboyedu01-nb oldboy]# awk ‘/^$/‘ test.txt
[root@oldboyedu01-nb oldboy]# awk ‘不要/^$/‘ test.txt
awk: 不要/^$/
awk: ^ invalid char ?in expression
! 表示排除
[root@oldboyedu01-nb oldboy]# awk ‘!/^$/‘ test.txt
oldboy
xizi
xiaochao
[root@oldboyedu01-nb oldboy]## awk ‘不要/空行/‘ test.txt


#方法3-sed-删除
[root@oldboyedu01-nb oldboy]# sed  ‘/^$/d‘  test.txt
oldboy
xizi
xiaochao

小结:
1.通awk sed表示排除
2.awk !
3.sed d

4、已知/oldboy/ett.txt 文件内容为:

oldboy

pizzzzza

test

请使用grep或者egrep 正则匹配的方式过滤出前两行内容

#如何通过-sed awk 实现过滤 === grep/egrep
[root@oldboyedu01-nb oldboy]# cat ett.txt
oldboy
olldboooy
test
[root@oldboyedu01-nb oldboy]# egrep ‘oldboy‘ ett.txt
oldboy
[root@oldboyedu01-nb oldboy]# awk ‘/oldboy/‘ ett.txt
oldboy
[root@oldboyedu01-nb oldboy]# sed -n ‘/oldboy/p‘ ett.txt
oldboy
题目答案:
[root@oldboyedu01-nb oldboy]# egrep ‘ol+dbo+y‘ ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldboy]# awk ‘/ol+dbo+y/‘ ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldboy]# sed -n ‘/ol+dbo+y/p‘ ett.txt
[root@oldboyedu01-nb oldboy]# sed -nr ‘/ol+dbo+y/p‘ ett.txt
oldboy
olldboooy
[root@oldboyedu01-nb oldb

小结:
1.sed awk如何实现过滤类似grep/egrep
2.awk定位的方法
awk NR==1
awk NR==1,NR==10
awk //

3.sed定位
sed -n 1p
sed -n 1,10p
sed -n 10,$p
sed -n //p

文件

5、linux下通过mkdir命令创建一个新目录/alexdir,alexdir的硬链接数是多少,为什么?
     然后在alexdir下面又创建了一个目录 /alexdir/test,问alexdir的硬链接数量是多少?

[root@luffy-01 oldboy]# mkdir /alexdir
[root@luffy-01 oldboy]# ll /|grep alex
drwxr-xr-x    2 root root  4096 Jan 15 15:21 alexdir
[root@luffy-01 oldboy]# mkdir /alexdir/test
[root@luffy-01 oldboy]# ll /|grep alex
drwxr-xr-x    3 root root  4096 Jan 15 15:21 alexdir

查看一下:

[root@luffy-01 oldboy]# ls -lid /alexdir/ /alexdir/.
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/.

2个文件的inode是一样的。在当我们使用 cd . 的时候,也是进入了这个文件夹

创建之后,查看,果然是3个一样的inode

[root@luffy-01 oldboy]# ls -lid /alexdir/ /alexdir/. /alexdir/test/..
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/.
143565 drwxr-xr-x 3 root root 4096 Jan 15 15:21 /alexdir/test/..

6、请给出默认情况eth0网卡配置文件的路径及客户端DNS的路径。

 /etc/sysconfig/network-scripts/ifcfg-eth0
 /配置/系统配置/网络-脚本/if(c f g)-eth0

 

 DNS的配置
 1./etc/resolv.conf
 2.网卡配置文件
 3.网卡配置文件里面的DNS优先

替换

7、查找当前目录下所有文件,并把文件中的www.etiantian.org字符串替换成www.oldboyedu.com

假设现在在/oldboy
 find /oldboy -type f -name "*.txt"

 #方法1
 find /oldboy -type f -name "*.txt"|xargs sed s#www.etiantian.org#www.oldboyedu.com#g
  (管道|什么时候用xargs,什么时候不用呢?)
 #方法2
 ##预备姿势
 [root@oldboyedu01-nb ~]# #ls -l 此处存放着 which mkdir命令的结果
 [root@oldboyedu01-nb ~]# #ls -l  which mkdir
 [root@oldboyedu01-nb ~]# #ls -l $(which mkdir)
 [root@oldboyedu01-nb ~]# #ls -l `which mkdir`
 [root@oldboyedu01-nb ~]# ls -l `which mkdir`
 -rwxr-xr-x. 1 root root 50056 Mar 23  2017 /bin/mkdir
 [root@oldboyedu01-nb ~]# ls -l $(which mkdir)
 -rwxr-xr-x. 1 root root 50056 Mar 23  2017 /bin/mkdir
 ##最终结果
 sed s#www.etiantian.org#www.oldboyedu.com#g  此处存放着find命令的结果
 sed s#www.etiantian.org#www.oldboyedu.com#g  $(find /oldboy -type f -name "*.txt")

 #方法3
 find /oldboy -type f -name "*.txt"  -exec ls -l  {}  \;
  -exec 是 find的参数,{}接受前面find命令的结果

一个故障实例(被植入js)

7.1有一个实际是这样的,情况是:一个lamp的服务器,站点目录下的所有文件军备植入了js代码,导致网站打开时就会调用这个地址,显示广告,造成很恶劣的影响,

解决方案:
#1、运营、网站用户发现弹窗广告
#2、运营报告给开发,开发联系运维,共同解决
#3、开发发现的问题就是,站点的目录都被植入了js代码
#4、运维人员解决问题:
##   1)运维备份原始出问题的原始文件
##   2)历史备份覆盖
##   3)find+sed覆盖
#5、仔细查看日志,寻找问题发现根源
#6、提供盲羊补牢解决方案(站点目录严格权限规划方案,以及新上线发布规范思路)

echo的参数使用

8、请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出。
       echo "oldboy";echo "oldboy"

# ;  ====>分号表示分隔多条命令
ls;pwd;hello

[root@oldboyedu01-nb ~]# echo -n "oldboy";echo "oldboy"
oldboyoldboy
# -n 表示取消输出每一行结尾的换行符号

[root@oldboyedu01-nb ~]# echo -e "a\nb"
a
b
# echo命令的-e参数,就是让echo支持\n \t 
[root@oldboyedu01-nb ~]# echo -e "a\nb\n\tc" >echo.txt
[root@oldboyedu01-nb ~]# cat echo.txt
a
b
    c
# -A显示文件中的特殊符号
[root@oldboyedu01-nb ~]# cat -A echo.txt
a$
b$
^Ic$

时间命令

9、请给出如下格式的date命令,例:11-02-26。再给出实现按周输出 比如:周六输出为6,请分别给出命令。

date命令的使用

[root@oldboyedu01-nb ~]# date
Fri Oct 20 05:20:30 CST 2017
[root@oldboyedu01-nb ~]# #2017-11-11
[root@oldboyedu01-nb ~]# #date +格式
[root@oldboyedu01-nb ~]# date +%F
2017-10-20
[root@oldboyedu01-nb ~]# date +%Y-%m-%d
2017-10-20
[root@oldboyedu01-nb ~]# date +%w
5
[root@oldboyedu01-nb ~]# #显示当前的日期以年-月-日_周几

[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5

[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5
[root@oldboyedu01-nb ~]# date +%T
05:25:33
[root@oldboyedu01-nb ~]# date +%H:%M:%S
05:25:51

date命令按照格式显示日期小结:
1.date +格式
2.%F ===> %Y-%m-%d 年-月-%T ===> %H:%M:%S 时:分:秒
  %w ===> 周几

10、扩展问题:打印三天前的日期,格式如:2088-08-28

如何显示指定日期:使用-d参数

[root@oldboyedu01-nb ~]# date
Fri Oct 20 05:28:44 CST 2017
[root@oldboyedu01-nb ~]# date -d "1day"  显示1天后的日期
Sat Oct 21 05:29:07 CST 2017
[root@oldboyedu01-nb ~]# date -d "+1day" 显示一天后
Sat Oct 21 05:29:18 CST 2017
[root@oldboyedu01-nb ~]# date -d "-1day" 显示前一天
Thu Oct 19 05:29:42 CST 2017

[root@oldboyedu01-nb ~]# date -d "-1day" +%F   也可以制定显示格式
2017-10-19
[root@oldboyedu01-nb ~]# date -d "1day" +%F    
2017-10-21
[root@oldboyedu01-nb ~]# #year month day hour min sec  格式顺序

#显示7天前的时间按照格式年-月-日_周几
[root@oldboyedu01-nb ~]#
[root@oldboyedu01-nb ~]# date +%F_%w
2017-10-20_5
[root@oldboyedu01-nb ~]# date +%F_%w -d "-7day"
2017-10-13_5

修改系统日期:使用-s参数

[root@oldboyedu01-nb ~]# date -s "21111111 11:11:11"  
Wed Nov 11 11:11:11 CST 2111
[root@oldboyedu01-nb ~]# date -s "1hour"  把当前系统时间往后添加一个小时
Wed Nov 11 12:12:51 CST 2111
[root@oldboyedu01-nb ~]# date -s "-1hour"
Wed Nov 11 11:12:56 CST 2111

利用时间服务器,自动修改系统时间

时间服务器
pool.ntp.org
ntp1.aliyun.com

[root@luffy-01 oldboy]# ntpdate pool.ntp.org

PATH环境变量

11、【Centos 5.x】当从root用户切到普通用户pizza时,执行ifconfig会提示。command not found.

1、Linux运行命令过程
输入命令
linux会在PATH里面进行查找
运行
报错

2、PATH环境变量


修改PATH环境变量
##临时
[root@oldboyedu01-nb ~]# export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu01-nb ~]#[root@oldboyedu01-nb ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

##永久
把环境变量的配置命令追加到/etc/profile中
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

##生效
source /etc/profile


小结:
1.什么是PATH环境变量
2.如何修改PATH环境变量

文件

12、请描述下列路径的内容是做什么的?

/var/log/messages          系统默认的日志
/var/log/secure            用户的登录信息
/etc/fstab                 开机的时候自动挂载列表  在开机的时候每个磁盘分区对应着什么入口的列表
/etc/profile               配置环境变量  别名
/var/spool/cron/root       定时任务的配置文件
/etc/hosts                 解析主机名
                          /etc/hosts                 主机名---->ip地址
                          DNS解析                     域名--->   ip过程

13、如何快速查到ifconfig的全路径,请给出命令。

####方法1 which (在PATH环境变量)
[root@oldboyedu01-nb ~]# which mkdir
/bin/mkdir
[root@oldboyedu01-nb ~]# which sed
/bin/sed

####方法2 find
[root@oldboyedu01-nb ~]# find / -type f -name "gawk"
/bin/gawk
[root@oldboyedu01-nb ~]# find / -type f -name "sed"
/bin/sed
[root@oldboyedu01-nb ~]# find / -type f -name "mkdir"
/bin/mkdir

####方法3  whereis 找出命令相关的 帮助 man  ,所以会很多
[root@oldboyedu01-nb ~]# whereis sed
sed: /bin/sed /usr/share/man/man1p/sed.1p.gz /usr/share/man/man1/sed.1.gz
[root@oldboyedu01-nb ~]# whereis awk
awk: /bin/awk /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1p/awk.1p.gz /usr/share/man/man1/awk.1.gz
[root@luffy-01 ~]# whereis -b sed   使用-b参数,得到的只是二进制文件
sed: /bin/sed
####方法4 locate 根据名字 找出文件的路径 根据文件名字与文件路径表格(数据库) 查找,一般不使用,因为使用它会去查询数据库,导致磁盘空间紧张 updatedb 跟新数据库 [root@oldboyedu01-nb ~]# touch oldboy-20171111.log [root@oldboyedu01-nb ~]# locate 20171111 刚刚建立的文件没有,跟新一下,才能查找到 [root@oldboyedu01-nb ~]# updatedb [root@oldboyedu01-nb ~]# locate 20171111 /root/oldboy-20171111.log

查询Linux在线用户

14、请给出查看当前哪些用户在线的linux命令。

用户在线是什么意思呢 =====> 远程连接到服务器的用户

远程登录的用户=====通过xshell或SecureCRT连接服务器

方式一:w

[root@luffy-01 ~]# w   
 17:40:11 up  8:58(累计已开机时间),  2 users,  load average(平均负载): 0.00, 0.00, 0.00   load average(平均负载)
USER           TTY      FROM              LOGIN@              IDLE   JCPU   PCPU WHAT
pizza          tty1     -(代表本地)     08:44               08:53  0.09s  0.09s -bash  
root           pts/0    10.0.0.1         11:31               0.00s  0.02s  0.00s w
root           pts/1    10.0.0.1         11:55               3:35   0.00s  0.00s -bash
root           pts/2    10.0.0.1         11:55              12.00s  0.01s  0.01s -bash
远程登录的用户          从哪里登录的     什么时候连接入系统                      这个用户在做什么

系统的负载---系统繁忙程度
如果负载接近-服务cpu的核心总数

[root@luffy-01 ~]# cat /proc/cpuinfo  查看CPU信息
processor    : 0
vendor_id    : AuthenticAMD
cpu family    : 21
model        : 16
model name    : AMD Athlon(tm) X4 730 Quad Core Processor      
stepping    : 1
cpu MHz        : 2800.099
cache size    : 2048 KB
physical id    : 0
siblings    : 1
core id        : 0
cpu cores    : 1
apicid        : 0
initial apicid    : 0
fpu        : yes
fpu_exception    : yes
cpuid level    : 13
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc up rep_good tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm bmi1
bogomips    : 5600.19
TLB size    : 1536 4K pages
clflush size    : 64
cache_alignment    : 64
address sizes    : 42 bits physical, 48 bits virtual
power management:
[root@luffy-01 ~]# lscpu  查看cpu信息
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 16
Model name:            AMD Athlon(tm) X4 730 Quad Core Processor
Stepping:              1
CPU MHz:               2800.099
BogoMIPS:              5600.19
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             16K
L1i cache:             64K
L2 cache:              2048K
NUMA node0 CPU(s):     0

方式二:last

[root@luffy-01 ~]# last  谁在什么时间登陆了系统,连接了多久
root     pts/0        10.0.0.1         Tue Jan 15 08:47   still logged in   
pizza    tty1                          Tue Jan 15 08:44   still logged in 

方式三:lastlog

显示系统中所有用户的最近一次的登录信息

15、如何正确关机和重启

重启:

init 6     将启动级别改为重启

reboot  立刻重启

shutdown -r 1   一分钟后重启系统

shutdown -c     把正在关机或者重启的命令取消掉,一台远程登录重启,另一台可以在时间内停止这条命令

shutdown -r now  =====>相当于reboot

 

关机:

init 0

poweroff  会断电(物理机)

halt     需要手动关闭电源(物理机)

shutdown -h 1

shutdown -h now   ======>相当于poweroff

16、写出Linux命令行快捷键的功能

Ctrl + a   把光标移动到《行首》
Ctrl + e   把光标移动到《行尾》

Ctrl + c   取消当前的操作 cancel
Ctrl + d   logout命令(当前行没有任何内容,退出当前用户)
Ctrl + l  (小写字母L) 清除屏幕内容 clear

Ctrl + u   剪切光标所在位置到行首的内容
Ctrl + k   剪切光标所在位置到行尾的内容
ctrl + y   粘贴

ctrl + →   把光标向右移动一个单词
ctrl + ←   把光标向左移动一个单词


history |grep awk

Ctrl + r search 搜索历史命令,没有找到,继续按快捷键,继续搜索,找到了按enter

17、vi/vim快捷键初级

陈皓(左耳朵耗子)的VIM攻略

移动光标:

    ↑k
←h      →l
    ↓j

两边左右hl  中间是上下


移动到文件的第一行           gg   :1  1G
移动到文件的最后一行         G    :$
快速到达文件的第100行       100gg  100G  :100
移动光标到行首              0    ^
移动光标到行尾              $


编辑:
在当前行下一行插入一个空行并进入到编辑模式       o(小写字母O)
剪切光标所在位置到行尾的内容,然后进入编辑模式   C(大写字母C)
删除当前行的内容到行尾                          dG
撤销上一次的操作                                 u
恢复上一次的操作                            ctrl+r


复制粘贴剪切:

删除光标所在位置的内容到行尾 D

复制当前行                                      yy
剪切(删除)当前行                                dd
粘贴                                            p


搜索:
/你要找的内容    继续向下搜索n     继续向上搜索N


vim查询帮助

:h  :wq
:h  G

练习题总结

    正则表达式练习题
        取出网卡ip地址
        取出权限
    grep,sed,awk进行过滤
    find命令与其他命令配置rm ls -l sed
        三种方法
    date显示或设置系统日期
        按照你的说明显示指定的日期
        以指定格式显示日期
        自动修改系统时间
    Linux下面快捷键
    vi/vim快捷键

一、Linux定时任务crond

定时任务说明与分类

技术分享图片

定时任务的应用场景举例

每天晚上 12点备份/etc/目录

tar

定时任务的三种分类

crond(crontab)定时任务软件(软件包cronie),用的最多的一种

atd,应用在只运行一次的任务

anacron ,非7*24小时运行的服务器(比如开机多长时间运行,关机多长时间运行)

技术分享图片
[root@Dao ~]# rpm -qa cronie  查看安装的cronie软件版本
cronie-1.4.4-16.el6_8.2.x86_64
[root@Dao ~]# rpm -ql cronie   查看软件包详细列表
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond    # crond定时软件
/etc/sysconfig/crond
/usr/bin/crontab
/usr/sbin/crond
/usr/share/doc/cronie-1.4.4
/usr/share/doc/cronie-1.4.4/AUTHORS
/usr/share/doc/cronie-1.4.4/COPYING
/usr/share/doc/cronie-1.4.4/ChangeLog
/usr/share/doc/cronie-1.4.4/INSTALL
/usr/share/doc/cronie-1.4.4/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
View Code

用户与系统定时任务

系统定时任务

系统定时任务主要和四个文件有关(cron.daily、cron.hourly、cron.monthly、cron.weekly)

系统会定时自动运行文件里面的内容

[root@Dao ~]# ls -l /etc/ |grep cron.
-rw-------   1 root root    541 Aug 24  2016 anacrontab
drwxr-xr-x.  2 root root   4096 Jan 24 21:32 cron.d
drwxr-xr-x.  2 root root   4096 Sep 27  2011 cron.daily  # 每天
-rw-------   1 root root      0 Aug 24  2016 cron.deny
drwxr-xr-x.  2 root root   4096 Jan 24 21:32 cron.hourly # 每小时
drwxr-xr-x   2 root root   4096 Sep 27  2011 cron.monthly # 每月
-rw-r--r--   1 root root    457 Sep 27  2011 crontab # 系统定时任务的配置文件之一
drwxr-xr-x   2 root root   4096 Sep 27  2011 cron.weekly # 每周

#有些病毒会在文件中插入定时任务,自动运行,所以很难彻底清除

系统定时任务相关:系统定时任务+logrotate命令 完成对 日志的日志切割、日志轮询

定时对这几个文件进行切割
/var/log/cron /var/log/secure /var/log/messages

查看日志目录下的日志文件

[root@Dao ~]# ls -l /var/log/secure* /var/log/messages*
-rw------- 1 root root  1498 Jan 24 21:32 /var/log/messages
-rw------- 1 root root   438 Dec 12 12:27 /var/log/messages-20181216
-rw------- 1 root root   141 Dec 16 03:29 /var/log/messages-20181223
-rw------- 1 root root   141 Dec 23 03:14 /var/log/messages-20181230
-rw------- 1 root root   206 Jan  3 12:40 /var/log/messages-20190106
-rw------- 1 root root 45504 Jan 29 21:13 /var/log/secure
-rw------- 1 root root 40715 Dec 16 01:10 /var/log/secure-20181216
-rw------- 1 root root 49052 Dec 23 02:34 /var/log/secure-20181223
-rw------- 1 root root 22145 Dec 30 03:08 /var/log/secure-20181230
-rw------- 1 root root 33336 Jan  5 23:38 /var/log/secure-20190106

logrotate里面的内容

[root@Dao ~]# cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
[root@Dao ~]# cat /etc/logrotate.d/syslog 
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

用户的定时任务

使用的几个命令

crontab -l (list)     #查看用户的定时任务(列表)cron table
crontab -e (edit)    #编辑用户的定时任务
/var/spool/cron/root   #(root是用户名 root用户的定时任务)用户定时任务存放的目录

第一次用的时候回提示

[root@Dao ~]# crontab -l
no crontab for root   #用户没有定时任务

注:Linux中,每个用户的定时任务是分开的

在定时任务中添加项目

[root@Dao ~]# crontab -e   编辑定时任务
# 和vim的操作是一样的,我写入了# pizza然后保存退出
no crontab for root - using an empty one
crontab: installing new crontab
[root@Dao ~]# crontab -l
# pizza

定时任务的使用

在使用之前,一定要确保定时任务依赖的软件(服务)是否可以使用

# 查看定时任务是否在运行
# 第一种方法
[root@Dao ~]# /etc/init.d/crond status 
crond is stopped
# 第二种方法
[root@Dao ~]# ps -ef |grep crond
root     17714 17688  0 22:01 pts/0    00:00:00 grep crond
# 查看定时任务,是不是开机自启动,要保证重启后也在运行
[root@Dao ~]# chkconfig |grep crond
crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
# 3 位置是on就是开机自启动了

定时任务的开启和关闭

[root@Dao ~]# /etc/init.d/crond start
Starting crond:                                            [  OK  ]
[root@Dao ~]# /etc/init.d/crond status
crond (pid  17733) is running...
[root@Dao ~]# /etc/init.d/crond stop
Stopping crond:                                            [  OK  ]
[root@Dao ~]# /etc/init.d/crond status
crond is stopped

定时任务的开机启动关闭和开启

[root@Dao ~]# chkconfig crond off
[root@Dao ~]# chkconfig |grep crond
crond              0:off    1:off    2:off    3:off    4:off    5:off    6:off
[root@Dao ~]# chkconfig crond on
crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off

如何用crontab?

[root@Dao ~]# crontab --help
crontab: invalid option -- -
crontab: usage error: unrecognized option
usage:    crontab [-u user] file
    crontab [-u user] [ -e | -l | -r ]
        (default operation is replace, per 1003.2)
    -e    (edit users crontab) #查看列表  就相当于在查看/var/spool/cron/root
    -l    (list users crontab) #编辑  就相当于在编辑 /var/spool/cron/root
    -r    (delete users crontab)  #把当前都删掉,无提示,直接删
    -i    (prompt before deleting users crontab) #删除之前提示
    -s    (selinux context)  

为什么使用crontab命令,而不是直接操作/var/spool/cron/root这个文件呢?

1、命令有语法检查功能,
2、更方便

定时任务相关的文件

/var/spool/cron/  # 定时任务的配置文件所在目录
/var/log/cron     # 定时任务的日志文件 运行过程的一个记录,无法显示运行的对不对
/etc/cron.deny    # 哪些用户禁止使用定时任务 - 定时任务黑名单

关于如何看日志

技术分享图片

定时任务格式与常见写法

格式说明

什么时间做什么事情

时间分为5个部分-----分时日月周,事情就是命令或者脚本

技术分享图片

 

两个例子

技术分享图片

定时任务常用符号

*     #
/n    #隔     */10 *  *  *  * 表示每隔10分钟
-     #从哪到哪  07-08#分隔   17,18,21

例子

题目:每5分钟同步一下系统的时间

#第一个里程碑-命令
ntpdate ntp1.aliyun.com
#注意:编写定时任务要使用命令的绝对路径
/usr/sbin/ntpdate ntp1.aliyun.com
#第二个里程碑-写入定时任务
crontab -e
#在文件中写入
# sync time by pizza at 20190123 00:15
*/5 * * * *  /usr/sbin/ntpdate ntp1.aliyun.com
#第三个里程碑-检查
##1)看日志
tail -f /var/log/cron
##2)看结果
查看时间是否在跟新(可以先手动更改)

注:You have mail in /var/spool/mail/root
在修改时间时,会出现这句话。下面会说到

题目:每天的上午7点到11点,每一个小时运行cmd命令

# 注意:在写小时的时候,一定要加上00,否则就表示没分钟
* 07-11 * * * CMD     # 表示没分钟都运行
00 07-11 * * * CMD    # 表示每个小时都运行

题目:每分钟把自己的名字 追加到/oldboy/oldboy.txt

依照上面的流程:命令----写入----检查

* * * * * echo `whoami` >> /oldboy/oldboy.txt

定时任务的书写流程总结

#1、命令行测试
#2、把命令放入脚本中(命令多的时候)
#3、测试脚本是否可以使用
#4、写定时任务
#5、检查结果

定时任务九句箴言

01、定时任务命令之前要加一行注释

注:注释中写清楚备注信息,谁在什么时间做什么

02、在写定时任务的时候,使用脚本替代命令

注:超过两条命令都使用脚本

题目:每分钟显示当前系统的时间(年-月-日),追加到/tmp/time.log中

##01、命令
[root@learn-Linux001 ~]# date +%F
2019-01-30
##02、脚本
[root@learn-Linux001 ~]# mkdir -p /server/scripts
将脚本都放在/server/scripts目录下
[root@learn-Linux001 ~]# vim /server/scripts/date.sh
创建脚本,写入命令
[root@learn-Linux001 ~]# sh /server/scripts/date.sh
2019-01-30
因为创建的文件没有执行权限(默认644),所以我们使用sh来执行
[root@learn-Linux001 ~]# sh /server/scripts/date.sh >>/tmp/date.log
[root@learn-Linux001 ~]# cat /tmp/date.log
2019-01-30
测试脚本,成功
##03、脚本写入定时任务
# print date to file by pizza at 20190128 18:50
* * * * * /bin/sh  /server/scripts/date.sh >>/tmp/date.log
使用命令的绝对路径
##04、检查(看日志,看结果)
tail -f /etc/log/cron
tail -f /tmp/date.log

03、定时任务中date命令%百分号

当我们在定时任务中,直接使用命令获取时间,得到的结果为空

通过查看日志,发现,执行的命令是date +

因为,%后面的内容内忽略了,如果一定要使用,可以带上撬棍(\)

* * * * * date +\%F-\%T >> /tmp/time.txt >&1

04、运行脚本一定要使用/bin/sh

在创建脚本的时候,以sh为后缀

05、把命令或者脚本的结果定向到文件中

定时任务中,命令或者脚本结果(正确或错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中(>> /tmp/oldboy.txt 2>&1)

否则,就会导致故障

企业案例

如果没有上面所说的操作,很容易导致硬盘inode空间被占满,从而导致系统服务不正常

定时任务中,命令或者脚本的结果,没有定向到空或者文件中,系统会发邮件
#1、邮件的软件没有开启------大量的小文件堆积在/var/spool/postfix/maildrop/  ---inode满了
#2、邮件软件开启了------定时任务会不断的给root用户发邮件
you  have  new  mail  in  /var/spool/mail/root

#查看邮件服务开启没有?
[root@learn-Linux001 ~]# /etc/init.d/postfix status
master (pid  1592) is running...

06、避免不必要的程序及命令输出

tar  zcf

tar  zcvf    不可取

07、创建压缩包使用相对路径

切到目标目录的上一级打包目标

[root@learn-Linux001 ~]# cd /
[root@learn-Linux001 /]# tar zcf /tmp/ser-$(date +%F).tar etc/services 
或者
cd / && tar zcf /tmp/ser-$(date +%F).tar etc/services 

08、定时任务脚本中的程序文件,尽量使用绝对路径

否则,可能会出现找不到命令的错误

因为,定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

解决方法:

#1、使用绝对路径  /sbin/ifconfig
#2、在脚本开头重新定义一下PATH
##  export  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

用户的定时任务,默认要存放在当前用户的家目录

系统的定时任务,默认要存放在根目录下

09、系统与命令位置有关的环境变量问题

01)、定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

02)、java环境变量故障案例

linux定时任务生产java服务无法执行问题案例http://oldboy.blog.51cto.com/2561410/1541515

补充:删除大量堆积小文件

创建环境

[root@learn-Linux001 oldboy]# touch {1..500000}.txt
-bash: /bin/touch: Argument list too long  # 数量太多,无法运行,使用下面的方法
[root@learn-Linux001 oldboy]# echo {1..500000}.txt|xargs touch

最后导致no space left on device

[root@learn-Linux001 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       6.9G  1.5G  5.1G  22% /
tmpfs           926M     0  926M   0% /dev/shm
/dev/sda1       190M   35M  146M  19% /boot
[root@learn-Linux001 ~]# df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda3        452K  452K     0  100% /
tmpfs            232K     1  232K    1% /dev/shm
/dev/sda1         50K    38   50K    1% /boot

是因为inode满了

[root@learn-Linux001 ~]# cd /oldboy/
[root@learn-Linux001 oldboy]# rm -f *  
-bash: /bin/rm: Argument list too long   直接删除失败
[root@learn-Linux001 oldboy]# ls |xargs rm -f 
[root@learn-Linux001 oldboy]# ll
total 0
这样删除,成功(删除小文件)
可能会遇到更多的文件,这样也不能删除
解决办法是,筛选后进行批量删除

二、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 ~]$ \rm -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]# 
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.37\Languages

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\nstu02"

stu01

stu02

②想办法把echo打印出来的序列中的空格替换成回车不就行了嘛,于是,我们想到了tr命令。

1
2
3
4
5
6
7
8
9
10
11
[root@oldboylinux ~]# echo -e stu{01..10}|tr " " "\n"
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)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(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)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)\n$(echo $RANDOM|md5sum|cut -c 1-8)"

这一大段,看着好吓人啊,其实就是一个目的重复10次,你分开看就是这样的

【$(echo $RANDOM|md5sum|cut -c 1-8)\n】就是用来生成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# #\n#g" | awk ‘{print "useradd " $1 " -p " "echo $[RANDOM**3]|cut -c 1-8"}‘|bash
#echo stu{01..10} | sed "s# #\n#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 &\n echo &|md5sum|cut -c 1-8|passwd --stdin &/p‘|bash
#echo stu{01..10}|tr " " "\n"|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# #\n#g‘ >/mnt/pass;awk -F ":" ‘{print $1}‘ /mnt/pass |xargs -n 1 useradd;pwunconv;chpasswd </mnt/pass;pwconv

#echo stu{01..10}|tr " " "\n"|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 ‘ ‘ ‘\n‘|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# #\n#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、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跳板机

技术分享图片

总结:

技术分享图片

Linux系统初识

原文:https://www.cnblogs.com/bubu99/p/12271737.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!