Linux基础命令

2019-06-11-Linux基础命令

199 238 106

目录

分区方案:

背景知识:

硬盘建立分区

  • 主分区-> 扩展分区-> 逻辑分区-> 激活主分区-> 格式化所有分区;
  • 虚拟机的三种网络模式:桥接网络NAT网络地址转换(VMnet8)仅主机模式(VMnet1);其中,主机模式仅仅与物理主机通信,不能访问外网,而其它两种可以通过物理主机进行外网的访问。

主引导记录 MBR (Master Boot Record):

  • 硬盘由大量扇区构成,以首扇区最重要,硬盘0号(首)扇区共512B结束符占2B主引导记录占446B,所以分区表就只有64B,分区表记录一个分区信息需要16B,所以做多记录4个分区信息;
  • 为了解决分区不够的问题,可将其中的分区信息指向另外一个分区,称为扩展分区(扩展分区0扇区),在扩展分区里划分逻辑分区,一块硬盘只能有一个扩展分区,1/2/3/4号只能给主分区,5/6开始为逻辑分区;
1
2
3
dd if=/dev/sda of=MBR bs=1 count=64 skip=446 && hexdump -C /dev/sda -n 512 # 备份分区表:以字节为单位 
# 测试:
dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446 && dd if=MBR of=/dev/sda bs=1 count=64 seek=446 && sync

Linux 下的分区方案

分区 说明
/ 用于存放系统,划为主分区 ✔
/boot 引导分区,划为主分区,大概200M即可; ✔
/swap 充当虚拟内存,划为逻辑分区,大致为电脑内存; ✔
/home 划为逻辑分区,用于存放用户文件; ✔
/tmp 存放临时文件,可有可无,划为逻辑分区;

RPM:(红帽软件包管理器) 相当于windows 的控制面板的软件管理

RPM -选项 说明
rpm -ivh filename.rpm -v:verbose -h:进度 安装软件✔, -i,–info
rpm -Uvh filename.rpm 升级
rpm -e filename.rpm --nodeps 不检查依赖性 卸载软件✔, -e,–erase
rpm -qa | grep filename 查询所安装的包的名称✔
rpm -qc filename 查询所安装的包的配置文件✔
rpm -qd filename 查询所安装的包的帮助文件✔
rpm -qi filename.rpm 查询包描述信息 -p(查未安装,包全名)
rpm -ql filename.rpm 列出包文件信息 -p(查未安装)
rpm -qf filename 查询文件属于哪个包
rpm -V filename 验证

程序包来源

Yum软件仓库(解决包的依赖性):

yum 选项 说明
yum repolist all 列出软件仓库 ✔
yum list all/installed 列出仓库所有软件/已安装的 ✔
yum info 包名称 查看包信息 ✔
yum history info undo redo查看历史
yum search Package 查寻包
yum install 包名称 安装包 ✔
yum reinstall 包名称 卸载包 ✔
yum update 包名称 升级包 ✔
yum remove 包名称 移除包 ✔
yum clean all 清除所有仓库缓存 ✔
yum check-update 检查可更新的包 ✔
yum grouplist 查看系统中已经安装的包组
yum groupinstall 包组 安装指的包组
yum groupremove 包组 移除指定的包组
yum groupinfo 包组 查询指定的包组信息
yum deplist httpd 列出依赖包
yum provides rz 查找命令rz的提供者
1
2
BIOS-> Boot Loader-> 内核-> 内核初始化-> 启动初始化进程(systemd) ✔
command [options] [arguments] # 命令 选项 参数

启用多用户

1
2
[root@xy ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target # 无图形模式 
[root@xy ~]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target # 图形模式

3. 管理服务

3.1 RPM 包安装

  • 独立服务:

    • 服务启动:

      1
      2
      /etc/rc.d/init.d/httpd start
      service httpd start
    • 服务自启动:

      1
      2
      3
      chkconfig --levle 2345 httpd on |off
      vim /etc/rc.d/rc.local # 添加: /etc/rc.d/init.d/httpd start
      ntsysv
  • 基于xinetd 的非独立服务:

    • 服务启动:

      1
      vim /etc/xinetd/telnet    # disable = no, 重启xinetd
    • 服务自启动:

      1
      2
      chkconfig httpd on|off
      ntsysv

3.2 源码安装

service 命令其实只是在/etc/init.d/目录中寻找是否有服务启动脚本, 通过源码安装的服务, 需要要把启动脚本软连接到此目录; ln -s /usr/local/apache2/bin/apachectl /etc/init.d/httpd

chkconfig 需要修改/etc/init.d/httpd , chkconfig --add apachectl

1
2
3
4
5
#!/bin/bash
# chkconfig: 35 86 76
# 指定httpd在3和5级别能被chkconfig命令管理, 启动顺序Start 86, 关闭顺序Kill 76
# (顺序自定, 和系统不冲突)
# description: source package apache
System V init systemctl
service foo start systemctl start foo.service
service foo restar systemctl restart foo.service
service foo stop systemctl stop foo.service
service foo reload systemctl reload foo.service
service foo status systemctl status foo.service
journalctl -xe

4. 设置服务开机启动、不启动

System V init systemctl
chkconfig foo on systemctl enable foo.service
chkconfig foo off systemctl disable foo.service
chkconfig foo list systemctl list-unit-files –type=service
–level默认级别2345

5. 重置密码操作

1
2
3
4
5
6
7
8
cat /etc/redhat-release    # 查看redhat-realease version
linux16 追加 rd.break ctrl+x运行
mount -o remount, rw /sysroot
chroot /sysroot
passwd
touch /.autorelable
exit
reboot

6. 解决piix4_smbus 0000:00:007:3:Host SMBus controller not enabled!

  • modprobe

    • modprobe MOD_NAME: 装载模块
    • modprobe -r MOD_NAME: 卸载模块
    • modinfo MOD_NAME: 查看模块具体信息
  • insmod /PATH/TO/MODULE_FILE: 装载模块

  • rmmod MOD_NAME

  • depmod /PATH/TO/MODULE_FILE

1
2
3
4
5
6
[root@xy Desktop]# lsmod |grep i2c   # lsmod 查看模块  
i2c_piix4 22106 0
i2c_core 40325 2 drm,i2c_piix4
[root@xy Desktop]# vim /etc/modprobe.d/blacklist.conf
blacklist i2c-piix4      # 加黑名单
reboot

7. 常用系统工作命令

7.1 man

1
2
3
[root@xy ~]# whatis motd    
[root@xy ~]# man 5 motd  # 帮助 n N ?
[root@xy ~]# man -w issue

7.2 echo   # 字符串 / $变量

1
2
3
4
[root@xy ~]# echo xy
xy
[root@xy ~]# echo $SHELL
/bin/bash

7.3 date

选项 说明
%t 跳格
%H 小时(00~23)
%S 秒(00~59)
%I 小时(00~12)
%M 分钟(00~59)
%F Year-Month-Day
hwclock -w / -s 以软件/硬件时间为基准, 覆盖硬件/软件时间
1
2
3
4
5
6
7
[root@xy ~]# date
Thu Jul 5 22:44:59 EDT 2018
[root@xy ~]# date "+%Y-%M-%m-%d %H:%M:%S"
2018-45-07-05 22:45:56
[root@xy ~]# date -s "20180706 10:49:00" --set=STRING
Fri Jul 6 10:49:00 EDT 2018
[root@xy ~]# touch `date +%F`.log
CentOS 6.x / 7.x
1
2
3
4
5
6
7
[root@xy ~]# ntpd -p  # 时间同步  
[root@xy ~]# /etc/sysconfig/clock # 修改时区
[root@xy ~]# /etc/sysconfig/il8n # 修改语言
---
[root@xy ~]# chronyc source # 时间同步
[root@xy ~]# timedatectl set-timezone Asia/Shanghai # 修改时区
[root@xy ~]# localectl set-locale LANG=zh_UTF-8 # 修改语言

7.4 wget

选项 说明
-b 后台下载
-P 下载至指定目录
-O 指定目录并重命名
-c 断点续传
-p 下载页面搜有资源
-r 递归下载
-np 不追溯至父级
-k make links in downloaded HTML point to local files
1
2
[root@xy ~]# wget -r -p http://www.linuxprobe.com  
[root@xy ~]# wget -r -p -np -k http://www.linuxprobe.com

curl

选项 说明
-i, –include 响应头部信息,连同body
-I, –head 仅仅显示响应头部信息
-X, –request 指定请求方式
-v 显示响应结果
-u 携带用户名/密码

7.5 ps(pstree -p)

选项 说明
-a 显示所有终端下执行的进程sysV
-u 显示指定用户相关的进程信息sysV
-x 显示没有控制终端进程sysV
-e 显示所有进程
-f 额外显示UID PPID(父进程ID) C与STIME栏位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@xy ~]# ps -aux  
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.8 0.3 53784 7716 ? Ss 10:37 0:09 /usr/lib/ systetemd
root 2 0.0 0.0 0 0 ? S 10:37 0:00 [kthreadd] # 内核线程
root 3 0.0 0.0 0 0 ? S 10:37 0:00 [ksoftirqd/0]
root 3041 0.0 0.0 125440 1436 pts/0 R+ 10:55 0:00 ps -aux
.......省略部分信息........

