前言
所谓Shell(壳),一般是指由操作系统提供的,用于计算机用户向操作系统输入相关指令并得到结果的程序。Shell可以字符形式的,也可以是图形界面形式的。 Shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于面向过程的程序。 在windows系统中见到的桌面即explorer.exe(资源管理器)是图形shell,而cmd就是命令行shell(Command shell)。 基础命令行和Shell都可以操作Linux系统,区别在于基础命令行(ls、cd等),是一种单一的操作;Shell可以比基础命令行更复杂,是一种组合型的操作。相比基础命令拥有了面向过程的概念。
常用命令
文件类
ls(目录)
列出目录内容。
参数:
-a
显示所有文件,包括隐藏的
-l
长格式列出信息
-i
显示文件inode号
-t
按修改时间排序
-r
按修改时间倒序排序
示例:
按修改时间排序:
# ls -t
按修改时间倒序排序:
# ls -rt
长格式列出:
# ls -l
查看文件inode:
# ls -i file
cat(打印)
连接文件和标准输出打印
参数:
-A
查看所有内容
-b
显示非空行行号
-n
显示所有行行号
-T
显示tab,用^I表示
-E
显示以$结尾
示例:
连接两个文件:
# cat a z
# cat << EOF
> 999
> ahzoo
> EOF
999
ahzoo
将eof标准输入作为cat标准输出再写到z.txt:
# cat > z.txt << eof
> 999
> ahzoo
> eof
wc(统计)
统计文件行数、字节、字符数
参数:
-c
打印文件字节数
-m
打印文件字符数
-l
打印多少行
示例:
统计文件多少行:
# wc -l z.txt
cp(复制)
参数:
-a
归档
-b
目标文件存在创建备份,备份文件是文件名跟~
-f
强制复制文件或目录
-r
递归复制目录
-p
保留原有文件或目录属性
-i
覆盖文件之前先询问用户
-u
当源文件比目的文件修改时间新时才复制
-v
显示复制信息
示例:
复制目录:
# cp -rf test /opt
mkdir(创建)
参数:
-p
递归创建目录
-v
显示创建过程
示例:
创建多级目录:
# mkdir /opt/test/ahzoo
创建多个目录:
# mkdir {install,tmp}
创建连续目录:
# mkdir {a..z}
mv(移动)
移动文件或重命名
参数:
-b
目标文件存在创建备份,备份文件是文件名跟~
-u
当源文件比目的文件修改时间新时才移动
-v
显示移动信息
示例:
移动文件:
# mv a.txt /opt
重命名文件:
# mv a.txt b.txt
find(查找)
搜索文件目录层次结构
格式:find path -optionactions
参数:
-name
文件名,支持(‘*’, ‘?’, and ‘[]’)
-type
文件类型,d
目录,f
常规文件等
-perm
符合权限的文件,比如755
-atime -/ n
在n天以内/过去n天被访问过
-ctime -/ n
在n天以内/过去n天被修改过
-amin -/ n
在n天以内/过去n分钟被访问过
-cmin -/ n
在n天以内/过去n分钟被修改过
-size -/ n
文件大小 小于/大于,b、k、M、G
-maxdepth levels
目录层次显示的最大深度
-regex pattern
文件名匹配正则表达式模式
-inum
通过inode编号查找文件
动作:
-detele
删除文件
-exec command {} ;
执行命令,花括号代表当前文件
-ls
列出当前文件,ls -dils
格式
-print
完整的文件名并添加一个回车换行符
-print0
打印完整的文件名并不添加一个回车换行符
-printf format
打印格式
示例:
代码语言:javascript复制查找文件名:
# find / -name "*http*"
查找文件名并且文件类型:
# find /tmp -name core -type f -print
查找文件名并且文件类型删除:
# find /tmp -depth -name core -type f -delete
查找当前目录常规文件并查看文件类型:
# find . -type f -exec file '{}' ;
查找文件权限是664:
# find . -perm 664
查找大于1024k的文件:
# find . -size -1024k
查找3天内修改的文件:
# find /bin -ctime -3
排除多个类型的文件:
# find . ! -name "*.sql" ! -name "*.txt"
或条件查找多个类型的文件:
# find . -name '*.sh' -o -name '*.bak'
# find . -regex ".*.sh|.*.bak"
# find . -regex ".*.(sh|bak)"
并且条件查找文件:
# find . -name "*.sql" -a -size 1024k
只显示第一级目录:
# find /etc -type d -maxdepth 1
通过inode编号删除文件:
# rm `find . -inum 671915`
# find . -inum 8651577 -exec rm -i {} ;
rm(删除)
参数:
-f
:强制删除,忽略不存在的文件,不提示确认
-i
:在删除前需要确认
-I
:删除超过三个文件或者递归删除前要求确认
-r
:递归删除目录及其内容
示例:
删除文件(需要确认)
# rm a.txt
删除目录(不需要确认)
# rm -r dir1
强制删除目录(不需要确认,慎用)
# rm -rf dir1
删除当前目录下的所有文件及目录
# rm -r *
解压缩类
tar(归档)
功能:归档目录或文件
参数:
-c
创建新归档
-d
比较归档和文件系统的差异
-r
追加文件到归档
-t
存档的内容列表
-x
提取归档所有文件
-C
改变解压目录
-f
使用归档文件或设备归档
-j
bzip2压缩
-z
gzip压缩
-v
输出处理过程
示例:
代码语言:javascript复制创建归档文件来自foo和bar:
# tar -cf archive.tar foo bar
提取归档的所有文件:
# tar -xf archive.tar
创建归档并gzip压缩:
# tar -zcvf archive.tar.gz log
提取归档文件并gzip解压:
# tar -zxvf log.tar.gz
创建归档并bzip2压缩:
# tar -jcvf log.tar.bz log
列出所有在archive.tar的文件:
# tar -tvf archive.tar
提取归档并解压到指定目录:
# tar -zxvf log.tar.gz -C /opt
zip(压缩)
zip 是个使用广泛的压缩程序,压缩后的文件后缀名为 .zip
。
语法:
zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>]
参数:
-A 调整可执行的自动解压缩文件。
-b<工作目录> 指定暂时存放文件的目录。
-c 替每个被压缩的文件加上注释。
-d 从压缩文件内删除指定的文件。
-D 压缩文件内不建立目录名称。
-f 更新现有的文件。
-F 尝试修复已损坏的压缩文件。
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-h 在线帮助。
-i<范本样式> 只压缩符合条件的文件。
-j 只保存文件名称及其内容,而不存放任何目录名称。
-J 删除压缩文件前面不必要的数据。
-k 使用MS-DOS兼容格式的文件名称。
-l 压缩文件时,把LF字符置换成LF CR字符。
-ll 压缩文件时,把LF CR字符置换成LF字符。
-L 显示版权信息。
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显示指令执行过程。
-r 递归处理,将指定目录下的所有文件和子目录一并处理。
-S 包含系统和隐藏文件。
-t<日期时间> 把压缩文件的日期设成指定的日期。
-T 检查备份文件内的每个文件是否正确无误。
-u 与 -f 参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 显示指令执行过程或显示版本信息。
-V 保存VMS操作系统的文件属性。
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。
-x<范本样式> 压缩时排除符合条件的文件。
-X 不保存额外的文件属性。
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。
-z 替压缩文件加上注释。
-$ 保存第一个被压缩文件所在磁盘的卷册名称。
-<压缩效率> 压缩效率是一个介于1-9的数值。
实例:
将/home/html/
这个目录下所有文件和文件夹打包为当前目录下的 html.zip:
# zip -q -r html.zip /home/html
如果在我们在 /home/html
目录下,可以执行以下命令:
# zip -q -r html.zip *
从压缩文件 cp.zip 中删除文件 a.c
代码语言:javascript复制# zip -dv cp.zip a.c
uzip(解压缩)
unzip为.zip
压缩文件的解压缩程序。
语法
unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]
参数:
-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
-f 更新现有的文件。
-l 显示压缩文件内所包含的文件。
-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
-t 检查压缩文件是否正确。
-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
-v 执行是时显示详细的信息。
-z 仅显示压缩文件的备注文字。
-a 对文本文件进行必要的字符转换。
-b 不要对文本文件进行字符转换。
-C 压缩文件中的文件名称区分大小写。
-j 不处理压缩文件中原有的目录路径。
-L 将压缩文件中的全部文件名改为小写。
-M 将输出结果送到more程序处理。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执行后覆盖原有文件。
-P<密码> 使用zip的密码选项。
-q 执行时不显示任何信息。
-s 将文件名中的空白字符转换为底线字符。
-V 保留VMS的文件版本信息。
-X 解压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定要处理.zip压缩文件中的哪些文件。
-d<目录> 指定文件解压缩后所要存储的目录。
-x<文件> 指定不要处理.zip压缩文件中的哪些文件。
-Z unzip -Z等于执行zipinfo指令。
实例:
查看压缩文件中包含的文件:
# unzip -l abc.zip
Archive: abc.zip
Length Date Time Name
-------- ---- ---- ----
94618 05-21-10 20:44 a11.jpg
202001 05-21-10 20:44 a22.jpg
16 05-22-10 15:01 11.txt
46468 05-23-10 10:30 w456.JPG
140085 03-14-10 21:49 my.asp
-------- -------
483188 5 files
gzip(压缩)
gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出.gz
的扩展名。
语法:
gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 或 gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][目录]
参数: -a或–ascii 使用ASCII文字模式。 -c或–stdout或–to-stdout 把压缩后的文件输出到标准输出设备,不去更动原始文件。 -d或–decompress或—-uncompress 解开压缩文件。 -f或–force 强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。 -h或–help 在线帮助。 -l或–list 列出压缩文件的相关信息。 -L或–license 显示版本与版权信息。 -n或–no-name 压缩文件时,不保存原来的文件名称及时间戳记。 -N或–name 压缩文件时,保存原来的文件名称及时间戳记。 -q或–quiet 不显示警告信息。 -r或–recursive 递归处理,将指定目录下的所有文件及子目录一并处理。 -S<压缩字尾字符串>或—-suffix<压缩字尾字符串> 更改压缩字尾字符串。 -t或–test 测试压缩文件是否正确无误。 -v或–verbose 显示指令执行过程。 -V或–version 显示版本信息。 -<压缩效率> 压缩效率是一个介于1-9的数值,预设值为”6”,指定愈大的数值,压缩效率就会愈高。 –best 此参数的效果和指定”-9”参数相同。 –fast 此参数的效果和指定”-1”参数相同。 实例: 压缩当前目录下所有文件
代码语言:javascript复制# gzip *
接上例, 列出详细的信息
代码语言:javascript复制# gzip -dv *
a.c.gz: 0.0% -- replaced with a.c
b.h.gz: 0.0% -- replaced with b.h
d.cpp.gz: 0.0% -- replaced with d.cpp
接上例,显示压缩文件的信息
代码语言:javascript复制# gzip -l *
compressed uncompressed ratio uncompressed_name
24 0 0.0% a.c
24 0 0.0% b.h
26 0 0.0% d.cpp
guzip(解压缩)
gunzip 是个使用广泛的解压缩程序,它用于解开被 gzip 压缩过的文件,这些压缩文件预设最后的扩展名为.gz
。事实上 gunzip 就是 gzip 的硬连接,因此不论是压缩或解压缩,都可通过 gzip 指令单独完成。
语法:
gunzip [-acfhlLnNqrtvV][-s <压缩字尾字符串>][文件...] 或 gunzip [-acfhlLnNqrtvV][-s <压缩字尾字符串>][目录]
参数: gunzip [-acfhlLnNqrtvV][-s <压缩字尾字符串>][文件…] 或 gunzip [-acfhlLnNqrtvV][-s <压缩字尾字符串>][目录] -a或–ascii 使用ASCII文字模式。 -c或–stdout或–to-stdout 把解压后的文件输出到标准输出设备。 -f或-force 强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接。 -h或–help 在线帮助。 -k或–keep 保留原始压缩文件。 -l或–list 列出压缩文件的相关信息。 -L或–license 显示版本与版权信息。 -n或–no-name 解压缩时,若压缩文件内含有远来的文件名称及时间戳记,则将其忽略不予处理。 -N或–name 解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其回存到解开的文件上。 -q或–quiet 不显示警告信息。 -r或–recursive 递归处理,将指定目录下的所有文件及子目录一并处理。 -S<压缩字尾字符串>或–suffix<压缩字尾字符串> 更改压缩字尾字符串。 -t或–test 测试压缩文件是否正确无误。 -v或–verbose 显示指令执行过程。 -V或–version 显示版本信息。 实例:
代码语言:javascript复制# gunzip ab.gz
系统类
date(日期)
功能:打印或设置系统日期和时间
参数: -d string 显示时间所描述的字符串 -f datefile 读取文件的每一行 -I 输出ISO 8601格式的日期和时间 -r 显示文件的最后修改时间 -R 输出RFC 2822格式的日期和时间 -s string 设置时间所描述的字符串 -u 打印或设置UTC时间
控制输出格式: %n : 下一行 %t : 跳格 %H : 小时(00..23) %I : 小时(01..12) %k : 小时(0..23) %l : 小时(1..12) %M : 分钟(00..59) %p : 显示本地 AM 或 PM %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) %s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61) %T : 直接显示时间 (24 小时制) %X : 相当于 %H:%M:%S %Z : 显示时区 %a : 星期几 (Sun..Sat) %A : 星期几 (Sunday..Saturday) %b : 月份 (Jan..Dec) %B : 月份 (January..December) %c : 直接显示日期与时间 %d : 日 (01..31) %D : 直接显示日期 (mm/dd/yy) %h : 同 %b %j : 一年中的第几天 (001..366) %m : 月份 (01..12) %U : 一年中的第几周 (00..53) (以Sunday为一周的第一天的情形) %w : 一周中的第几天 (0..6) %W : 一年中的第几周 (00..53) (以Monday为一周的第一天的情形) %x : 直接显示日期 (mm/dd/yy) %y : 年份的最后两位数字 (00.99) %Y : 完整年份 (0000..9999)
示例:
代码语言:javascript复制设置系统日期和时间:
# date -s "2016-12-15 00:00:00"
查看当前系统时间戳:
# date %s
查看当前系统时间:
# date '%F %T'
把日期和时间转换成时间戳:
# date -d "2016-12-15 18:00:00" %s
把时间戳转成时间:
# date -d '@1481842800' ' %F %T'
时间加减:
显示前一分钟:date -d '-1 minute' '%F %T'
显示上一周:date -d '-1 week' '%F %T'
显示前一天日期:date %F -d ' 1 day'
显示后一天日期:date %F -d '-1 day'
显示上一个月日期:date %F -d ' 1 month'
显示下一个月日期:date %F -d '-1 month'
显示上一年日期:date %F -d ' 1 year'
显示下一年日期:date %F -d '-1 year'
或
显示前一天日期:date -d yesterday %F
显示后一天日期:date -d tomorrow %F
天为单位,显示前一天现在时间:date -d '1 day ago' '%F %T'
秒为单位,显示一小时前现在时间:date -d '3600 second ago' '%F %T'
时间比较:
NOW_DATE=$(date '%F %T')
AGO_DATE=$(date -d "2016-12-15 18:00:00" %s)
[ $NOW_DATE -gt $AGO_DATE ] && echo yes || echo no
uname(系统信息)
打印系统信息 参数: -a 打印所有信息 -s 打印内核名称 -n 打印主机名 -r 打印内核发行版 -v 打印内核版本 -m 打印机器硬件名 -p 打印处理器类型 -i 打印硬件平台 -o 打印操作系统
示例:
代码语言:javascript复制打印所有系统信息:
# uname -a
打印主机名:
# uname -a
打印内核版本:
# uname -r
打印操作系统:
# uname -o
网络类
wget(下载)
非交互式网络下载,类似于HTTP客户端 参数: -b, –background 后台运行 日志记录和输入文件 -o, –output-file=FILE 日志写到文件 -a, –append-output=FILE 日志追加到文件 -d, –debug 打印debug信息,会包含头信息 -q, –quiet 退出,不输出 -i, –input-file=FILE 从文件中读取URL下载
下载选项: -t, –tries=NUMBER 设置链接重试次数 -O, –output-document=FILE 写入内容到文件 -nc, –no-clobber 跳过下载现有的文件 -c, –continue 断点续传 –progress=TYPE 设置进度条(dot和bar) -S, –server-response 打印服务器响应头信息 –spider 不下载任何内容 -T, –timeout=SECONDS 设置相应超时时间(还有–dns-timeout、–connect-timeout和–read-timeout) -w, –wait=SECONDS 两次重试间隔等待时间 –bind-address=ADDRESS 设置绑定地址 –limit-rate=RATE 限制下载速度 –user=USER 设置ftp和http用户名 –password=PASS 设置ftp和http密码
目录: -P, –directory-prefix=PREFIX 保存文件目录
HTTP选项: –http-user=USER 设置http用户名 –http-password=PASS 设置http密码 –proxy-user=USER 设置代理用户名 –proxy-password=PASS 设置代理密码 –referer=URL 设置Referer –save-headers 保存头到文件 –default-page=NAME 改变默认页面名字,默认index.html -U,–user-agent=AGENT 设置客户端信息 –no-http-keep-alive 禁用HTTP keep-alive(长连接) –load-cookies=FILE 从文件加载cookies –save-cookies=FILE 保存cookies到文件 –post-data=STRING 使用POST方法,发送数据
FTP选项: –ftp-user=USER 设置ftp用户名 –ftp-password=PASS 设置ftp密码 –no-passive-ftp 禁用被动传输模式
递归下载: -r, –recursive 指定递归下载 -l, –level=NUMBER 最大递归深度 -A, –accept=LIST 逗号分隔下载的扩展列表 -R, –reject=LIST 逗号分隔不被下载的扩展列表 -D, –domains=LIST 逗号分隔被下载域的列表 –exclude-domains=LIST 排除不被下载域的列表
示例:
代码语言:javascript复制下载单个文件到当前目录:
# wget http://nginx.org/download/nginx-1.11.7.tar.gz
放到后台下载:
# wget -b http://nginx.org/download/nginx-1.11.7.tar.gz
对于网络不稳定的用户使用-c和--tries参数,保证下载完成,并下载到指定目录:
# wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down
不下载任何内容,判断URL是否可以访问:
# wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz
下载内容写到文件:
# wget http://www.baidu.com/index.html -O index.html
从文件中读取URL下载:
# wget -i url.list
下载ftp文件:
# wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-minimal.iso
伪装客户端,指定user-agent和referer下载:
# wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --referer "http://nginx.org/en/download.html" http://nginx.org/download/nginx-1.11.7.tar.gz
查看HTTP头信息:
# wget -S http://nginx.org/download/nginx-1.11.7.tar.gz
# wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz
[
](http://nginx.org/download/nginx-1.11.7.tar.gz)
进程类
nohup(运行)
运行命令,忽略所有挂起信号 参数: 示例:
代码语言:javascript复制后台运行程序,终端关闭不影响:
# nohup bash test.sh &>test.log &
netstat(网络状态)
功能:打印网络连接、路由表、接口统计信息、伪装连接和多播成员 参数: -r 显示路由表 -i 显示接口表 -n 不解析名字 -p 显示程序名 PID/Program -l 显示监听的socket -a 显示所有socket -o 显示计时器 -Z 显示上下文 -t 只显示tcp连接 -u 只显示udp连接 -s 显示每个协议统计信息 示例:
代码语言:javascript复制显示所有监听:
# netstat -anltu
显示所有TCP连接:
# netstat -antp
显示所有UDP连接:
# netstat -anup
显示路由表:
# netstat -r
ss(网络状态)
比netstat更强大的socket查看工具
格式:ss [options] [ FILTER ]
参数: -n 不解析名字 -a 显示所有socket -l 显示所有监听的socket -o 显示计时器 -e 显示socket详细信息 -m 显示socket内存使用 -p 显示进程使用的socket -i 显示内部TCP信息 -s 显示socket使用汇总 -4 只显示IPV4的socket -0 显示包socket -t 只显示TCP socket -u 只显示UDP socket -d 只显示DCCP socket -w 只显示RAW socket -x 只显示Unix域socket -f FAMILY 只显示socket族类型( unix, inet,inet6, link, netlink) -A 查询socket{all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D 将原始的TCP socket转储到文件 -F 从文件中读取过滤信息
过滤: -o state 显示TCP连接状态信息
示例:
代码语言:javascript复制显示所有TCP连接:
# ss -t -a
显示所有UDP连接:
# ss -u –a
显示socket使用汇总:
# ss -s
显示所有建立的连接:
# ss -o state established
显示所有的TIME-WAIT状态:
# ss -o state TIME-WAIT
搜索所有本地进程连接到X Server:
# ss -x src /tmp/.X11-unix/*
lsof(列出文件/进程)
列出打开的文件(进程)
列出打开文件(lists openfiles)也可以表示列出进程。因为在Unix/Linux中,一切(包括网络套接口)都是文件
参数: -i [i] 监听的网络地址,如果没有指定,默认列出所有。[i] 来自[46][protocol][@hostname|hostaddr][:service|port] -U 列出Unix域socket文件 -p 指定PID -u 指定用户名或UID所有打开的文件 D 递归搜索
示例:
代码语言:javascript复制列出所有打开的文件:
# lsof
查看哪个进程占用文件:
# lsof /etc/passwd
列出所有打开的监听地址和unix域socket文件:
# lsof -i -U
列出80端口监听的进程:
# lsof -i:80
列出端口1-1024之间的所有进程:
# lsof -i:1-1024
列出所有TCP网络连接:
# lsof -i tcp
列出所有UDP网络连接:
# lsof -i udp
根据文件描述符列出打开的文件:
# lsof -d 1
列出某个目录被打开的文件:
# lsof D /var/log
列出进程ID打开的文件:
# lsof -p 5373
打开所有登录用户名abc或user id 1234,或PID 123或PID 456:
# lsof -p 123,456 -u 123,abc
列出COMMAND列中包含字符串sshd:
# lsof -c sshd
ps(进程快照)
报告当前进程的快照 参数: -a 显示所有进程 -u 选择有效的用户ID或名称 -x 显示无控制终端的进程 -e 显示所有进程 -f 全格式 -r 只显示运行的进程 -T 这个终端的所有进程 -p 指定进程ID –sort 对某列排序 -m 线程 -L 格式化代码列表 -o 用户自定义格式
CODE | NORMAL | HEADER |
---|---|---|
%C | pcpu | %CPU |
%G | group | GROUP |
%P | ppid | PPID |
%U | user | USER |
%a | args | COMMAND |
%c | comm | COMMAND |
%g | rgroup | RGROUP |
%n | nice | NI |
%p | pid | PID |
%r | pgid | PGID |
%t | etime | ELAPSED |
%u | ruser | RUSER |
%x | time | TIME |
%y | tty | TTY |
%z | vsz | VSZ |
示例:
代码语言:javascript复制查看指定进程信息
# ps 8080
打印系统上所有进程标准语法:
# ps -ef
打印系统上所有进程BSD语法:
# ps aux
打印进程树:
# ps axjf 或 ps -ejH
查看进程启动的线程:
# ps -Lfp PID
查看当前用户的进程数:
# ps uxm 或 ps -U root -u root u
自定义格式显示并对CPU排序:
# ps -eo user,pid,pcpu,pmem,nice,lstart,time,args --sort=-pcpu
或:
# ps -eo "%U %p %C %n %x %a"
top(活动进程)
动态显示活动的进程和系统资源利用率 参数: -d 信息刷新时间间隔 -p 只监控指定的进程PID -i 只显示正在使用CPU的进程 -H 显示线程 -u 只查看指定用户名的进程 -b 将输出编排成易处理格式,适合输出到文件处理 -n 指定最大循环刷新数
交互命令: f 添加或删除显示的指标 c 显示完整命令 P 按CPU使用百分比排序 M 按驻留内存大小排序 T 按进程使用CPU时间排序 1 显示每个CPU核心使用率 k 终止一个进程
示例:
代码语言:javascript复制刷新一次并输出到文件:
# top -b -n 1 > top.log
只显示指定进程的线程:
# top -Hp 123
iptables(防火墙)
iptables是Linux下的配置防火墙的工具,用于配置Linux内核集成的IP信息包过滤系统,使增删改查信息包过滤表中的规则更加简单。 iptables分为四表五链,表是链的容器,链是规则的容器,规则指定动作。 几种类型防火墙: ● 包过滤防火墙:包过滤是IP层实现,包过滤根据数据包的源IP、目的IP、协议类型(TCP/UDP/ICMP)、源端口、目的端口等包头信息及数据包传输方向灯信息来判断是否允许数据包通过。 ● 应用层防火墙:也称为应用层代理防火墙,基于应用层协议的信息流检测,可以拦截某应用程序的所有封包,提取包内容进行分析。有效防止SQL注入或者XSS(跨站脚本攻击)之类的恶意代码。 ● 状态检测防火墙:结合包过滤和应用层防火墙优点,基于连接状态检测机制,将属于同一连接的所有包作为一个整体的数据流看待,构成连接状态表(通信信息,应用程序信息等),通过规则表与状态表共同配合,对表中的各个连接状态判断。 四表:
filter | 用于包过滤 |
---|---|
nat | 网络地址转发 |
mangle | 对特定数据包修改 |
raw | 不做数据包链接跟踪 |
五链:
INPUT | 本机数据包入口 |
---|---|
OUTPUT | 本机数据包出口 |
FORWARD | 经过本机转发的数据包 |
PREROUTING | 防火墙之前,修改目的地址(DNAT) |
POSTROUTING | 防火墙之后,修改源地址(SNAT) |
表中的链:
表 | 链 |
---|---|
filter | INPUT、OUTPUT和FORWARD |
nat | PREROUTING、POSTROUTING和OUTPUT |
mangle | PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD |
raw | PREROUTING和OUTPUT |
命令格式:iptables [-t table] 命令 [chain] 匹配条件 动作
参数:
-A,append 追加一条规则
-I,insert 插入一条规则,默认链头,后跟编号,指定第几条
-D,delete 删除一条规则
-F,flush 清空规则
-L,list 列出规则
-P,policy 设置链缺省规则
-m,module 模块,比如state、multiport
匹配条件 -i 入口网卡 -o 出口网卡 -s 源地址 -d 目的地址 -p 协议类型 –sport 源端口 –dport 目的端口
动作: ACCEPT 允许数据包通过 DROP 丢弃数据包不做处理 REJECT 拒绝数据包,并返回报错信息 SNAT 一般用于nat表的POSTROUTING链,进行源地址转换 DNAT 一般用于nat表的PREROUTING链,进行目的地址转换 MASQUERADE 动态源地址转换,动态IP时使用
模块: state 包状态,有四个:NEW、RELATED、ESTABLISHED和INVALID mac 源MAC地址 limit 包速率限制 multiport 多端口,以逗号分隔 iprange 端口范围,以逗号分隔 示例:
代码语言:javascript复制常用的规则配置方法
iptables -F # 清空表规则,默认filter表
iptables -t nat -F # 清空nat表
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许TCP的22端口访问
iptables -I INPUT -p udp --dport 53 -j ACCEPT # 允许UDP的53端口访问,插入在第一条
iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT # 允许端口范围访问
iptables -D INPUT -p tcp --dport 22:25 -j ACCEPT # 删除这条规则
# 允许多个TCP端口访问
iptables -A INPUT -p tcp -m multiport --dports 22,80,8080 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许192.168.1.0段IP访问
iptables -A INPUT -s 192.168.1.10 -j DROP # 对1.10数据包丢弃
iptables -A INPUT -i eth0 -p icmp -j DROP # eth0网卡ICMP数据包丢弃,也就是禁ping
# 允许来自lo接口,如果没有这条规则,将不能通过127.0.0.1访问本地服务
iptables -A INPUT -i lo -j ACCEPT
# 限制并发连接数,超过30个拒绝
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT
# 限制每个IP每秒并发连接数最大3个
iptables -I INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
# iptables服务器作为网关时,内网访问公网
iptables –t nat -A POSTROUTING -s [内网IP或网段] -j SNAT --to [公网IP]
# 访问iptables公网IP端口,转发到内网服务器端口
iptables –t nat -A PREROUTING -d [对外IP] -p tcp --dport [对外端口] -j DNAT --to [内网IP:内网端口]
# 本地80端口转发到本地8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 允许已建立及该链接相关联的数据包通过
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ASDL拨号上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o pppo -j MASQUERADE
iptables -P INPUT DROP # 设置INPUT链缺省操作丢弃所有数据包,只要不符合规则的数据包都丢弃。注意要在最后设置,以免把自己关在外面!
权限类
chown(文件所有者)
chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。 Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符。 chown 需要超级用户 root 的权限才能执行此命令。 只有超级用户和属于组的文件所有者才能变更文件关联组。非超级用户如需要设置关联组可能需要使用 chgrp 命令。 使用权限 : root 语法:
代码语言:javascript复制chown [-cfhvR] [--help] [--version] user[:group] file...
参数 : user : 新的文件拥有者的使用者 ID group : 新的文件拥有者的使用者组(group) -c : 显示更改的部分的信息 -f : 忽略错误信息 -h :修复符号链接 -v : 显示详细的处理信息 -R : 处理指定目录以及其子目录下的所有文件 –help : 显示辅助说明 –version : 显示版本 实例: 把 /var/run/httpd.pid 的所有者设置 root:
代码语言:javascript复制# chown root /var/run/httpd.pid
将文件 file1.txt 的拥有者设为 ahzoo,群体的使用者 ahzoogroup :
代码语言:javascript复制# chown ahzoo:ahzoogroup file1.txt
将当前前目录下的所有文件与子目录的拥有者皆设为 ahzoo,群体的使用者 ahzoogroup:
代码语言:javascript复制# chown -R ahzoo:ahzoogroup *
把 /home/ahzoo
的关联组设置为 512 (关联组ID),不改变所有者:
# chown :512 /home/ahzoo
chmod(文件权限)
hmod(英文全拼:change mode)命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。
使用权限 : 所有使用者 语法:
代码语言:javascript复制chmod [-cfvR] [--help] [--version] mode file...
参数说明: mode : 权限设定字串,格式如下 :
代码语言:javascript复制[ugoa...][[ -=][rwxX]...][,...]
其中:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
- 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
- –help : 显示辅助说明
- –version : 显示版本符号模式 使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:
who | 用户类型 | 说明 |
---|---|---|
u | user | 文件所有者 |
g | group | 文件所有者所在组 |
o | others | 所有其他用户 |
a | all | 所用用户, 相当于 ugo |
operator 的符号模式表:
Operator | 说明 |
---|---|
| 为指定的用户类型增加权限 |
- | 去除指定用户类型的权限 |
= | 设置指定用户权限的设置,即将用户类型的所有权限重新设置 |
permission 的符号模式表:
模式 | 名字 | 说明 |
---|---|---|
r | 读 | 设置为可读权限 |
w | 写 | 设置为可写权限 |
x | 执行权限 | 设置为可执行权限 |
X | 特殊执行权限 | 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 |
s | setuid/gid | 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 |
t | 粘贴位 | 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位 |
八进制语法
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 写 执行 | rwx | 111 |
6 | 读 写 | rw- | 110 |
5 | 读 执行 | r-x | 101 |
4 | 只读 | r– | 100 |
3 | 写 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | –x | 001 |
0 | 无 | — | 000 |
例如, 765 将这样解释:
所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4 2 1 ,应该是 7。
用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4 2 0 ,应该是 6。
其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4 0 1 ,应该是 5。将文件 file1.txt 设为所有人皆可读取 : 将文件 file1.txt 设为所有人皆可读取 : 将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : 为 ex1.py 文件拥有者增加可执行权限: 将目前目录下的所有文件与子目录皆设为任何人可读取 : 此外chmod也可以用数字来表示权限如 : 语法为: 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
- 若要 rwx 属性则 4 2 1=7;
- 若要 rw- 属性则 4 2=6;
- 若要 r-x 属性则 4 1=5。
chmod a=rwx file
和chmod 777 file
效果相同。
chmod ug=rwx,o=x file
和chmod 771 file
效果相同。
若用 chmod 4755 filename 可使此程序具有 root 的权限。
更多说明
命令 | 说明 |
---|---|
chmod a r *file* | 给file的所有用户增加读权限 |
chmod a-x *file* | 删除file的所有用户的执行权限 |
chmod a rw *file* | 给file的所有用户增加读写权限 |
chmod rwx *file* | 给file的所有用户增加读写执行权限 |
chmod u=rw,go= *file* | 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限) |
chmod -R u r,go-r *docs* | 对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限 |
chmod 664 *file* | 对file的所有者和用户组设置读写权限, 为其其他用户设置读权限 |
chmod 0755 *file* | 相当于u=rwx (4 2 1),go=rx (4 1 & 4 1) |
。0 | |
没有特殊模式。 | |
chmod 4755 *file* | 4 |
设置了设置用户ID | |
位,剩下的相当于 u=rwx (4 2 1),go=rx (4 1 & 4 1)。 | |
find path/ -type d -exec chmod a-x {} ; | 删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件 |
find path/ -type d -exec chmod a x {} ; | 允许所有用户浏览或通过目录path/ |
端口相关命令
firewall
开启防火墙
代码语言:javascript复制# systemctl start firewalld
开放指定端口(8080)
代码语言:javascript复制# firewall-cmd --zone=public --add-port=8080/tcp --permanent
命令含义: –zone #作用域 –add-port=8080/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效
关闭指定端口(8080)
代码语言:javascript复制# firewall-cmd --zone=public --remove-port=8080/tcp --permanent
重启防火墙
代码语言:javascript复制# firewall-cmd --reload
查看防火墙所有开放的端口
代码语言:javascript复制# firewall-cmd --zone=public --list-ports
关闭防火墙
代码语言:javascript复制# systemctl stop firewalld.service
查看防火墙状态
代码语言:javascript复制# firewall-cmd --state
查询指定端口(8080)是否开启成功
代码语言:javascript复制# firewall-cmd --query-port=8080/tcp
iptables
安装命令:
代码语言:javascript复制# yum install iptables-services
防火墙
查询防火墙状态:
代码语言:javascript复制# service iptables status
停止防火墙:
代码语言:javascript复制# service iptables stop
启动防火墙:
代码语言:javascript复制# service iptables start
重启防火墙:
代码语言:javascript复制# service iptables restart
端口(配置文件)
由于防火墙规则的配置文件在/etc/sysconfig/iptables
路径,所以我们可以直接对配置文件进行修改。
打开配置文件:
# vi /etc/sysconfig/iptables
直接在配置文件中修改(开启8080端口):
代码语言:javascript复制-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
关闭端口: 只需要在上面的配置文件中删除添加的端口即可
端口(命令)
开启22端口:
代码语言:javascript复制iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
查看端口是否开启:
代码语言:javascript复制iptables -L -n
保存配置:
代码语言:javascript复制service iptables save
netstat
查看端口号
代码语言:javascript复制查看当前所有tcp端口
# netstat -ntlp
查看8080端口使用情况
# netstat -ntulp |grep 8080
kill
强制杀死进程
代码语言:javascript复制关闭8080端口
# kill -9 8080