menu Chancel's blog
rss_feed
Chancel's blog
我就是这样的人

CLI

作者:Chancel, 更新:2023 Jan 13, 字数:5072, 已阅:51

从事软件开发行业经常要接触一些命令,相较于图形操作系统的易用性,命令操作更多专业领域上,本文结合实际使用场景记录一些复杂的命令行用法。

1. Linux命令

1.1. 网络命令

1.1.1. 占用端口查找(netstat、ss、lsof、ffuser)

netstatss 是非常常见的端口占用查询方式,以下命令等价

netstat -tulpn | grep 8080 # 查找占用端口8080的程序
ss -tulpn | grep 8080 # 查找占用端口8080的程序

lsoffuser 是Linux中用于查看打开文件的命令行程序,也可以用于查看端口占用情况

lsof -i :8080 # 查找占用端口8080的程序
fuser -v 8080/tcp # 查找占用端口8080的程序

1.1.2. 网络探测(nc、telnet)

nc命令是Linux中非常好用的网络探测器,常用于检查对向端口(tcp/udp)是否开启

nc -zuv -w 5 114.114.114.114 53 # 查询114.114.114.114服务器的53端口是否接受UDP
nc -ztv -w 5 114.114.114.114 53 # 查询114.114.114.114服务器的53端口是否接受TCP

此外,还可以利用nc来扫描服务器开放端口

nc -ztv -w 2 114.114.114.114 1-100 # 查询114.114.114.114端口1-100的开放情况(tcp)

telnet命令是Linux/Windows下都支持的端口连通测试工具

telnet 114.114.114.114 53

1.1.3. 路由追踪(traceroute)

traceroute命令用于追查数据包的路由走向,判断两个网络之间的连通情况

traceroute -q 5 119.29.113.112

常见-q参数用于设置数据包数量,默认是3个数据包

1.2. 文本命令

grep查找匹配文本,sed更进一步查找匹配并编辑文本,awk适合定义复杂处理编辑文本方法

1.2.1. grep

grep是global regular expression print的缩写,其工作原理是读取每行并与搜索的字符串相匹配输出,支持正则表达式的输出

如常见的查找进程

❯ ps -ef | grep aria2c
chancel     1715    1358  0  2022 ?        00:00:30 /usr/bin/aria2c --conf=/etc/aria2c/aria2c.conf

对于grep而言,以下列举较为常见的匹配

# 统计head.js出现的次数
➜ grep -c 'head.js' www.log
449

# 搜索出现head.js的日志文件
➜ grep -l 'head.js' *
blog.log
www.access.log
www.log

# head.js出现的位置上下行展示 -A表示后面内容,-B表示前面内容,-C可代表A+B
➜ grep -A2 -B2 'head.js' www.log
36.235.132.115 - - [03/Jan/2023:08:46:02 +0000] "GET /static/css/mdui.min.css HTTP/1.1" 200 325338 "https://www.chancel.me/sw.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
36.235.132.115 - - [03/Jan/2023:08:46:02 +0000] "GET /static/js/mdui.min.js HTTP/1.1" 200 74021 "https://www.chancel.me/sw.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
36.235.132.115 - - [03/Jan/2023:08:46:02 +0000] "GET /static/js/head.js HTTP/1.1" 200 4602 "https://www.chancel.me/sw.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
36.235.132.115 - - [03/Jan/2023:08:46:02 +0000] "GET /static/icons/material-icons/MaterialIcons-Regular.woff2 HTTP/1.1" 304 0 "https://www.chancel.me/sw.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
36.235.132.115 - - [03/Jan/2023:08:46:02 +0000] "GET /static/fonts/roboto/Roboto-Regular.woff2 HTTP/1.1" 304 0 "https://www.chancel.me/sw.js" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"

# 正则表达式匹配
➜ grep -E '\?v\=[0-9]+' www.log
...
14.145.137.86 - - [03/Jan/2023:09:08:53 +0000] "GET /static/js/vue.min.js?v=1672489087.0 HTTP/1.1" 304 0 "https://www.chancel.me/articles/71" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
14.145.137.86 - - [03/Jan/2023:09:08:53 +0000] "GET /static/js/mdui.min.js?v=1672489087.0 HTTP/1.1" 304 0 "https://www.chancel.me/articles/71" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
14.145.137.86 - - [03/Jan/2023:09:08:53 +0000] "GET /static/js/head.js?v=1672489087.0 HTTP/1.1" 304 0 "https://www.chancel.me/articles/71" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
14.145.137.86 - - [03/Jan/2023:09:08:53 +0000] "GET /static/fonts/roboto/Roboto-Bold.woff2 HTTP/1.1" 304 0 "https://www.chancel.me/static/css/mdui.min.css?v=1672489087.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"

此外,还有以下常见参数

  • -s: 忽略错误信息
  • -i: 忽略大小写

1.2.2. sed

sed是stream editor的缩写,常见的用法是用于搜索替换一行,其形式通常类似于

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
# 删除gfwlist文件中的@@和||
➜ sed -i '/^$\|@@/d' gfwlist.txt

1.2.3. awk

...

1.3. 其他命令

1.3.1. ssh

ssh-copy-id 可推送ssh公钥到指定服务器上,将自动创建$HOME/.ssh/authorized_keys文件并写入公钥,如下

ssh-copy-id -i id_rsa.pub -p 22 chancel@192.168.1.1

1.3.2. du

du指令用于查看当前文件目录大小,但并不直观,以下列举常规用法

# 查看整个文件夹大小
du -sh

# 查看文件夹中分布的文件大小
du -hsx *

# 使用排序查看前6个文件夹大小
du -hsx *| sort -rh |

1.3.3. 命令输出

column -t 可以将大部分输出规整为表格形式输出,如下

mount | column -t

2. Windows命令

若无特别说明,以下命令均基于Windows10以上版本

2.1. 网络命令

2.1.1. 路由管理

route命令是Windows下的路由表管理工具,常见用法

ROUTE [-f] [-p] [-4|-6] command [destination]

打印路由表

route print

也可以单独打印ipv4的路由规则

route print -4

添加/删除路由

# 添加192.168.8.0/24网段默认路由走192.168.2.1,优先级为2,网卡指定1号网卡
route ADD 192.168.8.0/24 192.168.2.1 metric 2 if 1
# 删除上述路由规则
route DELETE 192.168.8.0/24 192.168.2.1 metric 2 if 1

修改由于route程序只支持修改网管跟跳数,所以用的少,一般直接删除重新添加

2.1.2. 端口占用

netstat是Windows下用于查看所有端口监听情况的程序,使用如下

netstat -ano

查找8080端口如下

netstat -ano | findstr '8080'

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]
目录