5种常见进程状态:R(运行) S(中断) D(不可中断) Z(僵死) T(停止)

[root@xy ~]# mpstat -P ALL; sar -P ALL # 查看多核CPU
[root@xy ~]# top # 动态显示进程活动
top - 11:00:06 up 23 min, 2 users, load average: 0.96, 0.59, 0.53 # 1min 5min 15min
Tasks: 486 total, 1 running, 485 sleeping, 0 stopped, 0 zombie
%Cpu(s): 21.9 us, 11.8 sy, 0.0 ni, 66.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2035648 total, 1280152 used, 755496 free, 1084 buffers
KiB Swap: 2113532 total, 0 used, 2113532 free. 342864 cached Mem
.......省略部分信息........

7.7 pidof    

1
2
[root@xy ~]# pidof sshd   # 查询PID值 ,pidof 服务名称 
1552

7.8 kill -l

  • 进程间通信(IPC):共享内存;信号;Semaphore
  • 信号:
    • 1 SIGHUB (进程不用重启,可以重读配置文件并生效)
    • 2 SIGINT (Ctrl+c 中断)
    • 9 SIGKILL (杀死进程)
    • 15 SIGTERM (终止进程,默认)

7.9 killall

1
2
3
4
5
[root@xy ~]# pidof httpd  # pid open file  
13581 13580 13579 13578 13577 13576
[root@xy ~]# killall httpd  # killall 服务名称
[root@xy ~]# pidof httpd
[root@xy ~]# kill PID    # kill PID号

8. 系统状态检测命令

8.1 ifconfig(ip)

