1.Linux常用系统命令
echo #用于在终端输出字符串或变量
date #用于显示及设置系统的时间或日期
reboot #用于重启系统
poweroff #用于关闭系统
shutdown #用于关闭系统
wget #用于终端中下载文件
ps #用于查看系统中进程状态
top #用于动态地监视进程活动与系统负载等信息,类型Windows任务管理器 pidof #于查询某个指定服务进程的PID值,所谓进程ID
kill #用于终止某个指定PID的服务进程,所谓杀掉进程
killall #用于终止某个指定名称的服务所对应的全部进程,所谓父加子
2.Linux系统状态命令
ifconfig #用于获取网卡配置与网络状态等信息
uname #用于查看系统内核与系统版本等信息
uptime #用于查看系统的负载信息
free #用于显示当前系统中内存的使用量信息
who #用于查看当前登入主机的用户终端信息
last #用于查看所有系统的登录记录
history #用于显示历史执行过的命令,记得使用上下键 sosreport #用于收集系统配置及架构信息并输出诊断文档
3.Linux文件、目录相关命令
pwd #用于显示用户当前所处的工作目录
cd #用于切换工作路径
ls #用于显示目录中的文件信息
cat #用于查看纯文本文件
more #用于查看纯文本文件
head #于查看纯文本文档的前N行
tail #用于查看纯文本文档的后N行;或持续监控日志内容 tr #用于替换文本文件中的字符cat anaconda-ks.cfg | tr ‘a-z’ ‘A-Z’ #把小写字母转换为大写
wc #用于统计指定文本的行数、字数、字节数
stat #用于查看文件的具体存储信息等信息
cut #用于按“列”提取文本字符
cut -d ‘:’ -f2 /etc/passwd #以:分割,截取第2列
diff #用于比较多个文本文件的差异touch #用于创建空白文件
mkdir #用于创建空白目录
mkdir -p /dir1/dir2/dir3
cp #用于复制文件或目录
mv #用于移动文件或将文件重命名 #rename == mv
rm #用于删除文件或目录
file #用于查看文件类型
4.Linux访问控制台
#管理员模式
$普通用户模式虚拟控制台 由六个文本控制台和一个图形化控制台组成
Ctrl-Alt-F[1-6] #文本控制切换快捷键
Ctrl-Alt-F7 #图形化控制台
tty #用于查看当前终端的信息
echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。
[root@linux ~]# echo $SHELL
/bin/bash
date 命令用于显示及设置系统的时间或日期,格式为“date [选项]+[指定的格式]”。
参数 | 作用 |
---|---|
%t | 跳格[Tab 键] |
%H | 小时(00~23) |
%I | 小时(00~12) |
%M | 分钟(00~59) |
%S | 秒(00~59) |
%j | 今年中的第几天 |
默认格式查看当前系统时间
[root@linux ~]# date
Mon Sep 15 16:15:23 CST 2018
按“年-月-日 小时:分钟:秒”的格式查看当前系统时间
[root@linux ~]# date "+%Y-%m-%d %H:%M:%S"
2018-09-15 16:20:12
手动设置系统时间
[root@linux ~]# date -s "20180915 16:25:00"
Wed Sep 15 16:25:00 EDT 2018
date命令进行日期加减运算
[root@linux ~]# date +%Y%m%d --date="-1 day"
20180917
查看今天是当年中的第几天
[root@linux ~]# date "+%j"
261
reboot 命令用于重启系统
poweroff 命令用于关闭系统
wget 命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。
参数 | 作用 |
---|---|
-b | 后台下载模式 |
-P | 下载到指定目录 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面内所有资源,包括图片、视频等 |
-r | 递归下载 |
ps 命令用于查看系统中的进程状态,格式为“ps [参数]”。
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
a | 显示现行终端机下的所有程序,包括其他用户的程序 |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
-A | 显示所有程序 |
-c | 显示CLS和PRI栏位 |
c | 列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示 |
-C | 指令名称>:指定执行指令的名称,并列出该指令的程序的状况 |
-d | 显示所有程序,但不包括阶段作业领导者的程序 |
e | 列出程序时,显示每个程序所使用的环境变量 |
-f | 显示UID,PPIP,C与STIME栏位 |
f | 用ASCII字符显示树状结构,表达程序间的相互关系 |
g | 显示现行终端机下的所有程序,包括群组领导者的程序 |
-G | <群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定 |
-H | 显示树状结构,表示程序间的相互关系 |
-j或j | 采用工作控制的格式显示程序状况 |
-l或l | 采用详细的格式来显示程序状况 |
L | 列出栏位的相关信息 |
-m或m | 显示所有的执行绪 |
n | 以数字来表示USER和WCHAN栏位 |
-N | 显示所有的程序,除了执行ps指令终端机下的程序之外 |
-p<程序识别码> | 指定程序识别码,并列出该程序的状况 |
r | 只列出现行终端机正在执行中的程序 |
-s<阶段作业> | 指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况 |
s | 采用程序信号的格式显示程序状况 |
S | 列出程序时,包括已中断的子程序资料 |
-t<终端机编号> | 指定终端机编号,并列出属于该终端机的程序的状况 |
-T | 显示现行终端机下的所有程序 |
u | 以用户为主的格式来显示程序状况 |
-U<用户识别码> | 列出属于该用户的程序的状况,也可使用用户名称来指定 |
U<用户名称> | 列出属于该用户的程序的状况 |
v | 采用虚拟内存的格式显示程序状况 |
x | 显示所有程序,不以终端机来区分 |
X | 采用旧式的Linux i386登陆格式显示程序状况 |
-y | 配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 |
–cols<每列字符数> | 设置每列的最大字符数 |
–info | 显示排错信息 |
–lines<显示列数> | 设置显示画面的列数。 |
作用:以树状图的方式展现进程之间的派生关系,显示效果比较直观
参数 | 作用 |
---|---|
-a | 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; |
-c | 不使用精简标示法; |
-G | 使用VT100终端机的列绘图字符; |
-h | 列出树状图时,特别标明现在执行的程序; |
-H<程序识别码> | 此参数的效果和指定"-h"参数类似,但特别标明指定的程序; |
-l | 采用长列格式显示树状图; |
-n | 用程序识别码排序。预设是以程序名称来排序; |
-p | 显示程序识别码; |
-u | 显示用户名称; |
-U | 使用UTF-8列绘图字符; |
top 命令用于动态地监视进程活动与系统负载等信息。
top 命令执行结果的前 5 行为系统整体的统计信息, 其所代表的含义如下:
[root@linux ~]# top
top - 21:29:36 up 4:53, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 84 total, 1 running, 83 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 1547692 free, 143592 used, 175740 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1539432 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 46236 6784 4044 S 0.0 0.4 0:01.35 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.14 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.37 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.10 watchdog/0
参数 | 作用 |
---|---|
-b | 以批处理模式操作 |
-c | 显示完整的治命令 |
-d | 屏幕刷新间隔时间 |
-I | 忽略失效过程 |
-s | 保密模式 |
-S | 累积模式 |
-i<时间> | 设置间隔时间 |
-u<用户名> | 指定用户名 |
-p<进程号> | 指定进程 |
-n<次数> | 循环显示的次数 |
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽:
参数 | 作用 |
---|---|
h | 显示帮助画面,给出一些简短的命令总结说明; |
k | 终止一个进程; |
i | 忽略闲置和僵死进程,这是一个开关式命令; |
q | 退出程序; |
r | 重新安排一个进程的优先级别; |
S | 切换到累计模式; |
s | 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s; |
f或者F | 从当前显示中添加或者删除项目; |
o或者O | 改变显示项目的顺序; |
l | 切换显示平均负载和启动时间信息; |
m | 切换显示内存信息; |
t | 切换显示进程和CPU状态信息; |
c | 切换显示命令名称和完整命令行; |
M | 根据驻留内存大小进行排序; |
P | 根据CPU使用百分比大小进行排序; |
T | 根据时间/累计时间进行排序; |
w | 将当前设置写入~/.toprc文件中。 |
pidof 命令用于查询某个指定服务进程的 PID 值,格式为“pidof[选项] [服务名称]”。
参数 | 作用 |
---|---|
-s | 仅返回一个进程号 |
-c | 仅显示具有相同“root”目录的进程 |
-x | 显示由脚本开启的进程 |
-o | 指定不显示的进程ID |
[root@linux ~]# pidof sshd
2156
kill 命令用于终止某个指定 PID 的服务进程,格式为“kill [选项] [进程 PID]”。
killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall [选项] [服务名称]”。
ifconfig用于查看系统网络的详细信息。
[root@linux ~]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.0.128 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fe97:8cea prefixlen 64 scopeid 0x20
ether 00:0c:29:97:8c:ea txqueuelen 1000 (Ethernet)
RX packets 618 bytes 73837 (72.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 464 bytes 217122 (212.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
使用 uname 命令时,一般会固定搭配上-a 参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
[root@linux ~]# uname -a
Linux linux 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
如果要查看当前系统版本的详细信息,则需要查看
redhat-release 文件
[root@linux ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
uptime用于查看系统的负载信息。
[root@linux ~]# uptime
21:08:23 up 1:58, 2 users, load average: 0.00, 0.01, 0.05
free用于查看当前系统内存信息。
[root@linux ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 139M 1.4G 8.6M 200M 1.5G
Swap: 4.0G 0B 4.0G
who 用于查看当前登入主机的用户终端信息,格式为“who [参数]”。
[root@linux ~]# who
root pts/0 2018-09-17 01:01 (192.168.0.1)
root pts/1 2018-09-18 20:37 (192.168.0.1)
last 命令用于查看所有系统的登录记录,格式为“last [参数]”。
[root@linux ~]# last
root pts/1 192.168.0.1 Tue Sep 18 20:37 still logged in
root pts/0 192.168.0.1 Mon Sep 17 01:01 still logged in
reboot system boot 3.10.0-693.el7.x Mon Sep 17 01:01 - 21:13 (1+20:12)
root pts/0 192.168.0.1 Mon Sep 17 00:54 - down (00:06)
root pts/0 192.168.0.1 Mon Sep 17 00:00 - 00:54 (00:53)
root pts/0 192.168.0.1 Sun Sep 16 23:59 - 00:00 (00:00)
root tty1 Sun Sep 16 23:59 - 01:01 (01:02)
reboot system boot 3.10.0-693.el7.x Sun Sep 16 23:58 - 01:01 (01:03)
wtmp begins Thu Jul 19 00:11:26 2018
history 命令用于显示历史执行过的命令,格式为“history [-c]”。
[root@linux ~]# history
1 vi /etc/selinux/config
2 setenforce 0
3 iptables -nL
4 iptables -F
5 iptables -nL
6 systemctl stop firewalld
7 systemctl disable firewalld
8 mount
9 mount /dev/sr0 /media/
10 vi /etc/fstab
11 mount -a
12 cd /etc/yum.repos.d/
13 ls
14 mkdir bak
15 mv CentO* bak/
16 ls
17 vi yum.repo
18 yum clean all
19 vi yum.repo
20 yum clean all
21 yum makecache
[root@linux ~]# !13 ls
anaconda-ks.cfg
调用命令历史列表中的命令:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以 STRING 开头的命令;
调用上一条命令的最后一个参数:
快捷键:ESC, . 这里是逗号和点号字符串:!$
历史命令会被保存到用户家目录中的.bash_history 文件中。
[root@linux ~]# cat ~/.bash_history
yum install wget
ifconfig
reboot
c
lspic -v
lspic
more /proc/cpuinfo
more /proc
fdisk -l
ls
vi test.txt
ifconfig
ls
vi test.txt
reboot -h +5
[root@linux ~]# history -c
参数 | 功能 |
---|---|
-c | 清空命令历史,当前命里历史列表中的数据 |
-d offset | 删除指定命令历史 |
-r | 从文件读取命令历史至历史列表中 |
-w | 把历史列表中的命令追加至历史文件中 |
作用:用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。
执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序。单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。
[root@linux ~]# w
21:21:02 up 4:45, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 21:19 1:10 0.01s 0.01s -bash
root pts/0 192.168.0.1 21:20 6.00s 0.02s 0.01s w
语法:w [选项] [用户名]
参数 | 作用 |
---|---|
-h | 不打印头信息; |
-u | 当显示当前进程和cpu时间时忽略用户名; |
-s | 使用短输出格式; |
-f | 显示用户从哪登录; |
pwd 命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”。
[root@linux ~]# pwd
/root
cd 命令用于切换工作路径,格式为“cd [目录名称]”。
[root@linux ~]# cd /etc
同样的道理,可使用下述命令切换到/bin 目录中:
[root@linux etc]# cd /bin
此时,要返回到上一次的目录(即/etc 目录),可执行如下命令:
[root@linux bin]# cd -
/etc
[root@linux etc]#
还可以通过下面的命令快速切换到用户的家目录:
[root@linux etc]# cd ~
[root@linux ~]#
ls 命令用于显示目录中的文件信息,格式为“ls [选项] [文件] ”。
使用 ls 命令的“-a”参数看到全部文件(包括隐藏文件),使用“-l”参数可以查看文件的属性、大小等详细信息。
[root@linux ~]# ls -al
total 112
dr-xr-x---. 2 root root 4096 Sep 17 00:55 .
dr-xr-xr-x. 19 root root 251 Sep 18 23:13 ..
-rw-------. 1 root root 1401 Jul 19 00:10 anaconda-ks.cfg
-rw-------. 1 root root 25372 Sep 18 21:21 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 192 Sep 15 21:10 .bashrc
-rw-r--r--. 1 root root 100 Dec 29 2013 .cshrc
-rw-r--r--. 1 root root 503 Jul 21 20:54 fstab.new
-rw-------. 1 root root 43 Sep 18 16:55 .lesshst
-rw-r--r--. 1 root root 8159 Sep 8 21:21 ls_help_text
-rw-r--r--. 1 root root 12 Sep 8 21:21 output
-rw-r--r--. 1 root root 3 Jul 21 18:47 out.put
-rw-r--r--. 1 root root 2802 Jul 21 19:11 STD
-rw-r--r--. 1 root root 85 Sep 8 21:22 stderr
-rw-r--r--. 1 root root 0 Jul 21 19:10 STDERR
-rw-r--r--. 1 root root 12 Jul 21 19:05 stdin
-rw-r--r--. 1 root root 3 Jul 21 19:07 stdout
-rw-r--r--. 1 root root 0 Jul 21 19:09 STDOUT
-rw-r--r--. 1 root root 129 Dec 29 2013 .tcshrc
-rw-r--r--. 1 root root 401 Sep 15 22:17 test.txt
-rw-r--r--. 1 root root 12288 Jul 21 20:25 .test.txt.swp
如果想要查看目录属性信息,则需要额外添加一个-d 选项。
[root@linux ~]# ls -ld
dr-xr-x---. 2 root root 4096 Sep 17 00:55
如果想要查看文件的大小,则需要添加一个-h 选项。
[root@linux ~]# ls -lhd
dr-xr-x---. 2 root root 4.0K Sep 17 00:55
cat 命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”。
如果在查看文本内容时想显示行号,在 cat 命令后面追加一个 -n 参数。
[root@linux ~]# cat -n anaconda-ks.cfg
1 #version=DEVEL
2 # System authorization information
3 auth --enableshadow --passalgo=sha512
4 # Use CDROM installation media
5 cdrom
6 # Use graphical install
7 graphical
8 # Run the Setup Agent on first boot
9 firstboot --enable
10 ignoredisk --only-use=sda
more 命令用于查看纯文本文件(内容较多的),格式为“more [选项] 文件”。
[root@linux ~]# more /etc/rc.d/init.d/functions
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
TEXTDOMAIN=initscripts
# Make sure umask is sane
umask 022
# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH
if [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] && \
[ -d /run/systemd/system ] ; then
case "$0" in
/etc/init.d/*|/etc/rc.d/init.d/*)
_use_systemctl=1
;;
esac
fi
--More--(2%)
head 命令用于查看纯文本文档的前 N 行,格式为“head [选项] [文件]”。
查看文本中前 10 行的内容
[root@linux ~]# head -10 /etc/rc.d/init.d/functions
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
TEXTDOMAIN=initscripts
# Make sure umask is sane
umask 022
tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail [选项] [文件]”。
实时查看最新日志文件
[root@linux ~]# tail -f /var/log/messages
Sep 19 05:28:19 linux systemd: Created slice User Slice of root.
Sep 19 05:28:19 linux systemd: Starting User Slice of root.
Sep 19 05:28:19 linux systemd: Started Session 2 of user root.
Sep 19 05:28:19 linux systemd-logind: New session 2 of user root.
Sep 19 05:28:19 linux systemd: Starting Session 2 of user root.
Sep 19 05:33:21 linux dhclient[821]: DHCPREQUEST on ens33 to 192.168.0.254 port 67 (xid=0x35fa5af3)
Sep 19 05:33:21 linux dhclient[821]: DHCPACK from 192.168.0.254 (xid=0x35fa5af3)
Sep 19 05:33:23 linux dhclient[821]: bound to 192.168.0.128 -- renewal in 893 seconds.
Sep 19 05:37:15 linux systemd: Starting Cleanup of Temporary Directories...
Sep 19 05:37:15 linux systemd: Started Cleanup of Temporary Directories.
tr 命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。
参数 | 作用 |
---|---|
-c | 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。 |
-d | 删除字符串1中所有输入字符。 |
-s | 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。 |
把某个文本内容中的英文全部替换为大写
[root@linux ~]# cat anaconda-ks.cfg | tr [a-z] [A-Z] #VERSION=DEVEL
# SYSTEM AUTHORIZATION INFORMATION AUTH --ENABLESHADOW --PASSALGO=SHA512
# USE CDROM INSTALLATION MEDIA CDROM
# USE GRAPHICAL INSTALL GRAPHICAL
# RUN THE SETUP AGENT ON FIRST BOOT FIRSTBOOT --ENABLE
IGNOREDISK --ONLY-USE=SDA # KEYBOARD LAYOUTS
KEYBOARD --VCKEYMAP=US --XLAYOUTS='US' # SYSTEM LANGUAGE
LANG EN_US.UTF-8
# NETWORK INFORMATION
NETWORK --BOOTPROTO=DHCP --DEVICE=ENO16777728 --ONBOOT=OFF -- IPV6=AUTO
NETWORK --HOSTNAME=linux.COM
# ROOT PASSWORD ROOTPW --ISCRYPTED
$6$HFRQIKOPAK5JQAWM$AVUYZ3JQZ4WAWCPLRHBPM08GNDZRBIVU2BG.RTM IXVZODSZK/PFUZJ8OKEWE0MDCX66OK3/BNYWKYGAIPGUFP.
# SYSTEM TIMEZONE
TIMEZONE AMERICA/NEW_YORK --ISUTC # SYSTEM BOOTLOADER CONFIGURATION
BOOTLOADER --APPEND=" CRASHKERNEL=AUTO" --LOCATION=MBR --BOOT- DRIVE=SDA
AUTOPART --TYPE=LVM
# PARTITION CLEARING INFORMATION CLEARPART --ALL --INITLABEL --DRIVES=SDA
%PACKAGES @^MINIMAL @CORE KEXEC-TOOLS
%END
%ADDON COM_REDHAT_KDUMP --ENABLE --RESERVE-MB='AUTO'
%END
wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
统计当前系统中有多少个用户
[root@linux ~]# wc -l /etc/passwd
22 /etc/passwd
stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。
stat 命令可以用于查看文件的存储信息和时间等信息,有点类似于我们在 windows 上对一个文件右键属性出来的信息。
[root@linux ~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1401 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 67145602 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2018-09-18 21:39:25.896599790 +0800
Modify: 2018-07-19 00:10:55.656029536 +0800
Change: 2018-07-19 00:10:55.656029536 +0800
Birth: -
cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。
参数 | 作用 |
---|---|
-b | 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 |
-c | 以字符为单位进行分割。 |
-d | 自定义分隔符,默认为制表符。 |
-f | 与-d一起使用,指定显示哪个区域。 |
-n | 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除。 |
以字节截取第四个字节,及前三个字节:
[root@linux ~]# who
root tty1 2018-10-31 16:03
root pts/0 2018-10-31 16:02 (192.168.130.1)
[root@linux ~]# who | cut -b 4
t
t
[root@linux ~]# who | cut -b 1-3
roo
roo
[root@linux ~]# who | cut -b 1,2,3
roo
roo
使用-c截取中文字符:
[root@linux ~]# cat cut.txt
周杰伦
邓紫棋
薛之谦
李荣浩
小工匠
若还用-b参数,则会出问题:
[root@linux ~]# cat cut.txt | cut -b 3
¨
[root@linux ~]#
[root@linux ~]# cut -b 3 cut.txt
¨
使用-c参数:
[root@linux ~]# cut -c 3 cut.txt
伦
棋
谦
浩
匠
此处-c会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。
若还想使用-b参数,可以加入-n一起使用:
[root@entel2 ~]# cat cut.txt |cut -b 2
°
[root@entel2 ~]# cat cut.txt |cut -nb 2
[root@entel2 ~]# cat cut.txt |cut -nb 1,2,3
周
邓
薛
李
小
使用-d和-f参数一起截取etc/passwd文件中第一列的用户名:
[root@linux ~]# cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
······
diff 命令用于比较多个文本文件的差异,格式为“diff [选项] 文件”。
使用 cat 命令分别查看 diff_A.txt 和 diff_B.txt 文件的内容,然后进行比较:
[root@linux ~]# cat diff_A.txt Welcome to linux.com
Red Hat certified Free Linux Lessons
[root@linux ~]# cat diff_B.txt
Welcome to linux.com #Red Hat certified
Free Linux Lessons
使用 diff --brief 命令显示比较后的结果,判断文件是否相同:
[root@linux ~]# diff --brief diff_A.txt diff_B.txt
Files diff_A.txt and diff_B.txt differ
使用带有-c 参数的 diff 命令来描述文件内容具体的不同:
[root@linux ~]# diff -c diff_A.txt diff_B.txt
*** diff_A.txt 2018-08-16 05:54:38.440500149 -0400
--- diff_B.txt 2018-08-16 05:55:09.921497634 -0400
***************
*** 1,3 ****
Welcome to linux.com
! Red Hat certified Free Linux Lessons
--- 1,3 ----
Welcome to linux.com
! #Red Hat certified
Free Linux Lessons
使用 diff 命令结合后面要讲的重定向,生成一个补丁文件,其中,字母"a"、“d”、"c"分别表示添加、删除及修改操作。
[root@linux mnt]# diff diff_A.txt diff_B.txt 1,3c1,3
< Welcome to linux.com
< #Red Hat certified
< Free Linux Lessons
---
> Welcome tooo linux.com
> Red Hat certified
> Free Linux LeSSonS
[root@linux mnt]# diff diff_A.txt diff_B.txt > path.file [root@linux mnt]# cat path.file
2c2
< Red Hat certified
---
> #Red Hat certified
参数 | 作用 |
---|---|
-u | 显示有差异行的前后几行(上下文), 默认是前后各 3 行, 这样,patch中带有更多的信息., |
-p | 显示代码所在的 c 函数的信息。 |
-r | 递归地对比一个目录和它的所有子目录(即整个目录树)。 |
-N | 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当 diff 发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分. |
patch 被用于为开放源代码软件安装补丁程序。让用户利用设置修补文件的方式,修改,更新原始文件。
使用 diff 命令生成的 patch.file 为 diff_A.txt 升级或者还原
[root@linux mnt]# patch diff_A.txt < path.file patching file diff_A.txt
[root@linux mnt]# patch -R diff_A.txt < path.file patching file diff_A.txt
针对文件内容进行过滤显示,是一种强大的文本搜索工具, 它能使用正则表达式搜索文本,并把匹配的行打印出来。
[root@linux ~]# cat test.txt
wer
tyter
dxvsd
sdhrte
xcgsef
werwt
awer
ytye
wer
sdfytry
dfvg
werwer
wer
wer
[root@linux ~]# grep "wer" test.txt
wer
werwt
awer
wer
werwer
wer
wer
参数 | 作用 |
---|---|
-a | 不要忽略二进制数据 |
-A | <显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容 |
-B | 在显示符合范本样式的那一行之外,并显示该行之前的内容 |
-b | 显示匹配到的字符在文件中的偏移地址 |
-c | 计算符合范本样式的列数 |
-C | <显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容 |
-d | <进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作 |
-e | <范本样式> 指定字符串作为查找文件内容的范本样式 |
-E | 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式 |
-f | <范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式 |
-F | 将范本样式视为固定字符串的列表 |
-G | 将范本样式视为普通的表示法来使用 |
-h | 在显示符合范本样式的那一列之前,不标示该列所属的文件名称 |
-H | 在显示符合范本样式的那一列之前,标示该列的文件名称 |
-i | 忽略字符大小写的差别 |
-l | 列出文件内容符合指定的范本样式的文件名称 |
-L | 列出文件内容不符合指定的范本样式的文件名称 |
-n | 在显示符合范本样式的那一列之前,标示出该列的编号 |
-q | 不显示任何信息 |
-R/-r | 此参数的效果和指定“-d recurse”参数相同 |
-s | 不显示错误信息 |
-v | 反转查找 |
-V | 显示软件版本信息 |
-w | 只显示全字符合的列 |
-x | 只显示全列符合的列 |
-y | 此参数效果跟“-i”相同 |
-o | 只输出文件中匹配到的部分 |
touch 命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。
参数 | 作用 |
---|---|
-a | 仅修改“读取时间”(atime) |
-m | 仅修改“修改时间”(mtime) |
-d | 同时修改 atime 与 mtime |
使用 ls 命令查看一个文件的修改时间,然后修改这个文件,最后再通过 touch 命令把修改后的文件时间设置成修改之前的时间
[root@linux ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1213 Sep 12 15:44 anaconda-ks.cfg
[root@linux ~]# echo "Visit the linux.com to learn linux skills" >> anaconda-ks.cfg
[root@linux ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1260 Sep 15 16:26 anaconda-ks.cfg [root@linux ~]# touch -d "2018-09-12 15:44" anaconda-ks.cfg [root@linux ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1260 Sep 12 15:44 anaconda-ks.cfg
mkdir 命令用于创建空白的目录,格式为“mkdir [选项] 目录”。
除了能创建单个空白目录外,mkdir 命令还可以结合-p 参数来递归创建出具有嵌套叠层关系的文件目录。
[root@linux ~]# mkdir linux
[root@linux ~]# cd linux
[root@linux linux]# mkdir -p a/b/c/d/e
[root@linux linux]# cd a
[root@linux a]# cd b
[root@linux b]#
cp 命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。
参数 | 作用 |
---|---|
-p | 保留原始文件的属性 |
-d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
-r | 递归持续复制(用于目录) |
-i | 若目标文件存在则询问是否覆盖 |
-a | 相当于-pdr(p、d、r 为上述参数) |
使用 touch 创建一个名为 install.log 的普通空白文件,然
后将其复制为一份名为 x.log 的备份文件,最后再使用 ls 命令查看目录中的文件
[root@linux ~]# touch install.log
[root@linux ~]# cp install.log x.log
[root@linux ~]# ls install.log x.log
mv 命令用于剪切文件或将文件重命名,格式为“mv [选项] 源文件
[目标路径|目标文件名]”。
mv 命令是以后工作中会经常使用到的命令,下面要讲的 rm 是一个比较危险的操作,在我们的生产环境中,一般都是使用 mv 命令备份到其他目录下替代 rm 命令
[root@linux ~]# mv x.log linux.log
[root@linux ~]# ls install.log linux.log
rm 命令用于删除文件或目录,格式为“rm [选项] 文件”。
想要删除一个目录,需要在 rm 命令后面一个-r 参数才可以,否则删除不掉。
dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件, 格式为“dd [选项]” 。
参数 | 作用 |
---|---|
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个“块”的大小 |
count | 设置要复制“块”的个数 |
dd 命令的功能也绝不仅限于复制文件这么简单。如果您想把光驱设备中的光盘制作成 iso 格式的镜像文件,在 Windows 系统中需要借助于第三方软件才能做到,但在 Linux 系统中可以直接使用 dd 命令来压制出光盘镜像文件,将它变成一个可立即使用的 iso 镜像:
[root@linux ~]# dd if=/dev/cdrom of=CentOS-server-7.0-x86_64- linux.Com.iso
7311360+0 records in
7311360+0 records out
3743416320 bytes (3.7 GB) copied, 370.758 s, 10.1 MB/s
file 命令用于查看文件的类型,格式为“file 文件名”。
在 Linux 系统中,由于文本、目录、设备等所有这些一切都统称为文件,而我们又不能单凭后缀就知道具体的文件类型,这时就需要使用 file 命令来查看文件类型了。
[root@linux ~]# file anaconda-ks.cfg anaconda-ks.cfg: ASCII text
[root@linux ~]# file /dev/sda
/dev/sda: block special
以树状图的方式展现进程之间的派生关系,显示效果比较直观
参数 | 作用 |
---|---|
-a | 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; |
-c | 不使用精简标示法; |
-G | 使用VT100终端机的列绘图字符; |
-h | 列出树状图时,特别标明现在执行的程序; |
-H<程序识别码> | 此参数的效果和指定"-h"参数类似,但特别标明指定的程序; |
-l | 采用长列格式显示树状图; |
-n | 用程序识别码排序。预设是以程序名称来排序; |
-p | 显示程序识别码; |
-u | 显示用户名称; |
-U | 使用UTF-8列绘图字符; |
tar 命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。
参数 | 作用 |
---|---|
-c | 创建压缩文件 |
-x | 解开压缩文件 |
-t | 查看压缩包内有哪些文件 |
-z | 用 Gzip 压缩或解压 |
-j | 用 bzip2 压缩或解压 |
-v | 显示压缩或解压的过程 |
-f | 目标文件名 |
-p | 保留原始的权限与属性 |
-P | 使用绝对路径来压缩 |
-C | 指定解压到的目录 |
使用 tar 命令把/etc 目录通过 gzip 格式进行打包压缩,并把文件命名为 etc.tar.gz:
[root@linux ~]# tar -czvf etc.tar.gz /etc tar: Removing leading '/' from member names
/etc/
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/fonts/
/etc/fonts/conf.d/
/etc/fonts/conf.d/65-0-madan.conf
/etc/fonts/conf.d/59-liberation-sans.conf
/etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
/etc/fonts/conf.d/59-liberation-mono.conf
/etc/fonts/conf.d/66-sil-nuosu.conf
......
接下来将打包后的压缩包文件指定解压到/root/etc 目录中(先使用
mkdir 命令来创建/root/etc 目录):
[root@linux ~]# mkdir /root/etc
[root@linux ~]# tar xzvf etc.tar.gz -C /root/etc
etc/
etc/fstab
etc/crypttab
etc/mtab
etc/fonts/ etc/fonts/conf.d/
etc/fonts/conf.d/65-0-madan.conf
etc/fonts/conf.d/59-liberation-sans.conf
etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
etc/fonts/conf.d/59-liberation-mono.conf
etc/fonts/conf.d/66-sil-nuosu.conf
etc/fonts/conf.d/65-1-vlgothic-gothic.conf
etc/fonts/conf.d/65-0-lohit-bengali.conf
etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf
......
find 命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。
参数 | 作用 |
---|---|
-name | 匹配名称 |
-perm | 匹配权限(mode 为完全匹配,-mode 为包含即可) |
-user | 匹配所有者 |
-group | 匹配所有组 |
-mtime -n +n | 匹配修改内容的时间(-n 指 n 天以内,+n 指 n 天以前) |
-atime -n +n | 匹配访问文件的时间(-n 指 n 天以内,+n 指 n 天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n 指 n 天以内,+n 指 n 天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所有组的文件 |
-newer f1 !f2 | 匹配比文件 f1 新但比 f2 旧的文件 |
–type b/d/c/p/l/f | 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
-size | 匹配文件的大小(+50KB 为查找超过 50KB 的文件,而-50KB 为查找小于 50KB 的文件) |
-prune | 忽略某个目录 |
-exec ……{}; | 后面可跟用于进一步处理搜索结果的命令(下文会有演示) |
[root@linux ~]# find 路径 参数
时间查找参数 | 作用 |
---|---|
-atime n | 将n*24小时内存取过的的文件列出来 |
-ctime n | 将n*24小时内改变、新增的文件或者目录列出来 |
-mtime n | 将n*24小时内修改过的文件或者目录列出来 |
-newer file | 把比file还要新的文件列出来 |
与使用者或组名有关参数 | 作用 |
---|---|
-gid n | 寻找群组ID为n的文件 |
-group name | 寻找群组名称为name的文件 |
-uid n | 寻找拥有者ID为n的文件 |
-user name | 寻找用户者名称为name的文件 |
-nouser | 寻找文件的拥有者不存在 /etc/passwd 的人! |
-nogroup | 寻找文件的拥有群组不存在于 /etc/group 的文件 |
根据文件类型查找
参数 | 文件类型 |
---|---|
f | 普通文件 |
d | 目录文件 |
l | 符号链接文件 |
b | 块设备文件 |
c | 字符设备文件 |
p | 管道文件 |
s | 套接字文件 |
例:搜寻 /home 底下属于john 的文件
[root@MySQL-master tmp]# find /home -user john
例:搜寻系统中不属于任何人的文件
[root@MySQL-master tmp]# find / -nouser
例:找出档名为 passwd 这个档案
[root@MySQL-master tmp]# find / -name passwd
/tmp/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd
例:找出系统中,大于1MB的档案
[root@MySQL-master tmp]# find / -size +1000k
1、查找/var 目录下属主为 root,且属组为 mail 的所有文件或目录;
[root@linux ~]# find /var -user root -a -group mail -ls
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录; 用两种方法;
[root@linux ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
[root@linux ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用 户也不是hadoop用户的文件或目录;
[root@linux ~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
[root@linux ~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件 或目录;
[root@linux ~]# find / \( -nouser -o -nogroup \) -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
[root@linux ~]# find /etc -size +1M -type f -exec ls -lh {} \;
6、查找/etc目录下所有用户都没有写权限的文件;
[root@linux ~]# find /etc -not -perm /222 -type f -ls
7、查找/etc目录至少有一类用户没有执行权限的文件;
[root@linux ~]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户 有写权限的所有文件;
[root@linux ~]# find /etc -perm -113 -type f -ls
那exec和xargs有什么区别呢?
find . -name “.txt" -exec rm {} ;
find . -name ".txt” | xargs rm {}
-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name “*.txt” print0 |xargs -0 rm {}
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo, 这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
xargs常用场景:
1、假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs下载所有链接
[root@linux ~]# cat list.txt | xargs wget –c
2、查找所有的jpg文件并压缩
[root@linux ~]# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
find / -name *.jpg -type f -exec tar -cvzf images.tar.gz {} \;
3、一个文件夹下文件太多,使用rm删除就会出现/bin/rm: Argument list too long错误,当然使用别的命令也是一样的错误, 像ls,chmod等。
解决方法
方法1:
ls | xargs -n 10 rm -fr ls
方法2:
find . -maxdepth 1 -name "*.sh" -type f -exec rm -f {} \;
练习:
1、查找/var 目录下属主为 root,且属组为 mail 的所有文件或目录
[root@linux ~]# find /var -user root -a -group mail -ls
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录; 用两种方法;
[root@linux ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
[root@linux ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用 户也不是hadoop用户的文件或目录;
[root@linux ~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
[root@linux ~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件 或目录;
[root@linux ~]# find / \( -nouser -o -nogroup \) -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
[root@linux ~]# find /etc -size +1M -type f -exec ls -lh {} \;
6、查找/etc目录下所有用户都没有写权限的文件;
[root@linux ~]# find /etc -not -perm /222 -type f -ls
7、查找/etc目录至少有一类用户没有执行权限的文件;
[root@linux ~]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户 有写权限的所有文件;
[root@linux ~]# find /etc -perm -113 -type f -ls
正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式
Linux中的正则表达式,常应用正则表达式的命令是grep(egrep),sed,awk。Linux下三剑客!
正则表达式分为两种:
参数 | 作用 |
---|---|
–color | 匹配到的字符串显示颜色 |
-i | 忽略字符大小写 |
-o | 仅显示匹配的字串 |
-v | 反向选取, 即显示不匹配的行 |
-E | 使用扩展正则表达式 |
-n | 显示行号 |
-w | 匹配指定的字符串 |
元数据 | 意义和范例 |
---|---|
^word | 搜寻word开头的行 |
搜寻以#开头的行,grep -n ‘^#’ file | |
word$ | 搜寻word结尾的行 |
搜寻以.结尾的行,grep -n ‘.$’ file | |
. | 匹配任意一个字符 |
匹配e和e之间有任意一个字符,grep -n ‘e.e’ file | |
\ | 转义字符 |
* | 前面的一个字符重复0到多次 |
匹配gle,gogle,google,gooogle等,grep -n ‘go*gle’ file | |
[list] | 匹配一系列字符中的一个 |
[n1-n2] | 匹配一个字符范围中的一个字符 |
匹配数字字符,grep -n ‘[0-9]’ file | |
[^list] | 匹配字符集以外的字符 |
匹配非o字符,grep -n ‘[^o]’ file | |
{n1,n2} | 前面的单个字符重复n1,n2次 |
匹配google,gooogle,grep -n ’ go{2,3}gle ’ file | |
单词的开头 |
|
匹配以g开头的单词,grep -n | |
word> | 单词的结尾 |
匹配以tion结尾的单词,grep -n tion> file | |
‘ ‘ | 强引用,引号内的内容不变 |
“ ” | 弱引用,变量会替换 |
[[:alnum:]] | 代表英文大小写字符及数字,即 0-9, A-Z, a-z |
[[:alpha:]] | 代表任何英文大小写字符,即 A-Z, a-z |
[[:space:]] | 任何会产生空白的字符,包括空白键, [Tab] 等等 |
[[:digit:]] | 代表数字,即 0-9 |
[[:lower:]] | 代表小写字符,即 a-z |
[[:upper:]] | 代表大写字符,即 A-Z |
grep一般情况下支持基本正则表达式,可以通过参数-E支持扩展正则表达式,另外grep单独提供了一个扩展命令叫做egrep用来支持扩展正则表达式,这条命令和grep -E等价(grep -E == egrep)
一般情况下,基本正则表达式就够用了
特殊情况下,复杂的扩展表达式,可以简化字符串的匹配
扩展正则表达式就是在基本正则表达式的基础上,增加了一些元数据
元数据 | 意义和范例 |
---|---|
+ | 重复前面字符1到多次 |
匹配god,good,goood等字符串,grep -nE go+d’ file | |
? | 匹配0或1次前面的字符 |
匹配gd,god,grep -nE ‘go?d’ file | |
| | 或or的方式匹配多个字符串 |
匹配god或者good,grep -nE’god | |
() | 匹配整个括号内的字符串,原来都是匹配单个字符 |
搜索good或者glad,grep -nE 'g(oo | |
* | 前面的字符重复0到多次 |
例题:
#1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
cat /proc/meminfo |grep -i "^s" cat /proc/meminfo |grep "^\(s\|S\)"
#2、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd |grep -v ":/bin/bash$"
#3、显示用户rpc默认的shell程序
cat /etc/passwd |grep -w "^rpc" |cut -d: -f 7
#4、找出/etc/passwd中的两位或三位数
cat /etc/passwd |grep -wo "[[:digit:]]\{2,3\}"
#5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
cat /etc/grub2.cfg | grep "^[[:space:]]\+[^' '].*" cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]].*"
#6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
netstat -tan | grep ".*LISTEN[[:space:]]*$"
#7、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d: -f1,3 |grep -w "[1-9][0-9]\{,2\}$"
#8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
cat /etc/passwd |grep -w "^\([^:]*\):.*/\1$"
#9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep "^/dev/sd"|grep -wo "[0-9]\+%"|sort -nr
#10、显示三个用户root、mage、wang的UID和默认shell
cat /etc/passwd |grep -w "^\(root\|mage\|wang\)" |cut -d: -f 3,7
#11、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions |grep -i "^\([_[:alnum:]]\+(\)"
#12、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions" | grep -Eo "[^/]*[/]?$"|tr -d "/"
#13、使用egrep取出上面路径的目录名
echo "/etc/rc.d/init.d/" | grep -Eo ".*[/]\<"
#14、统计last命令中以root登录的每个主机IP地址登录次数
last |grep -w "^root.*\"
#步骤拆解 #2
#25
#255
要注意规律
#ifconfig | grep -E "\<([1-9]|[1-9][0-9])\>" #| 为或
#ifconfig | grep -E '\<(1[0-9][0-9])\>'
#ifconfig | grep -E '\<(2[0-4][0-9]|25[0-5])\>'
截取文件test内的内容:
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn’t fit me.
However, this dress is about $ 3183 dollars.^M
GNU is free air not free beer.^M
Her hair is very beauty.^M
I can’t finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.
the symbol ‘*’ is represented as start.
Oh! My god!
The gd software is a library for drafting programs.^M
You are the best is mean you are the no. 1.
The world is the same with “glad”.
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let’s go.
# I am ghost
#19. 取得 test 或 taste 这两个单字相关信息及行号
grep -n 't[ae]st' test
#20.不想取 oo 前面有 g 的字符相关信息及行号
grep -n 'oo' test | grep -v 'goo'
#21.oo 前面不想要有小写的字符相关信息及行号
grep -n 'oo' test | grep -v '[[:lower:]]oo'
#22.取得行尾结束为小数点相关信息及行号
grep -n '\.$' test
#23.取得空白行相关信息及行号
grep -n '^$' test
#24.取得g??d 的字符相关信息及行号
grep -n 'g..d' test
#25.取得至少两个 o 以上的字符相关信息及行号
grep -n 'o\{2\}' test
#26.取得开头与结尾都是 g ,两个g 之间仅能存在至少一个 o 相关信息及行号
grep -n 'go*g' test
#27.取得g 开头与 g 结尾的字符,当中的字符可有可无 相关信息及行号
grep -n 'g.*g' test
#28.取得g 后面连接2到5个 o,然后再接一个 g 的字符相关信息及行号
grep -n 'go\{2,5\}g' test
sort 就是将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort 参数 文件(-o 输出文件)
参数 | 作用 |
---|---|
-b | 忽略每行开头空格字符 |
-c | 检查文件是否已按顺序排序 |
-f | 忽略大小写 |
-M | 将前三个字母按月份进行排序 |
-n | 依照数值大小进行排序 |
-o | 输出文件 |
-r | 以从大到小排序 |
-t <分隔符> | 指定排序区间分隔符 |
-k | 选择排序区间 |
-u | 去除重复项 |
[root@linux project]# cat test1
apple
xiaomi
google
apple
baidu
sohu
android
xunlei
[root@linux project]# sort test1
android
apple
baidu
google
sohu
xiaomi
xunlei
[root@linux project]# cat test1
apple
xiaomi
google
apple
baidu
sohu
android
xunlei
[root@linux project]# sort -u test1
android
apple
baidu
google
sohu
xiaomi
xunlei
当-u和-k一起使用时,sort只会对-k参数指定的部分进行比较,若-k指定部分相同则一样会过滤掉不输出。
[root@linux project]# cat test1
apple
xiaomi
google
apple
baidu
sohu
android
xunlei
[root@linux project]# sort -r test1
xunlei
xiaomi
sohu
google
baidu
apple
android
由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。
但如果想把排序结果输出到原文件中,用重定向可就不行了。
[rocrocket@rocrocket programming]$ sort -r number > number
[rocrocket@rocrocket programming]$ cat number
[rocrocket@rocrocket programming]$
number清空了!!!
所以在这里我们就需要用-o参数
[root@linux project]# cat number
1
3
5
2
4
[root@linux project]# sort -r number -o number
[root@linux project]# cat number
5
4
3
2
1
[root@linux project]# cat number
3
25
1
564
43
47
234
4
56725
1
324
4
32
[root@linux project]# sort number
1
1
234
25
3
32
324
4
4
43
47
564
56725
[root@linux project]# sort -n number
1
1
3
4
4
25
32
43
47
234
324
564
56725
在sort排序中,-t如果不指定分隔符时,一般默认以空格作为分隔符
sort中-t和-k一般结合使用,例如:
[root@linux project]# cat test3
apple:50:5000
android:60:6000
google:100:5500
baidu:110:5500
sohu:55:7000
xiaomi:65:4000
xunlei:50:6000
[root@linux project]# sort -n -t: -k2 test3
apple:50:5000
xunlei:50:6000
sohu:55:7000
android:60:6000
xiaomi:65:4000
google:100:5500
baidu:110:5500
例题:
[root@linux project]# cat test2
apple 50 5000
android 60 6000
google 100 5500
baidu 110 5500
sohu 55 7000
xiaomi 65 4000
xunlei 50 6000
以空格作为分隔符,以第二列数据作为排序标准,若第二列中有重复数据则比较第三列:
[root@linux project]# sort -n -t' ' -k 2,3 test2
apple 50 5000
xunlei 50 6000
sohu 55 7000
android 60 6000
xiaomi 65 4000
google 100 5500
baidu 110 5500
以空格作为分隔符,只以第一列的第二位作为排序标准,若有重复数据则只比较第三列:
[root@linux project]# sort -n -t' ' -k 1.2,1.2 -k 3,3 test2
xiaomi 65 4000
apple 50 5000
baidu 110 5500
google 100 5500
android 60 6000
xunlei 50 6000
sohu 55 7000
[root@linux project]# sort -n -k 2.2,3.1 test2
apple 50 5000
android 100 6000
google 100 5500
baidu 110 5500
以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。
第一行,会提取0 5,第二行提取00 6,第三行提取00 5,第四行提取10 5。
又因为sort认为0小于00小于000小于0000….
原因:sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。
用一个范例即可证实:
[root@linux project]# sort -n -k 2.2,3.1 -k3.1 test2
apple 50 5000
google 100 5500
android 100 6000
baidu 110 5500
Vi文文本编辑器,是Visual interface的简称。(无敌编辑器)
Vim它是Vi的增强版,即Vi Improved。(vim需要安装)
Vi有四种模式:
Vim拥有5种编辑模式:命令模式、输入模式、末行模式、可视化 模式、查询模式。
操作类型 | 命令 | 作用 |
---|---|---|
光标移动 | h、j、k、l | 左、下、上、右 |
⬅、⬇、⬆、➡ | 左、下、上、右 | |
删除 | dd | 删除(剪切)光标所在整行 |
#dd | 删除(剪切)从光标处开始的#行 | |
d^ | 删除当前光标之前本行所有字符 | |
d$ | 删除当前光标之后本行所有字符 | |
删除列 | 若想删除一列,可以在命令模式下按ctrl + v,然后使用光标整列选取删除 | |
复制 | yy | 复制光标所在整行 |
#yy | 复制从光标处开始的#行 | |
粘贴 | p | 剪切(dd)或复制(yy)过的数据粘贴到光标后面 |
P | 剪切(dd)或复制(yy)过的数据粘贴到光标前面 | |
搜索 | /word | 从上而下在文中查找字符串“word” |
word | 从下而上在文中查找字符串“word” | |
n | 显示搜索命令定位到的下一个字符串 | |
N | 显示搜索命令定位到的上一个字符串 | |
撤销操作 | u | 撤销上一步的操作 |
ctrl + r | 撤销撤销操作 | |
翻页 | ctrl+f 或 Page Down | 文件向下翻一屏 |
ctrl+b 或 Page Up | 文件向上翻一屏 | |
进入编辑模式 | a | 在当前字符后添加文本 |
i | 在当前字符前添加文本 | |
o | 在当前后面插入一空行 | |
行间跳转 | shift + ^ | 行首 |
shirf + $ | 行尾 | |
1G或gg | 文件首部 | |
shift + G | 文件尾部 | |
#G | 跳转至文件第#行 |
操作类型 | 命令 | 作用 |
---|---|---|
保存文件 | :w | 保存 |
:w /root/newfile | 保存文件至/root/newfile | |
退出vi | :q | 退出 |
:q! | 强制退出 | |
保存退出vi | :wq或:x | 保存退出 |
:wq!或:x! | 强制保存退出 | |
行号 | :set nu | 显示行号 |
:set nonu | 不显示行号 | |
大小写 | :set ic | 区分显示字符大小写 |
:set noic | 忽略字符大小写 | |
缩进 | :set ai | 设定自动缩进 |
:set noai | 取消自动缩进 | |
替换 | : s/old/new | 当前光标所在行的第一个old替换成new |
: s/old/new/g | 当前光标所在行的所有old替换成new | |
:%s/old/new/g | 将全文中的所有old替换成new | |
:%s/old/new/gi | 将全文中的所有old替换成new并忽略大小写(参数i) | |
:#,#s/old/new/g | 将全文中的所有old替换成new | |
:%s/old/new/gc | 将全文中的所有old替换成new,在替换命令末尾加c命令,将对每个替换动作进行确认 | |
搜索 | ?word | 在文本中从下至上搜索“word”字符串 |
/word | 在文本中从上至下搜索“word”字符串 | |
:set hlsearch | 高亮显示查找到的文本 | |
:set nohlsearch | 取消高亮显示 | |
其他操作 | :e /…/… | 打开新文件进行编辑 |
:r /…/… | 在当前文件中读入其他文件内容 | |
:ADDR1,ADDR2w /…/… | 将当前文件中部分内容另存为另外一个文件 末行模式下使用w命令 | |
:! COMMAND | 跟SHELL交互 |
使用vim编辑多个文件
vim FILE1 FILE2 FILE3
:next 切换至下一个文件
:prev 切换至前一个文件
:last 切换至最后一个文件
:first 切换至第一个文件
:qa 全部退出
分屏显示一个文件
Ctrl+w, s: 水平拆分窗口
Ctrl+w, v: 垂直拆分窗口
Ctrl+w, ARROW(表示上下左右箭头):在窗口间切换光标
:qa 关闭所有窗口
分窗口编辑多个文件
vim -o : 水平分割显示
vim -O : 垂直分割显示
配置文件
/etc/vimrc
~/.vimrc
set hlsearch " //高亮度反白
set backspace=2 " //可随时用退格键删除
set autoindent " //自动缩排
set tabstop=4 " //缩进
set softtabstop=4
softtabstop // 是“逢4空格进1制表符”,前提是tabstop=4
set shiftwidth=4 // 自动缩进空格长度
set mouse=a " // 使用鼠标
set selection=exclusive
set selectmode=mouse,key
set ruler " //可显示最后一行的状态
set showmode " //左下角那一行的状态
set nu " //可以在每一行的最前面显示行号啦!
set bg=dark " //显示不同的底色色调
syntax on " //进行语法检验,颜色显示
Linux多用户、多任务操作系统!
多用户同时登录一个系统而执行不同的任务,而互不影响,不同的用户可具有不同的权限,每个用户在权限 允许的范围内完成不同的任务。
为方便管理属于同一组的用户,方便为组中的用户统一规划权限或指定任务;在Linux系统中创建每个用户 时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户自己 。
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD #默认创建用户无过期 |
-u | 指定该用户的默认UID #系统创建时默认给用户分配的ID |
-g | 指定一个初始的用户基本组(必须已存在)#主组 |
-G | 指定一个或多个扩展用户组 #附加组 |
-s | 指定该用户的默认Shell解释器 |
groupadd用于创建组
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
–stdin | 通过标准输入修改密码 |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
批量修改密码时passwd命令过于复杂,可以用echo快速修改
echo password | passwd --stdin root
例:修改ROOT账号的密码为password
[root@linux ~]# echo password | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
passwd -l 锁定账户,在密码字符串的前面加上!
passwd -u 是去掉密码字符串前面的!
[root@linux ~]# cat /etc/shadow | tail -n1
alice:$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
[root@linux ~]# passwd -l alice
Locking password for user alice.
passwd: Success
[root@linux ~]# cat /etc/shadow | tail -n1
alice:!!$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
[root@linux ~]# passwd -u alice
Unlocking password for user alice.
passwd: Success
[root@linux ~]# cat /etc/shadow | tail -n1
alice:$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
usermod -L 默认只是锁定密码,在密码字符串前面加!
usermod -U 默认只是解锁密码,去掉密码字符串前面的
[root@linux ~]# cat /etc/shadow | tail -n1
alice:$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
[root@linux ~]# usermod -L alice
[root@linux ~]# cat /etc/shadow | tail -n1
alice:!$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
[root@linux ~]# usermod -U alice
[root@linux ~]# cat /etc/shadow | tail -n1
alice:$6$aNao7DpB$7fYpa7lB/QaGdRqCmqALLy564bFPqFVdhi2xWQeJUb7P2xBKyVDXD/r2OEYbSO.U9XYuQ44nqy56pCVoXXwHT.:17797:0:99999:7:::
chage命令是用来修改帐号和密码的有效期限
参数 | 作用 |
---|---|
-m | 密码可更改的最小天数。为零时代表任何时候都可以更改密码 |
-M | 密码保持有效的最大天数 |
-W | 用户密码到期前,提前收到警告信息的天数 |
-E | 帐号到期的日期。过了这天,此帐号将不可用 |
-d | 上一次更改的日期 |
-i | 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用 |
-l | 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期 |
[root@linux /]# chage -l euser
Last password change : Aug 28, 2015 【最近一次修改密码的时间】
Password expires : Nov 26, 2015 【密码过期时间】
Password inactive : never 【密码失效时间】
Account expires : Jan 31, 1970 【账户过期时间】
Minimum number of days between password change : 0 【两次改变密码之间相距最小天数】
Maximum number of days between password change : 90 【两次密码改变密码相距最大天数】
Number of days of warning before password expires : 15 【密码过期前开始警告的天数】
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”。
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或UID值以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
sudo命令具有如下功能:
如果担心直接修改配置文件会出现问题,则可以使用sudo 命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
使用visudo命令配置sudo命令的配置文件时,其操作方法与Vim 编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保 存并退出。在sudo命令的配置文件中,按照下面的格式将第99行 (大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@root ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 alice ALL=(ALL) ALL
………………省略部分文件内容………………
作为一名普通用户,是肯定不能看到root管理员的家目录(/root)中的文件信息的,但是在更改了visudo后,只需要在想执行的命令前面加上sudo命令就可以了:
[alice@linux root]$ ls /root
ls: cannot open directory /root: Permission denied
[alice@linux root]$ sudo ls /root
[sudo] password for alice:
Sorry, try again.
[sudo] password for alice:
anaconda-ks.cfg ls_help_text STD STDERR stdout test.txt
fstab.new output stderr stdin STDOUT
若觉得每次使用alice用户使用sudo命令都要输入密码太麻烦,可以添加NOPASSWD参数,使得用户执行sudo命令 时不再需要密码验证:
[root@linux ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/powero ff.8.gz
[root@linux ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 alice ALL=NOPASSWD: /usr/sbin/poweroff
………………省略部分文件内容………………
查看当前登录的用户信息:
[root@linux ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
查看运行进程的username:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 46236 6772 ? Ss 03:19 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 03:19 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 03:19 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 03:19 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 03:19 0:00 [kworker/u256:0]
和用户组相关的一些文件:
用户账号文件 /etc/passwd
用户密码文件 /etc/shadow
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警 告时间:不活动时间:失效时间:标志
特权权限是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有 执行权限的二进制程序有效。
SGID让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件,通常对目录设置。
chmod #用于设置文件或目录的权限
chown #用于修改文件属性和权限
chgrp #用于修改文件属性和权限
UGO设置基本权限: 只能一个用户,一个组和其他人
ACL 设置基本权限: r,w,x
权限对象: 属主: u 属组: g 其他人: o
权限类型: 读:r 4 写:w 2 执行: x 1
chown:
[root@linux ~]# chown alice.hr file1 //改属主、属组
[root@linux ~]# chown alice file1 //只改属主
[root@linux ~]# chown .hr file1 //只改属组
chgrp:
[root@linux ~]# chgrp it file1 //改文件属组
[root@linux ~]# chgrp -R it dir1 //改文件属组
对象 赋值符 权限类型
chmod u + r file1
chmod g - w file1
chmod file1 o = x file1
也可以用数字进行更改
chmod 664 file1
[root@linux ~]# chmod u+x file1 //属主增加执行
[root@linux ~]# chmod a=rwx file1 //所有人等于读写执行
[root@linux ~]# chmod a=- file1 //所有人没有权限
[root@linux ~]# chmod ug=rw,o=r file1 //属主属组等于
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文 件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/ 写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一 用户或用户组、单一文件或目录来进行读/写/执行权限的控制
增加权限:
[root@linux ~]# getfacl /root/test.txt
[root@linux ~]# setfacl -m u:alice:rw /root/test.txt //增加用户alice读写权限
[root@linux ~]# ll /root/test.txt
-rw-rw-r--. 1 root root 78 Sep 26 04:03 /root/test.txt
[root@linux ~]# setfacl -m u:alice:- /root/test.txt //增加用户alice所有权限
[root@linux ~]# ll /root/test.txt
-rw-r--r--+ 1 root root 78 Sep 26 04:03 /root/test.txt
[root@linux ~]# setfacl -m o::rw /root/test.txt
删除权限:
[root@linux ~]# ll /root/test.txt
-rw-rw-r--+ 1 root root 0 10-26 13:59 /root/test.txt
[root@linux ~]# getfacl /root/test.txt
[root@linux ~]# setfacl -m g:hr:r /root/test.txt
[root@linux ~]# setfacl -x g:hr /root/test.txt //删除组hr的acl权限
[root@linux ~]# setfacl -b /root/test.txt //删除所有acl权限
mask: 用于临时降低用户或组(除属主和其他人)的权限
建议:为了方便管理文件权限,其他人的权限置为空
[root@linux ~]# setfacl -m m::— /home/file100.txt
default: 继承(默认)
若想要让alice能够对/home以及以后在/home下新建的文件有读、写、执行权限
[root@linux ~]# setfacl -m u:alice:rwx /home //赋予alice对/home读、写、执行权限
[root@linux ~]# setfacl -m d:u:alice:rwx /home //赋予alice对以后在/home下新建的文件有读、写、执行权限(使alice的权限继承)
文件权限管理: 进程 umask
进程、新建文件、目录的默认权限会受到umask的影响,umask表 示要减掉的权限
临时修改shell umask值
[root@linux ~]# umask 000
[root@linux ~]# mkdir dir900
[root@linux ~]# touch file900
[root@linux ~]# ll -d dir900 file900
drwxrwxrwx. 2 root root 4096 3月 11 19:44 dir900
-rw-rw-rw-. 1 root root 0 3月 11 19:44 file900
永久修改shell umask值
[root@linux ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
[root@linux ~]# source /etc/profile //立即在当前shell中生效
通过umask决定新建用户HOME目录的权限
[root@linux ~]# vim /etc/login.defs
UMASK 077
[root@linux ~]# useradd gougou
[root@linux ~]# ll -d /home/gougou/
drwx------. 4 gougou gougou 4096 3月 11 19:50 /home/gougou/
[root@linux ~]# vim /etc/login.defs
UMASK 000
[root@linux ~]# useradd yangyang
[root@linux ~]# ll -d /home/yangyang/
drwxrwxrwx. 4 yangyang yangyang 4096 3月 11 19:53 /home/yangyang/
高级权限的类型 suid 4 sgid 2 sticky 1 粘滞位
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序 的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有 效)。如果属主原本有执行权限,显示为小写s; 否则,显示为大写S
SGID主要实现如下两种功能:
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的 用户获取的不再是文件所有者的临时权限,而是获取到文件所属组 的权限。
Sticky特殊权限位可确保用户只能删除自己的文件,而不能删除其 他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后, 那么该目录中的文件就只能被其所有者执行删除操作了。如果其它用户原本有执行权限,显示为小写t; 否则,显示为大写T
例:
suid 普通用户通过suid提权 <针对文件>
在进程文件(二进制,可执行)上增加suid权限
[root@linux ~]# chmod u+s /bin/cat
[root@linux ~]# chmod u+s /bin/rm
[alice@linux ~]$ cat /root/install.log
普通用户可以修改密码:
alice /usr/bin/passwd /etc/shadow
[alice@linux ~]$ ll /etc/shadow
----------. 1 root root 1267 Oct 6 22:47 /etc/shadow
[alice@linux ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[alice@linux ~]$ passwd //alice修改密码
......
sticky 用户只能删除自己的文件 <针对目录>
[root@linux ~]# mkdir /home/dir1
[root@linux ~]# chmod 777 /home/dir1
测试:user1在/home/dir1建立文件, user2尝试删除!
[root@linux ~]# chmod o+t /home/dir1
[root@linux ~]# ll -d /home/dir1
drwxrwxrwt. 2 root root 6 Oct 10 05:45 /home/dir1/
sgid 新建文件继承目录属组 <针对目录>
[root@linux ~]# mkdir /home/hr
[root@linux ~]# chgrp hr /home/hr/
[root@linux ~]# chmod g+s /home/hr
[root@linux ~]# ll -d /home/hr/
drwxr-sr-x. 2 root hr 6 Oct 10 05:48 /home/hr/
[root@linux ~]# touch /home/hr/file9
[root@linux ~]# ll /home/hr/
total 0
-rw-r--r--. 1 root hr 0 Oct 10 05:48 file9
设置文件属性(权限),针对所有用户,包括root
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面 追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加 “-参数”。
lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看:
参数 | 作用 |
---|---|
-i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而 不能新建或删除文件 |
-a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
-S | 文件内容在变更后立即同步到硬盘(sync) |
-s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
-A | 不再修改这个文件或目录的最后访问时间(atime) |
-b | 不再修改文件或目录的存取时间 |
-D | 检查压缩文件中的错误 |
-d | 使用dump命令备份时忽略本文件/目录 |
-c | 默认将文件或目录进行压缩 |
-u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
-t | 让文件系统支持尾部合并(tail-merging) |
-X | 可以直接访问压缩文件中的内容 |
[root@linux ~]# touch file100 file200 file300
[root@linux ~]# lsattr file100 file200 file300
-------------e- file100
-------------e- file200
-------------e- file300
[root@linux ~]# man chattr
[root@linux ~]# chattr +a file100
[root@linux ~]# chattr +i file200
[root@linux ~]# chattr +A file300
[root@linux ~]# lsattr file100 file200 file300
-----a-------e- file100
----i--------e- file200
-------A-----e- file300
测试:
[root@localhost ~]# echo 111 > file100 //以覆盖的方式写入
bash: file100: Operation not permitted
[root@localhost ~]# rm -rf file100
rm: cannot remove `file100': Operation not permitted
[root@localhost ~]# echo 111 >> file100//以追加的方式写入, 例如日志文件
[root@localhost ~]# echo 111 > file200
bash: file200: Permission denied
[root@instructor ~]# echo 111 >> file200
bash: file200: Permission denied
[root@localhost ~]# rm -rf file200
rm: cannot remove `file200': Operation not permitted
[root@localhost ~]# chattr -a file100
[root@localhost ~]# chattr -i file200
[root@localhost ~]# chattr -A file300
Linux系统下一个自动执行指定任务的程序(计划任务),使用Crontab命令来添加任务
more /etc/crontab #Crontab配置文件
参数 | 描述 |
---|---|
-u user | 用来设置某个用户的crontab服务 |
-l | 显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容 |
-e | 编辑某个用户的crontab文件内容,如果不指定用户,则表示编辑当前用户的crontab文件 |
-i | 在删除用户的crontab文件时给确认提示 |
-r | 从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件 |
例:
* * * * * command#每1分钟执行一次command
3,15 * * * * command#每小时的第3和第15分钟执行
3,15 8-11 * * * command#在上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command#每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command#每个星期一的上午8点到11点的第3和第15分钟执行
30 21 * * * systemctl restart httpd#每晚的21:30重启httpd
45 4 1,10,22 * * systemctl restart httpd#每月1、10、22日的4 : 45重启httpd
10 1 * * 6,0 systemctl restart httpd#每周六、周日的1:10重启httpd
0,30 18-23 * * * systemctl restart httpd#每天18 : 00至23 : 00之间每隔30分钟重启httpd
0 23 * * 6 systemctl restart httpd #每星期六的晚上11:00 pm重启httpd
* */1 * * * systemctl restart httpd #每一小时重启httpd
* 23-7/1 * * * systemctl restart httpd#晚上11点到早上7点之间,每隔一小时重启httpd
*/1 * * * * echo “hello,test” >> /root/hello_t #如果执行不成功或错误,查看日志进行排查
crontab -l -u user #查询指定用户的任务
crontab -r -u user #删除指定用户的任务