RedHat/CentOS: /etc/sysconfig/network-scripts
Debian/Ubuntu: /etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo "1"> cat /proc/sys/net/ipv4/ip_forward  #临时开启路由转发  
/etc/sysctl.conf #net.ipv4.ip_forward = 0 #永久修改 sysctl -p
[root@xy ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:11:26:05 txqueuelen 1000 (Ethernet)
RX packets 496 bytes 46407 (45.3 KiB)
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

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 770 bytes 62348 (60.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 770 bytes 62348 (60.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@xy ~]# ifconfig eno16777736 IP # 临时测试更改IP
[root@xy ~]# yum install quagga -y
[root@xy ~]# ifconfig eth0:1 192.168.10.131 netmask 255.255.255.0 up # eth0:1 虚拟网络接口

8.2 uname

1
2
3
4
[root@xy ~]# uname -a    # 查看系统内核与版本信息    
Linux xy.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@xy ~]# cat /etc/redhat-release     # 系统版本详细信息文件路径
Red Hat Enterprise Linux Server release 7.0 (Maipo)

8.3 uptime

1
2
[root@xy ~]# uptime   # 5min	 10min	15min	系统负载状况 
11:08:55 up 31 min, 2 users, load average: 0.48, 0.42, 0.46

8.4. free

1
2
3
4
5
[root@xy ~]# free -h          # 内存使用情况    
total used free shared buffers cached
Mem: 1.9G 1.2G 732M 9.8M 1.1M 335M
-/+ buffers/cache: 919M 1.0G
Swap: 2.0G 0B 2.0G

8.5 who

-r 显示当前运行级别
console pty(物理终端) tty(虚拟终端) ttyS(串行终端) pts(伪终端)

1
2
3
[root@xy ~]# who           # 当前登录主机用户信息
xy :0 2018-07-05 22:38 (:0)
xy pts/0 2018-07-06 11:06 (:0)

8.6 last: 显示用户登录历史及系统重启历史

1
2
3
4
5
6
7
8
9
[root@xy ~]# last          # /var/log/wtmp    
xy pts/0 :0 Fri Jul 6 11:06 still logged in
xy pts/0 :0 Thu Jul 5 22:41 - 11:06 (12:24)
xy :0 :0 Thu Jul 5 22:38 still logged in
reboot system boot 3.10.0-123.el7.x Fri Jul 6 06:37 - 11:11 (04:33)
.......省略部分信息........

lastb -n # /var/log/btmp # 显示错误的登录尝试信息
lastlog -u username # 显示每一个用户最近登录信息

8.7 history

调用 说明
!! 重复执行上一条
!n 重复执行第n条
!$ 重复上一条命令的最后一个参数
!string 重复执行最后一条以该字串开头的
1
2
3
4
5
6
7
8
[root@xy ~]# history               # 命令使用历史     
[root@xy ~]# history -c    # clean
[root@xy ~]# cat ~/.bash_history
lsmod|grep i2c
vim /etc/modprobe.d/blacklist.conf
reboot
lsmod|grep i2c
.......省略部分信息........

8.8 sosreport

1
2
3
4
5
6
[root@xy ~]# sosreport    
sosreport (version 3.0)
This command will collect diagnostic and configuration information from
this Red Hat Enterprise Linux system and installed applications.
Your sosreport has been generated and saved in:
/var/tmp/sosreport-xy.com-20180706113138.tar.xz

9. 工作目录切换命令

9.1 pwd

1
2
[root@xy ~]# pwd            # 当前所处工作目录  
/root

9.2 cd

1
2
3
4
5
6
7
[root@xy ~]# cd /etc  
[root@xy etc]# cd -   # cd - 返回到上一次所处目录
/root
[root@xy ~]# cd /etc
[root@xy etc]# cd ~   # 进入当前用户的home目录
[root@xy ~]# cd ..    # cd .. 进入上级目录
[root@xy /]# cd /etc

9.3 ls

选项 说明
-a 全部文件(包括隐藏文件)
-l 查看文件属性、大小等详细信息
-d 查看目录属性信息
-h,–human
-Z 查看安全上下文
1
2
3
4
5
6
7
[root@xy ~]# ls -al   
total 64
dr-xr-x---. 14 root root 4096 Jul 6 11:06 .
-rw-------. 1 root root 378 Jul 6 11:06 .bash_history

[root@xy ~]# ls -ld /etc
drwxr-xr-x. 132 root root 8192 Jul 6 06:37 /etc

10. 文本编辑命令

10.1 cat

选项 说明
-n 显示行号
-E 显示所有符号
1
2
3
4
[root@xy ~]# cat -n initial-setup-ks.cfg       # 短篇文本查看 Number  
1 #version=RHEL7
2 # X Window System configuration information
3 xconfig --startxonboot

10.2 more

1
2
3
4
[root@xy ~]# more initial-setup-ks.cfg	#长篇文本查看 翻滚 空格键  
1 #version=RHEL7
2 # X Window System configuration information
3 xconfig --startxonboot

10.3 head

选项 说明
-n 显示文本前n行
-c 指定获取前n字符数
-2 指定查看前2行
1
2
3
[root@xy ~]# head -n 5 initial-setup-ks.cfg       
1 #version=RHEL7
2 # X Window System configuration information

10.4 tail(默认后10行)

选项 说明
-c 指定获取后n字符数
-n 指定获取后n行
-f 查看文件尾部等待显示后续新追加内容
-F 同-f, 删除跟踪后会提醒
1
2
3
4
5
6
7
[root@xy ~]# tail -n 5 initial-setup-ks.cfg	  # tail -n 查看后10行  
@guest-agents
@guest-desktop-agents

[root@xy ~]# tail -f /var/log/messages  # tail -f 动态显示log信息
Jul 6 11:51:43 xy dbus[1068]: [system] Activating via systemd: service name='net.reactivated.Fprint' unit='fprintd.service'
Jul 6 11:51:43 xy systemd: Starting Fingerprint Authentication Daemon...

10.3 diff

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
27
28
29
30
31
32
33
34
35
[root@xy diff]# cat diff_A.txt  
Welcom to RedHat 7
RedHat certified
Free Linux Lessons
Professional guidance
Linux Course
[root@xy diff]# cat diff_B.txt
Welcom tooo RedHat7

RedHat certified
Free Linux LessonS
//////////...../////////
Professional guidance
Linux Course
[root@xy diff]# diff --brief diff_A.txt diff_B.txt   # 比较文本差异
Files diff_A.txt and diff_B.txt differ
[root@xy diff]# diff -c -Naur diff_A.txt diff_B.txt >patch.txt
*** diff_A.txt 2018-07-06 12:06:35.889958037 -0400
--- diff_B.txt 2018-07-06 12:10:58.818955667 -0400
***************
*** 1,5 ***
! Welcom to RedHat 7
RedHat certified
! Free Linux Lessons
Professional guidance
Linux Course
--- 1,8 ----
! Welcom tooo RedHat7
!
!
RedHat certified
! Free Linux LessonS
! //////////...../////////
Professional guidance
Linux Course

10.4 wc 统计指定文本的行数, 字数, 字节数 word count

选项 说明
-l 只显示行数line
-w 只显示单词数word
-c 只显示字节数
-m 只统计数字字(节)符总数
-L 最长的行包含字符数
1
2
3
4
5
6
[root@xy ~]# wc -l /etc/passwd 
38 /etc/passwd
[root@xy ~]# wc -w /etc/passwd
66 /etc/passwd
[root@xy ~]# wc -c /etc/passwd
1902 /etc/passwd

10.5 stat

1
2
3
4
5
6
7
8
9
10
[root@xy ~]# stat anaconda-ks.cfg 	  # 查看文件具体存储信息与时间  
File: ‘anaconda-ks.cfg’
Size: 1071 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 68521005 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2018-07-06 14:25:45.099882788 -0400 # atime
Modify: 2018-07-06 05:36:00.000000000 -0400 # mtime
Change: 2018-07-06 12:21:08.983950168 -0400 # ctime
Birth: -

10.6 cut 提取列 字符串,不识别空格

选项 说明
-d 分隔符,默认为Tab
-f,--filed 指定列数(1,3 1-3)
-c 按字符提取
1
2
3
4
5
6
7
8
[root@xy ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@xy ~]# cut -d: -f1 /etc/passwd # 按列提取文本字符
root
...
sshd
xy

10.7 tr 替换文本字符串

选项 说明
-s 将重复出现字符串压缩为一个字符串替换
-d 删除出现在字符集中的所有字符
-c 反选
1
2
3
4
[root@xy ~]# cat anaconda-ks.cfg | tr [a-z] [A-Z]  
[root@xy ~]# echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' |tr -dc [0-9] # -d 删除 -c 取反
[root@xy ~]# ifconfig eno16777736 |head -n2 |tail -n1 |tr -dc '[0-9]. ' |tr -s ' '|cut -d" " -f2
192.168.137.10

sort(取列排序)

选项 说明
-n 按数字排序
-r 倒序排序
-t 分隔符
-k,--key=POSL 指定某列进行排序(默认字符)
-u,--unique 重复内容只排一次
-f 忽略大小写
1
[root@xy ~]# df |grep sd | tr -s " " "%" |cut -d% -f5 |sort -nr |head -n1

uniq(相邻相同的字符)

选项 说明
-c,–count 统计每行重复出现次数
-d,–repeated 统计重复过的行(交)
-u,–unique 显示不曾重复的行(并)
1
2
3
4
5
6
[root@xy ~]# cut -d" " -f1 /var/log/httpd/access_log |sort |uniq -c |sort -nr # 统计客户端访问IP次数  
[root@xy ~]# cat f1 f2 | sort |uniq -d # 交集
[root@xy ~]# grep -f f1 f2 # 交集

[root@xy ~]# cat f1 f2| sort |uniq -u # 不同
[root@xy ~]# cat f1 f2 |sort -u # 并集

11. 文件目录管理命令

11.1 touch

选项 说明
-a 仅仅修改读取时间atime
-m 仅仅修改修改时间mtime
-d 都修改
1
2
3
4
5
6
7
8
[root@xy ~]# ls -l anaconda-ks.cfg  
-rw-------. 1 root root 1024 Jul 6 05:36 anaconda-ks.cfg
[root@xy ~]# echo "Visit the LinuxProbe.com to learn linux skills" >>anaconda-ks
[root@xy ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1071 Jul 6 12:18 anaconda-ks.cfg
[root@xy ~]# touch -d "2018-07-06 05:36" anaconda-ks.cfg
[root@xy ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1071 Jul 6 05:36 anaconda-ks.cfg

11.2 mkdir

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@xy ~]# cd /tmp 
[root@xy tmp]# mkdir diff
[root@xy tmp]# cd diff
[root@xy diff]# mkdir -p a/b/c/d/e     # 递归创建目录
[root@xy ~] mkdir mkdir -p base/{cd,fd} # 创建多个同级目录
[root@xy diff]# cd a
[root@xy a]#
[root@xy ~]# touch install.log
[root@xy ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Music Public Videos
Desktop Downloads install.log Pictures Templates
[root@anyue test]# mkdir -pv /testdir/dir1/{x,y}/{a,b}
/testdir/
└── dir1
├── x
│   ├── a
│   └── b
└── y
├── a
└── b
[root@anyue test]# mkdir -pv ./testdir/dir2/{x/{a,b},y}
./testdir/dir2/
├── x
│   ├── a
│   └── b
└── y
[root@anyue test]# mkdir -pv ./testdir/dir{3,4,5/dir{6,7}}
mkdir: created directory ‘./testdir/dir3’
mkdir: created directory ‘./testdir/dir4’
mkdir: created directory ‘./testdir/dir5’
mkdir: created directory ‘./testdir/dir5/dir6’
mkdir: created directory ‘./testdir/dir5/dir7’
[root@anyue test]# tree ./testdir/

./testdir/
├── dir3
├── dir4
└── dir5
├── dir6
└── dir7

11.3 cp (-a -r -v)

选项 说明
-a 复制目录时使用,保留链接/文件属性/并复制目录下的所有内容,等于dpR参数组合
-r 复制该目录下所有的子目录和文件
-v 显示过程
1
2
3
4
[root@xy ~]# cp -a install.log x.log  
[root@xy ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Music Public Videos
Desktop Downloads install.log Pictures Templates x.log

11.4 mv

1
2
3
4
[root@xy ~]# mv install.log linux.log 
[root@xy ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Music Public Videos
Desktop Downloads linux.log Pictures Templates

11.5 rm

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@xy ~]# rm linux.log
rm: remove regular empty file ‘diff’? y
[root@xy ~]# rm -f linux.log # -f,强制删除文件或目录
anaconda-ks.cfg Documents initial-setup-ks.cfg Music Public Videos
Desktop Downloads Pictures Templates
[root@xy ~]# mkdir diff
[root@xy ~]# cd diff
[root@xy diff]# cd -
/root
[root@xy ~]# rm -rf diff # -r,递归处理,将指定目录下的所有文件与子目录一并处理
[root@xy ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Video

11.6 dd 按照指定大小和个数的数据块复制文件或转换文件

选项 说明
if 输入文件名称
of 输出文件名称
bs 设置块大小
count 设置复制块的个数
1
2
3
4
[root@xy ~]# dd if=/dev/zero of=10_file bs=10M count=1
[root@xy ~]# dd if=/dev/cdrom of=RHEL-server-7.0-x86_64.iso
[root@xy ~]# file anaconda-ks.cfg
anaconda-ks.cfg: ASCII text

11.7 file

1
2
[root@xy ~]# file /dev/sda  
/dev/sda: block special

12. 打包压缩与搜索命令

12.1 tar

tar相关命令参考1

选项 说明
-c 创建压缩文档
-x 解开压缩文档
-t 查看压缩包内容
-z 用Gzip压缩/解压, *.tar.gz
-j 用bzip2压缩/解压, *.tar.bz2
-J 用xz压缩或解压
-v 显示压缩/解压过程
-f 目标文件名
-p 保留原文件的权限属性
-P 使用绝对路径来压缩
-C 指定目录
1
2
3
4
5
6
7
8
9
[root@xy tmp]# tar -czvf diff.tar.gz /diff     
diff/
diff/diff_A.txt
diff/diff_B.txt
diff/diff_B.txt~
diff/diff.tar.gz
[root@xy diff]# tar -xzvf diff.tar.gz -C /diff # 指定解压目录 -C
[root@xy diff]# tar -g /data/backup/snapshot -czvf /data/backup/2017.tar.gz * # -g 增量备份
[root@xy diff]# tar -g /data/backup/snapshot -czvf /data/backup/2017-1.tar.gz *

12.2 grep # 提取行 字符串搜索常用

选项 说明
-n 显示行号
-i 忽略大小写
-v 反向选择,仅列出没有关键词的行
-c 仅显示找到的行数
-E 支持扩展正则
1
2
3
4
[root@xy ~]# grep -n /sbin/nologin /etc/passwd
1:bin:x:1:1:bin:/bin:/sbin/nologin
2:daemon:x:2:2:daemon:/sbin:/sbin/nologin
3:adm:x:3:4:adm:/var/adm:/sbin/nologin

12.3 find # 文件搜索 实用

选项 说明
-name 匹配名称
-perm 匹配权限
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间
-atime -n +n 匹配访问文件的时间
-nouser -nogroup 匹配没有所有者/所有组
-inum n 匹配节点编号
-maxdepth / -mindepth level 定义搜索深度
-exec 后续命令 {} dst ; 后可跟进 执行的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@xy ~]# find /etc/ -name "host*" -print
/etc/avahi/hosts
/etc/host.conf
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/selinux/targeted/modules/active/modules/hostname.pp
/etc/hostname
[root@xy ~]# find / -perm -4000 -print # -perm 匹配权限
/usr/bin/fusermount
/usr/bin/su
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
[root@xy ~]# find /tmp \(-not -user root -a -not -name 'f*'\) -ls # 属主非root且不以f开头的文件
[root@xy ~]# find /etc \(-path "/etc/sane.d" -o -path "/etc/fonts"\) -a -prune -o -name "*.conf" # 查找etc下除了/etc/sane.d /etc/fonts 目录的所有.conf后缀的文件

[root@xy ~]# find / -user xy -exec cp -a {} /root/findresults/ \;
[root@xy ~]# find linux-4.18.13/ -name "*.c" -exec cat {} \; |grep -v "^$" |wc -l

13. 重定向操作符

标准输入重定向(STDIN, 文件描述符为 0)
标准输出重定向(STDOUT, 文件描述符为 1)
错误输出重定向(STDERR, 文件描述符为 2)

  • 输入重定向 O-I

    • 命令 < 文件
    • 命令 << 分界符 遇见分界符为止
    • 命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2
  • 输出重定向 I-O

    • 命令 > 文件 清空原有文件
    • 命令 2> 文件
    • 命令 >> 文件 追加到原有文件内容的后面
    • 命令 2>> 文件
    • 命令 >> 文件 2>&1 将标准输出与错误输出共同写到文件
    • 命令 &>> 文件
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
27
28
29
[root@xy ~]# man bash > readme.txt  
[root@xy ~]# echo "Welcome to Linuxprobe.Com" > readme.txt
[root@xy ~]# echo "Quality linux learning materials" >> readme.txt
[root@xy ~]# cat readme.txt
Welcome to anyue967.Com
Quality linux learning materials

[root@xy ~]# ls -l xxxxxxx > readme.txt
ls: cannot access xxxxxxx: No such file or directory
[root@xy ~]# ls -l xxxxxxx 2> readme.txt #2的用法
[root@xy ~]# cat readme.txt
ls: cannot access xxxxxxx: No such file or directory
[root@xy ~]# wc -l < readme.txt
1
[root@xy ~]# cat readme.txt | wc -l
1

cat >>README.txt <<EOF
...
EOF

ls /data /noexist 2>/root/out.log 1>&2
ls /data/ /noexist >/root/out.log 2>&1
ls /data/ /noexist &>/root/out.log
#小测试
A.cmd &>/dev/null
B.cmd >/dev/null 2>&1
C.cmd 2>&1 >/dev/null ✔ #屏幕显示错误信息,标准输出至/dev/null
D.cmd 2>/dev/null 1>&2

14. 管道符 |

1
2
3
4
5
6
7
8
9
10
11
12
[root@xy ~]# grep "/sbin/nologin" /etc/passwd |wc -l  
33
[root@xy ~]# ls -l /etc/ |more
total 1396
drwxr-xr-x. 3 root root 97 Jul 6 05:01 abrt
-rw-r--r--. 1 root root 16 Jul 6 05:33 adjtime
-rw-r--r--. 1 root root 1518 Jun 7 2013 aliases
.......省略部分输出内容.......
[root@xy ~]# echo "19937100xy" |passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
[root@xy ~]# who |tee -a /test/who.log # tee 命令

15. 命令行的通配符 * [] ?

选项 说明
* 任意长度的任意字符
? 任意单个字符
[0-9] 匹配0~9之间的单个数字的字符
[abc] 匹配a、b、c三个字符中个任意一个
1
2
3
4
5
6
7
8
9
10
11
[root@xy ~]# touch {a..z}.txt 
[root@xy ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Jul 6 2018 /dev/sda
brw-rw----. 1 root disk 8, 1 Jul 6 2018 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jul 6 2018 /dev/sda2
[root@xy ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 Jul 6 2018 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jul 6 2018 /dev/sda2
[root@xy ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Jul 6 2018 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jul 6 2018 /dev/sda2

16. 常用的转义字符

选项 说明
\ 使反斜杠后的一个变量变为单纯的字符串
‘’ 转义其中所有的变量为单纯的字符串
“” 保留其中的变量属性,不进行转义处理
`` 命令执行后并返回结果
1
2
3
4
5
6
7
8
9
[root@xy ~]# PRICE=5
[root@xy ~]# echo "Price is $PRICE"   # $ 取变量的值
Price is 5
[root@xy ~]# echo "Price is $$PRICE"
Price is 7982PRICE
[root@xy ~]# echo "Price is \$$PRICE"
Price is $5
[root@xy ~]# echo `uname -a`    # 执行命令返回结果
Linux xy.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

17. 重要的环境变量

系统变量 说明
HOME
SHELL
HISTSIZE
HISTFILESIZE
MAILL
LANG
RANDOM
PS1
PATH
EDITOR
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
[root@xy ~]# touch xy.txt
[root@xy ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures readme.txt Videos
Desktop Downloads Music Public Templates xy.txt
[root@xy ~]# rm xy.txt
rm: remove regular empty file ‘xy.txt’? y
[root@xy ~]# alias rm   #alias 的用法
alias rm='rm -i' #inter
[root@xy ~]# unalias rm  #unalias 的用法
[root@xy ~]# rm xy.txt
[root@xy ~]# alias rm='mv -t /data' #-t -target-directory

# export # 变量名, 提升变量为全局变量
[root@xy test]# type -a true #type 命令名称 内部还是外部
true is a shell builtin
true is /bin/true
true is /usr/bin/true
[root@xy test]# type true
true is a shell builtin
[root@xy test]# env #env 查看所有的环境变量
[root@xy ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
[root@xy ~]# PATH=$PATH:/root/bin #增加PATH
[root@xy ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin: # /root/bin

19. 配置主机名

1
2
3
4
[root@xy ~]# vim /etc/hostname  
xy.com
[root@xy ~]# hostname
xy.com

20. 配置网卡信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@xy ~]# cd /etc/sysconfig/network-scripts/  
[root@xy network-scripts]# ls
ifcfg-eno16777736  ifdown-ppp  ifup-eth ifup-sit
ifcfg-lo ifdown-routes ifup-ippp ifup-Team
ifdown ifdown-sit ifup-ipv6 ifup-TeamPort
ifdown-bnep ifdown-Team ifup-isdn ifup-tunnel
[root@xy network-scripts]# vim ifcfg-eno16777736  # RHEL5,6 ifcfg-eth
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
HWADDR=00:0C:29:11:26:05
IPADDR0=192.168.37.10
PREFIX0=24
GATEWAY0=192.168.37.1
DNS1=192.168.37.1
[root@xy network-scripts]# systemctl restart network
[root@xy network-scripts]# ping 192.168.37.10
[root@xy ~]# dmesg |grep -i eno # 查看网卡模块
[root@xy ~]# modprobe -r e1000 # 卸载网卡模块
[root@xy ~]# modprobe e1000 # 装载网卡模块

21. 配置Yum软件仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@xy ]# vim /etc/yum.repos.d/rhel7.repo # 创建本地yum源 
[rhel-media]
name=xy
baseurl=file:///media/cdrom file:ftp:// file:http:// file:///
enabled=1  # 启用
gpgcheck=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release

[root@xy yum.repos.d]# mkdir -p /media/cdrom
[root@xy yum.repos.d]# mount /dev/cdrom /media/cdrom  # mount 设备 挂载目录
mount: /dev/sr0 is write-protected,mounting read-only

[root@xy yum.repos.d]# vim /etc/fstab
/dev/cdrom /media/cdrom iso9660 default 0 0 # fstab 文件写法
[root@xy yum.repos.d]# yum install httpd  # 测试
Dependencies Resolved
........省略部分信息........
Install 1 Package (+4 Dependent packages)
........省略部分信息........
Is this ok [y/d/N]: y
........省略部分信息........
Complete!

22. 编写简单的shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 执行成功返回值:0,否则返回值为非 0 数字
[root@xy test]# vim example.sh # bash -n file.sh 检测语法错误
#!/bin/bash
#For Example BY xy.com
pwd
ls -al
[root@xy test]# bash example.sh
/root/test
total 8
drwxr-xr-x. 2 root root 23 Jul 7 18:29 .
dr-xr-x---. 15 root root 4096 Jul 7 18:29 ..
-rw-r--r--. 1 root root 46 Jul 7 18:29 example.sh
[root@xy ShellExample]# ./example01.sh
-bash: ./example01.sh: Permission denied
[root@xy ShellExample]# chmod u+x example01.sh

23. 接收用户的参数

选项 说明
$0 对应当前Shell脚本名称
$# 对应总共有几个参数
$* 对应所有位置参数值
$? 对应显示上一次命令的执行返回值
$1 /$2 /$3 对应第N个位置的参数值
1
2
3
4
5
6
7
8
9
[root@xy test]# vim example02.sh 
#!/bin/bash
echo "当前脚本名称为$0" # $0 当前Shell脚本名称
echo "总共有$#个参数,分别是$*." # $# 参数个数
echo "第一个参数为$1,第五个参数为$5." # $ 所以位置的参数值
[root@xy test]# sh example02.sh one two three four five six
当前脚本名称为example02.sh
总共有6个参数,分别是one two three four five six.
第一个参数为one,第五个参数为five.

24. 判断用户的参数

24.1 文件

选项 说明
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断文件是否为一般文件
-r 测试当前用户是否有读权限
-w 当前用户是否有写权限
-x 当前用户是否有执行权限
$? 显示上一次命令的执行返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@xy ~]# [ -d /etc/fstab ]	# 测试文件是否为目录类型
[root@xy ~]# echo $?
1
[root@xy ~]# [ -f /etc/fstab ] # 判断是否为一般文件
[root@xy ~]# echo $?
0
[root@xy ~]# [ -e /dev/cdrom ] && echo "Exist" # 当前面执行成功则执行后面,整个表达式返回值 为 0
Exist
[root@xy ~]# su - xy
[xy@xy ~]$ [ $USER = root ] || echo "user" # 当前执行失败则执行后面
user
[xy@xy ~]$ exit
logout
[root@xy ~]# [ ! $USER = root ] || echo "administrator"
administrator

24.2 数字

选项 说明
-eq 是否相等
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于/小于
-ge 是否等于/大于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@xy ~]# [ 10 -gt 10 ]    
[root@xy ~]# echo $?
1
[root@xy ~]# [ 10 -eq 10 ]
[root@xy ~]# echo $?
0
[root@xy ~]# free -m
total used free shared buffers cached
Mem: 1987 1197 789 9 0 280
-/+ buffers/cache: 916 1071
Swap: 2063 0 2063
[root@xy ~]# free -m | grep Mem:
Mem: 1987 1198 789 9 0 280
[root@xy ~]# free -m |grep Mem: |awk '{print $4}'
789
[root@xy ~]# FreeMem=`free -m |grep Mem: |awk '{print $4}'`
[root@xy ~]# echo $FreeMem
789
[root@xy ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
Insufficient Memory

24.3 字符串

选项 说明
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
1
2
3
4
5
6
7
[root@xy ~]# [ -z $String ] 
[root@xy ~]# echo $?
0
[root@xy ~]# echo $LANG
en_US.UTF-8
[root@xy ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US

25. 流程控制语句

25.1 if条件测试语句

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@xy test]# vim mkcdrom.sh  
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]; then
mkdir -p $DIR
fi
[root@xy test]# bash mkcdrom.sh
[root@xy test]# ls -d /media/cdrom/
/media/cdrom/
[root@xy test]# vim chkhost.sh
[root@xy test]# bash mkcdrom.sh
---

[root@xy test]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null # /dev/null 没有回收功能的垃圾箱
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
[root@xy test]# bash chkhost.sh 192.168.37.10
Host 192.168.37.10 is On-line.
[root@xy test]# bash chkhost.sh 192.168.37.20
Host 192.168.37.20 is Off-line.
---

[root@xy test]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
[root@xy test]# bash chkscore.sh
Enter your score (0-100): 88
88 is Excellent

26.2 for条件循环语句(for 变量名 in 取值列表 do 命令序列 done)

说明:/dev/null 是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持清洁.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@xy test]# vim users.txt  
andy
barry
carll
duck
[root@xy test]# vim usersadd.sh
#!/bin/bash
read -p "Enter The Users Password:" PASSWD #read 读取用户输入信息
for UNAME in `cat users.txt` #$(cat users.txt)
do
id $UNAME &> /dev/null #id 用户名
if [ $? -eq 0 ]; then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]; then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
[root@xy test]# bash usersadd.sh
Enter The Users Password: 19937100xy
andy ,Create success
barry ,Create success
carl ,Create success
duck ,Create success
[root@xy test]# tail -6 /etc/passwd
andy:x:1001:1001::/home/andy:/bin/bash
barry:x:1002:1002::/home/barry:/bin/bash
carl:x:1003:1003::/home/carl:/bin/bash
duck:x:1004:1004::/home/duck:/bin/bash
---

[root@xy test]# vim ipadds.txt
192.168.37.10
192.168.37.11
192.168.37.12
[root@xy test]# vim CheckHosts.sh
#!/bin/bash HLIST=$(cat ~/ipadds.txt)
for IP in `cat ipadds.txt` # for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
[root@xy test]# bash CheckHosts.sh
Host 192.168.37.10 is On-line.
Host 192.168.37.11 is Off-line.
Host 192.168.37.12 is Off-line.

26.3 while条件循环语句(while 条件测试操作 do 命令序列 done)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@xy test]# vim Guess.sh  
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品的实际价格在0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done

26.4 case条件测试语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@xy ShellExample]# vim checkkeys.sh 
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "您输入的是$KEY字母。"
;;
[0-9])
echo "您输入的是$KEY数字。"
;;
*)
echo "您输入的是空格、功能健或其他控制字符。"
;;
esac
[root@xy ShellExample]# bash checkkeys.sh
请输入一个字符,并按Enter键确认:4
您输入的是4数字。

27. 计划任务服务程序 (一次性、长期性计划任务)

1
2
3
4
5
6
7
8
1 # Example of job definition:  
2 # .---------------- minute (0 - 59)
3 # | .------------- hour (0 - 23)
4 # | | .---------- day of month (1 - 31)
5 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
6 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
7 # | | | | |
8 # * * * * * user-name command to be executed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@xy ~]# at 23:30  
at > systemctl restart httpd #echo "systemctl restart httpd" |at 23:30
at > 此处按下Ctrl+d 组合键来结束编写任务计划
job 3 at Mon Apr 27 23:30:00 2017
[root@xy ~]# at -l #查看一次性计划任务
3 Mon Apr 27 23:30:00 2017 a root
[root@xy ~]# at -d 3 # 同 atrm
---

[root@xy ~]# crontab -e
[root@xy ~]# crontab -l  # crontab - l 查看 crontab -r 删除
00 3 * * * cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +%F)
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
分 时 日 月 周 任务 # 没有设置的用*占位,表示每

# 注:分字段必须有, 每分钟用* 或者 */1表示; 日、周不能同时有,否则会冲突

[root@xy ~]# whereis rm  # whereis 命令 查询命令所在路径
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@xy ~]# crontab -e
crontab: installing new crontab
[root@xy ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup-tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

28. 用户身份

相关文件:

1
2
3
4
5
6
7
8
9
/etc/passwd 
用户名 :密码标识位 :UID :GID :组名 :家目录 :shell

/etc/shadow
用户名 :MD5paswd :密码修改时间(19700101) :两次修改密码时间间隔 :密码有效期 :密码到期前的警告天数 :密码过期后的宽限天数 :密码失效时间

/etc/group /etc/gshadow /etc/skel
root:x:0:
组名:密码:GID:附加组

28.1 useradd:

参数 作用
-u 指定该用户默认UID
-g 指定一个初始用户基本组,须存在
-G 指定附加组, 须存在
-d 指定用户家目录(默认/home/username)
-s 指定该用户默认Shell解释器
-m 创建家目录, 用于系统用户
-M 不创建家目录, 用于非系统用户
-r 设置系统账号 #不会自动生成家目录
-c,comment 描述信息
-e,expire_date 账户到期时间(YYYY-MM-DD)
命令 说明
id -u -g -G -n
finger username
chsh 修改shell
chfn 修改注释信息
1
2
3
4
[root@xy ~]# getent shadow xy   # getent passwd xy  
[root@xy ~]# useradd -d /home/xy -u 8888 -s /sbin/nologin xy
[root@xy ~]# id xy
uid=8888(xy) gid=8888(xy) groups=8888(xy)

28.2 passwd

选项 说明
--stdin 允许标准输入改密码 `echo “NewPassWord”
-l 锁定用户
-u 解锁用户
-e 使用户密码立即过期,下次登录强制修改密码
-d 使该用户可以用空密码登陆系统
-n 设置修改密码的最短天数
-x 设置修改密码的最长天数
-k 为密码已经过期的用户更新有效期
-w 设置密码过期前告警的天数
-i 设置密码过期后多少天禁用该用户
-S 显示用户密码相关描述
chage 修改用户密码策略
-d 最近一次修改时间
-E 过期时间
-I 非活动时间
-m 最短使用期限
-M 最长使用期限
-w 警告时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@xy ~]# passwd xy 
Changing password for user xy.
New password:
Retype new password:
asswd: all authentication tokens updated successfully.
[root@xy ~]# passwd -l xy
Locking password for user xy.
passwd: Success
[root@xy ~]# passwd -u xy
Unlocking password for user xy.
passwd: Success
[root@xy ~]# passwd -S xy # -S --ststus
xy PS 2018-07-06 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@xy ~]# passwd -n 7 -x 60 -w 10 -i 30 xy # 7天内不能更改密码,60天后必须改密,过期前10天通知,过期后30天禁用该用户
[root@xy ~]# groupadd ronny # groupadd -g ID groupdel
[root@xy ~]# gpasswd -a / -d user group # 把用户从组中加入/删除

28.3 userdel

选项 说明
-f 强制删除用户
-r 同时删除用户及家目录
1
2
3
4
5
[root@xy ~]# id xy  
uid=8888(xy) gid=1000(xy) groups=1000(xy),0(root)
[root@xy ~]# userdel -r xy
[root@xy ~]# id xy
id: xy: no user

28.4 usermod

选项 说明
-u 修改用户UID
-g 修改用户初始组
-aG 修改用户附加组,追加不覆盖
-l 修改用户名
-s 变更默认终端
-c,--comment 填写用户备注信息
-d -m 重新指定用户的家目录并自动迁移数据
-e,–expire_date 账户到期时间(YYYY-MM-DD)
-L,–Lock 锁定用户禁止登陆系统
-U,–Unlock 解锁用户,允许登陆系统
1
2
3
4
5
6
7
8
[root@xy ~]# usermod -aG root xy  # 用户xy追加附加组root  
[root@xy ~]# id xy
uid=1000(xy) gid=1000(xy) groups=1000(xy),0(root)
[root@xy ~]# usermod -u 8888 xy
[root@xy ~]# id xy
uid=8888(xy) gid=1000(xy) groups=1000(xy),0(root)
[root@xy ~]# gpasswd -a xy root
[root@xy ~]# gpasswd -d xy root

28.5 chmod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
who: u g o a
opt: + - =
per: r=4 w=2 x=1 #r,可浏览文件列表; w,可创建删除文件; x,访问目录的内容;

#umask
umask: 0002 (掩码)
目录: 777=umask+default
文件: 666=umask+default
当文件权限通过666-umask计算后,某位有奇数,则将其权限+1;
#特殊权限
SUID: 作用于二进制程序,执行此文件,临时具有所有者的权限, /bin/passwd
chmod u+s #s=4
SGID: 作用于二进制程序,执行此文件,临时具有所属组的权限, /bin/passwd
作用于目录上,创建的新文件,文件的所属组继承目录的所属组
Sticky: 作用与目录,只能删除此目录中自己文件, /tmp #s=2
chmod o+t #t=1

29. netstat(-atlnp)

选项 说明
-t, --tcp 指明显示TCP端口
-u, --udp 指明显示UDP端口
-a, --all
-r, --route 显示核心路由信息
-l, --listen 仅显示监听套接字
-p, --PID 显示进程标识符
-n, --numeric 不解析服务的名称

30. ss(-antlp)

选项 说明
-t, --tcp 显示 TCP 协议的 sockets
-u, --udp 显示 UDP 协议的 sockets
-n, --numeric 不解析服务的名称,如 “22” 端口不会显示成 “ssh”
-l, --listening 只显示处于监听状态的端口
-p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-r, --resolve 把 IP 解释为域名,把端口号解释为协议名称

31. lsof: list open files

1
2
lsof -i:8022 
lsof -i tcp

32. 文件归属与权限

选项 说明
- 普通文件
d 目录文件
l 链接文件
b 块设备文件,按块为单位,随机访问的设备(硬盘)
c 字符设备文件,按字符为单位,线性设备(键盘)
p 管道文件
r (可读)-4
w (可写:编辑、新增、修改、删除文件实际内容) -2
x (执行)-1
1
2
3
[root@xy ~]# ls -l initial-setup-ks.cfg
drwxr-xr-x. 2 anyue anyue 6 Jul 27 14:59 Videos
| 文件类型 | 7 | 5 | 5 | 属主 | 属组 | 大小 | 修改时间 | 文件名 |

SUID是一种对二进制程序进行设置的特殊权限, 可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效), 相应进程的属主是程序文件自身的属主, 而不是调用者

1
2
3
4
5
6
[root@xy ~]# ll /bin/cat  
-rwxr-xr-x 1 root root 23260 Jan 30 2014 /bin/cat
[root@xy ~]# chmod u+s /bin/cat # chmod u-s FILE
-rwxsr-xr-x 1 root root 23260 Jan 30 2014 /bin/cat

[anyue@xy ~]# cat /etc/shadow # 可以查看shadow

SGID:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)在某个目录中创建的文件自动集成该目录的用户组(只可以对目录进行设置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@xy ~]# useradd hadoop; useradd hbase;    
[root@xy ~]# mkdir /tmp/project
[root@xy ~]# groupadd deve; chown -R :deve /tmp/project/
[root@xy ~]# usermod -aG deve hadoop; usermod -aG deve habase
[hadoop@xy project]# ls -ld
drwxr-xr-x 2 root deve 4096 Jan 8 18:55 . # hadoop 无写权限
[root@xy tmp]# chmod g+w /tmp/project # 添加写权限
[hadoop@xy project]# ls -l
-rw-rw-r-- 1 hadoop hadoop 0 Jan 8 18:58 a.hadoop
-rw-rw-r-- 1 habase habse 0 Jan 8 18:58 a.habase
[root@xy ~]# chmod g+s /tmp/project
[root@xy ~]# ls -ld /tmp/project
drwxrwsr-x 2 root deve 4096 Jan 8 18:59 /tmp/project
[hadoop@xy project]# touch b.hadoop
-rw-rw-r-- 1 hadoop deve 0 Jan 8 19:00 b.hadoop

chmod 权限 文件或目录名称 u g o + - = rwx
chown 所有者:所属组 文件或目录名称 --reference=/path/file modFile,...

SBIT(Sticky Bit):特殊权限位可确保用户只能删除自己的文件,而不能删除其它用户的文件.即当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了

1
2
3
4
[root@xy ~]$ chmod o+t /tmp/project  
[root@xy ~]# ls -ld /tmp/project
drwxrwsr-t 2 root deve 4096 Jan 8 19:05 /tmp/project
[root@xy ~]$ chmod 3755 /tmp/project # SUID SGUID Sticky(000-111)

33. 文件的隐藏属性

33.1 chattr(+参数 -参数)

  • i: 不能删除、改名、更改
  • a: 只能追加内容
1
2
3
4
5
6
7
8
9
[root@xy test]# chattr +a linuxprobe   # Append Only 
[root@xy test]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
rm: cannot remove ‘linuxprobe’: Operation not permitted
[root@xy test]# chattr -a linuxprobe
[root@xy test]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
[root@xy test]# lsattr linuxprobe # 隐藏权限
[root@xy test]# -----a--------- linuxprobe

33.2 文件访问控制表(ACL)

选项 说明
-m 设定权限
-x 取消权限
-b, –remove all 移除所有
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
27
[xy@xy ~]$ cd /root  
-bash: cd: /root: Permission denied
[xy@xy root]$ exit
[root@xy ~]# setfacl -Rm u:xy:rwx /root
[root@xy ~]# su -xy
Last login: Sat Mar 21 21:45:04 CST 2018 on pts/1
[xy@xy ~]$ cd /root
[xy@xy root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[xy@xy ~]# cat anaconda-ks.cfg
[xy@xy ~]# exit
[root@xy ~]# ls ld /root
dr-xrwx---+ 14 root root 4096 May 4 2018 /root
[root@xy ~]# setfacl -x u:xy /root
[root@xy ~]# getfacl /root # getfacl 显示ACL信息
getfacl: Removing leading '/' from absolute path names
1 # file: root
2 # owner: root
3 # group: root
user::r-x
user:xy:rwx
group::r-x
mask::rwx
other::---

[root@xy ~]# whereis ps # 搜索命令所在位置及帮助文档
ps: /usr/bin/ps /usr/share/man/man1/ps.1.gz /usr/share/man/man1p/ps.1p.gz

补充小知识:

1
2
3
4
5
locate     # 文件名搜索   
快捷的在`locatedb`中搜索文件名, 因为是在本地数据库中搜索`/var/lib/mlocate`, 所以速度很快, 但数据库更新为1天, 所以使用`updatedb`更新数据库;
whoami # 当前登陆用户
whatis ls # 查看命令作用
which ls # 查看命令所在位置及别名 whereis 更详细

:link:Rhel-7-yum源配置-1
:link:Rhel-7-yum源配置-2
:link:Rhel-7-yum源配置-3
:link:RHEL-7-yum优先级设置-1
:link:RHEL-7-yum优先级设置-2

:link:umask 命令参考

文件的默认权限666, 创建目录的默认权限 777, 而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值, 文件默认不能具有执行权限,如果算的结果中右执行权限,则将其权限加1;

权限 = 默认权限 - umask

文件系统命令补充:

1
2
3
4
5
6
7
dumpe2fs -h /dev/sd*	#查看分区概览信息
fdisk -l #显示磁盘信息
fdisk -t #更改分区系统的ID
fsck -y /dev/sdb1 #文件系统修复命令

partx -a /dev/DEVICE partx -d --nr number /dev/device #CentOS6
partprobe /dev/DEVICE #CentOS5,7

相关解压压缩命令

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
1、gzip gunzip:
gzip /PATH/SOMEFILE #压缩后会删除源文件(不支持目录压缩)
-d 解压缩
-# 1-9(压缩率)
gunzip /PATH/SOMEFILE.gz #解压后会删除源文件
zcat /PATH/SOMEFILE.gz #不解压查看文本文件内容

2、bzip2 bunzip2
bzip2 /PATH/SOMEFILE
-d 解压缩
-k 保留源文件
-# 1-9(压缩率)
bunzip2 /PATH/SOMEFILE.bz2
bzcat /PATH/SOMEFILE.bz2 #不解压查看文本文件内容

3、xz unxz
xz /PATH/SOMEFILE
-d 解压缩
-k 保留源文件
-# 1-9(压缩率)
unxz /PATH/SOMEFILE.xz
xzcat /PATH/SOMEFILE.xz
4、zip unzip:
zip FILENAME.zip FILE1 FILE2 ...
unzip tmp.zip #指定解压目录

bash快捷键

快捷键 作用
Tab 命令补全
Ctrl+E 移动到行尾
Ctrl+C 移动到行首
Ctrl+L 清屏
Ctrl+U 删除/剪切
Ctrl+Y 粘贴
查询文件的第几行-第几行命令
1
2
cat file.txt |tail -n +10 |head -n20   # 从10行开始, 显示20行, 10~29
sed -n '5,10p' file.txt
命令提示符颜色更改

:link:PS1参考博文

:link:Shell脚本的颜色样式及属性控制

1
2
3
4
5
echo $PS1
vim /etc/profile.d/color.sh
PS1="\[\033[1;5;41;33m\][\u@\h\W\t\!]\\$\[\033[0m\]"
\u 当前用户 \H 主机名 \h 主机名简称 \w 当前工作目录
echo -e "\e[字体格式;背景色;前景色m字符串\e[0m" # \e[0m 关闭所有属性
总结:1位数表示字体显示格式
背景色(4) 字体色/前景色(3) 结束其他功能
40 黑色 30m 黑色 \033[0m 关闭所有属性
41 红色 31m 红色 \033[1m 设置高亮度
42 绿色 32m 绿色 \033[4m 下划线
43 黄色 33m 黄色 \033[5m 闪烁
44 蓝色 34m 蓝色 \033[7m 反显,显示为白底黑字,或黑底白字
45 紫色 35m 紫色 \033[8m 消隐,字符色与背景色相同
46 浅蓝色 36m 浅蓝色 \033[K 清除从光标到行尾的内容
47 灰色 37m 灰色
visudo (man 5 sudoers)
  • 用户名/%组名 被管理主机地址=(可使用的身份) 授权命令(绝对路径)
1
2
root    ALL=(ALL)    ALL
hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod
  • alias:
    1
    2
    3
    User_Alias USERADMIN = hadoop, %hadoop, %useradmin
    Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*, ! /usr/bin/passwd root
    USERADMIN ALL=(root) NOPASSWD: USERADMINCMND

Linux基础命令
https://anyu967.github.io/posts/4ac0a166.html
作者
anyu967
发布于
2019年6月11日
许可协议