【liunx系统篇】开发中最常用的命令

2023-12-31 18:00:07

ls 命令

ls -a 列出目录所有文件,包含以.开始的隐藏文件
ls -A 列出除.及..的其它文件
ls -r 反序排列
ls -t 以文件修改时间排序
ls -S 以文件大小排序
ls -h 以易读大小显示
ls -l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来

最常用的当属ls -lls -a了。

cd 命令

cd .. 当前文件的上一级目录
cd ~ 进入家目录

pwd 命令

pwd 查看当前路径

mkdir 命令

mkdir -p /tmp/dub_dir 创建多级目录

rm 命令

rm -f file.txt 删除某文件
rm -rf dir 递归删除文件夹下的文件

慎用rm -rf *,尤其是在根目录或者家目录下,会删除所有东西,导致文件丢失,系统崩溃。

?mv 命令

mv可以实现文件夹或者文件重命名,也可以移动文件到指定路径

mv src_dir dst_dir #修改文件夹名并移动到指定路径

cp 命令

cp -r src dst 递归拷贝文件夹下的文件夹以及文件到指定路径

?cat 命令

cat > 1.txt #创建一个1.txt,然后进行编辑,编辑完后按ctrl+c键退出
cat 1.txt 2.txt > 3.txt 将两个文件合并为一个文件
cat -n 1.txt 打开1.txt并显示行号

more 命令

less 命令

head 命令

tail 命令

tail -f 1.log #通常用于实时显示结尾日志

which 命令

which     #查看可执行文件的位置。

find 命令

查找文件是否存在

find / -name '*.txt' #查找根目录下以txt结尾的文件

chmod 命令

-c 当发生改变时,报告处理信息
-R 处理指定目录以及其子目录下所有文件

权限范围

u :目录或者文件的当前的用户
g :目录或者文件的当前的群组
o :除了目录或者文件的当前用户或群组之外的用户或者群组
a :所有的用户及群组

权限代号

r :读权限,用数字4表示
w :写权限,用数字2表示
x :执行权限,用数字1表示
- :删除权限,用数字0表示
s :特殊权限

chmod a+x t.log #增加文件 t.log 所有用户可执行权限
chmod u=r t.log -c #撤销原来所有的权限,然后使拥有者具有可读权限,并输出处理信息
chmod u+r,g+r,o+r -R text/ -c #将 test 目录及其子目录所有文件添加可读权限

tar 命令

-c 建立新的压缩文件
-f 指定压缩文件
-r 添加文件到已经压缩文件包中
-u 添加改了和现有的文件到压缩包中
-x 从压缩包中抽取文件
-t 显示压缩文件中的内容
-z 支持gzip压缩
-j 支持bzip2压缩
-Z 支持compress解压文件
-v 显示操作过程

tar -zcvf /tmp/etc.tar.gz /etc #将 /etc 下的所有文件及目录打包到指定目录,并使用 gz 压缩
tar -zxvf /tmp/etc.tar.gz #解压etc压缩文件
tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc #要压缩打包 /home, /etc ,但不要 /home/dmtsai

chown 命令

chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID;组可以是组名或者组 ID;文件是以空格分开的要改变权限的文件列表,支持通配符。

-c 显示更改的部分的信息
-R 处理指定目录及子目录

chown -c mail:mail log2012.log #改变拥有者和群组 并显示改变信息
chown -c :mail t.log #改变文件群组
chown -cR mail: test/ #改变文件夹及子文件目录属主及属组为 mail

df 命令

df -haT #以易读方式列出所有文件系统及其类型

du 命令

-a 显示目录中所有文件大小
-k 以KB为单位显示文件大小
-m 以MB为单位显示文件大小
-g 以GB为单位显示文件大小
-h 以易读方式显示文件大小
-s 仅显示总计
-c或--total ?除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和

du -sh one --max-depth=1 #只显示one文件夹下深度为1的各文件夹及文件占用磁盘空间大小

ln 命令

可以减少相同文件的来回搬运复制,节省磁盘空间

ln -s src dst #dst链接地址指向src

软链接:

  • 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 2.软链接可以 跨文件系统 ,硬链接不可以
  • 3.软链接可以对一个不存在的文件名进行链接
  • 4.软链接可以对目录进行链接

硬链接:

  • 1.硬链接,以文件副本的形式存在。但不占用实际空间。
  • 2.不允许给目录创建硬链接
  • 3.硬链接只有在同一个文件系统中才能创建

-b 删除,覆盖以前建立的链接
-s 软链接(符号链接)
-v 显示详细处理过程

xargs 命令

xargs是一个命令行实用程序,用于将标准输入数据转换成命令行参数。它通常与其他命令一起使用,以处理由标准输入传递的数据。

基本语法:

command | xargs [options] [command]


查找当前目录下以txt结尾的文件,并将这些文件拷贝到指定目录,对我们归纳文件和文件传输有很大帮助。

find ./ -name '*.txt'| xargs -n 1 sudo cp -t /home/min/one

grep 命令

grep是一个用于在文本中搜索指定模式的命令行工具。把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入。它的基本语法如下:

grep [options] pattern [file...]
  • pattern是要搜索的模式或正则表达式。
  • file是要在其中搜索模式的文件。

-i:忽略大小写。

-r:递归搜索子目录。

-n:显示匹配行的行号。

-A n:显示匹配行以及之后的n行。

-B n:显示匹配行以及之前的n行。

-E:使用扩展正则表达式。

-o:仅显示匹配的部分。

从标准输入读取数据并搜索:

echo "some text" | grep "pattern"

awk 命令

awk是一种强大的文本处理工具,通常用于从文本文件中提取和处理数据。它以逐行方式扫描文件,并根据指定的模式和动作来处理每一行数据。

awk 'pattern { action }' file
  • pattern定义了要匹配的条件或模式。
  • action定义了在匹配到模式时要执行的操作。

打印文件的每一行:

awk '{ print }' file.txt

打印包含特定关键词的行:

awk '/keyword/ { print }' file.txt

计算并打印某列的总和:

awk '{ sum += $1 } END { print sum }' file.txt

使用自定义分隔符(比如逗号)进行处理:

awk -F',' '{ print $1, $2 }' file.csv

?sed 命令

  • 如何去掉行首的.字符: sed -i 's/^.//g' test.txt
  • 在行首添加一个a字符: sed 's/^/a/g' test.txt
  • 在行尾添加一个a字符: sed 's/$/a/' tets.txt
  • 在特定行后添加一个z字符:sed '/rumen/az' test.txt
  • 在行前加入一个c字符: sed '/rumenz/ic' test.txt

touch 命令

curl 命令

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

不带有任何参数时,curl 就是发出 GET 请求

curl https://www.example.com

?-A参数指定客户端的用户代理标头,即User-Agent

curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

?也可以通过-H参数直接指定标头,更改User-Agent

curl -H 'User-Agent: php/1.0' https://google.com

?-b参数用来向服务器发送 Cookie。

curl -b 'foo=bar' https://google.com

?上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。?

?-c参数将服务器设置的 Cookie 写入一个文件。

curl -c cookies.txt https://www.google.com

上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt

?-d参数可以读取本地文本文件的数据,向服务器发送。

curl -d '@data.txt' https://google.com/login

?上面命令读取data.txt文件的内容,作为数据体向服务器发送。

?-o参数将服务器的回应保存成文件,等同于wget命令。

curl -o example.html https://www.example.com

?-u参数用来设置服务器认证的用户名和密码。

curl -u 'bob:12345' https://google.com/login

?-x参数指定 HTTP 请求的代理。

curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com

?上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。

?-X参数指定 HTTP 请求的方法。

curl -X POST https://www.example.com

wget 命令

是一个命令行程序,用于从 Web 站点下载文件。Wget 可以让您可以使用HTTP,HTTPS和 FTP 协议下载文件。

wget下载并解压与标准输出

这是非常节省时间的高级技巧,它允许你一边下载一边解压。除了解压之外还可以做你任何想做的事,只要管道右侧的命令允许从标准输入读取数据即可。

要做到边下载边解压,需要使用 wget 命令 -q 选项关闭下载状态的标准输出,然后组合使用 wget 命令?-O?选项,指定标准输出作为文件。

在 wget 当使用连字符?-?作为文件时,则使用标准输出作为写入的文件,最后通过管道?|?传递给 tar 命令。

tar 将 wget 命令下载文件解压缩到指定目录。?-C?选项指定写入的目标目录,参数?-?选项表示从标准输入读取数据。

wget -q -O - "http://wordpress.org/latest.tar.gz" | tar -xzf - -C /var/www

wc 命令

tee 命令

tr 命令

tree 命令

pstree 命令

top 命令

scp 命令

rsync 命令

拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:

rsync -a /data /backup

?使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:

rsync -avz *.c foo:src

使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:?

rsync -avz foo:src/bar /data

从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:?

rsync -av root@192.168.78.192::www /databack

从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:

rsync -av /databack root@192.168.78.192::www

?列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:

rsync -v rsync://192.168.78.192/www

?参数列表

-v, --verbose 详细模式输出。
-q, --quiet 精简输出模式。
-c, --checksum 打开校验开关,强制对文件传输进行校验。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive 对子目录以递归模式处理。
-R, --relative 使用相对路径信息。
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-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命令所在路径信息。
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete 删除那些DST中SRC没有的文件。
--delete-excluded 同样删除接收端那些被该选项指定排除的文件。
--delete-after 传输结束以后再删除。
--ignore-errors 及时出现IO错误也进行删除。
--max-delete=NUM 最多删除NUM个文件。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force 强制删除目录,即使不为空。
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR 在DIR中创建临时文件。
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
-P 等同于 --partial。
--progress 显示备份过程。
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--progress 在传输时显示传输过程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
-h, --help 显示帮助信息。

Isof 命令

列出当前系统打开文件的工具。通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为?lsof?需要访问核心内存和各种文件,所以需要root用户执行

lsof打开的文件可以是:

1.普通文件

2.目录

3.网络文件系统的文件

4.字符或设备文件

5.(函数)共享库

6.管道,命名管道

7.符号链接

8.网络文件(例如:NFS?file、网络socket,unix域名socket)

9.还有其它类型的文件,等等

列出某个用户以及某个进程所打开的文件信息

lsof  -u test -c mysql

?列出所有tcp?网络连接信息

lsof -i tcp

?列出谁在使用某个端口

lsof -i :3306

kill 命令

网络 命令

netstat

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表实际的网络连接以及每一个网络接口设备的状态信息

-a或--all:显示所有连线中的Socket; 
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; 
-c或--continuous:持续列出网络状态; 
-C或--cache:显示路由器配置的快取信息; 
-e或--extend:显示网络其他相关信息; 
-F或--fib:显示FIB; 
-g或--groups:显示多重广播功能群组组员名单; 
-h或--help:在线帮助; 
-i或--interfaces:显示网络界面信息表单; 
-l或--listening:显示监控中的服务器的Socket; 
-M或--masquerade:显示伪装的网络连线; 
-n或--numeric:直接使用ip地址,而不通过域名服务器; 
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称; 
-o或--timers:显示计时器; 
-p或--programs:显示正在使用Socket的程序识别码和程序名称; 
-r或--route:显示Routing Table; 
-s或--statistice:显示网络工作信息统计表; 
-t或--tcp:显示TCP传输协议的连线状况; 
-u或--udp:显示UDP传输协议的连线状况; 
-v或--verbose:显示指令执行过程; 
-V或--version:显示版本信息; 
-w或--raw:显示RAW传输协议的连线状况; 
-x或--unix:此参数的效果和指定"-A unix"参数相同; 
--ip或--inet:此参数的效果和指定"-A inet"参数相同。

?常见用法

netstat -at     # 列出所有TCP端口
netstat -lt  # 显示监听TCP端口
netstat -antp | grep 22 #查看端口和服务
netstat -r #显示网络路由表状态信息
netstat -i #显示网卡当前状态信息

nc

nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。比如大家很熟悉使用telnet测试tcp端口,而nc可以支持测试linux的tcp和udp端口,而且也经常被用于端口扫描,甚至把nc作为server以TCP或UDP方式侦听指定端口做简单的模拟测试

nc的作用:

  1. 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
  2. 端口的扫描,nc可以作为client发起TCP或UDP连接
  3. 机器之间传输文件
  4. 机器之间网络测速

nc测试tcp和udp端口

# 测试tcp一般会想到使用telnet
telnet 192.168.12.10 22

# telnet不支持udp协议,所以我们可以使用nc,nc可以支持tcp也可以支持udp
yum install -y nc
nc -z -v 192.168.10.12 22 #tcp
nc -z -v -u 192.168.10.12 123 # udp

nc监听端口和扫描连接端口

# 监听端口
[root@localhost wangao]# nc -l 8888 -v
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::8888
Ncat: Listening on 0.0.0.0:8888
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:56090.

# 连接端口
[root@localhost wangao]# nc -vz -w 5 127.0.0.1 8888
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 127.0.0.1:8888.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

iptables

是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。

-t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。

# 通用匹配:源地址目标地址的匹配
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。

# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则

# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。

-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;
?iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

?配置允许ssh端口连接

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求

高级组合用法

  • 组合使用&&和||

创建一个名为的新目录112233,并使用 echo 命令打印“the sea scenery is great”

cd 112233 || mkdir 112233 && echo "the sea scenery is great"
  • 实时查看指定id为1的显卡的显存使用情况
wtach -n 0.2 nviida-smi -i 1
  • 批量替换文本文件中的 内容
cat anaconda-ks.cfg | tr [a-z] [A-Z]
  • 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
command >> 文件 2>&1
或
command &>> 文件
  • ?查找指定程序的我进程相关信息
ps -ef | grep python
  • ?查找当前目录下30天以前大于100M的log文件并删除
find . -name "*.log" –mtime +30 –typef –size +100M | xargs rm –rf {};
  • ?批量解压当前目录下以.zip结尾的所有文件到指定目录
for i  in  `find . –name "*.zip" –type f`
do
  unzip –d $i /data/www/
done
  • ?判断某个目录是否存在,不存在则创建,存在则打印信息
if [ ! –d /data/backup/ ];then
   mkdir –p /data/backup/
else
echo  "目录已存在"
fi

?-d 代表目录

  • ?nc批量端口扫描脚本
# 假如我们要监控一堆指定的IP和端口,可新建一个文件(第1列为服务器IP,第2列为监控的端口,中间用空格分隔)
[root@localhost ~]# vi ip-ports.txt
127.0.0.1 21
127.0.0.1 22
127.0.0.1 23

# 新建这样一个脚本来批量检测端口是否开放,成功会返回0值显示ok,失败会返回1值显示fail

[root@localhost ~]# vi ncports.sh
#!/bin/bash  

cat ip-ports.txt | while read line
do
  nc -w 10 -z $line > /dev/null 2>&1
  if [ $? -eq 0 ]
  then
    echo $line:ok
  else
    echo $line:failed
  fi
done

# 给脚本赋予可执行权限,并执行查看结果
[root@localhost ~]# chmod a+x ncports.sh
[root@localhost ~]# sh ncports.sh
127.0.0.1 21:failed
127.0.0.1 22:ok
127.0.0.1 23:failed

参考链接:

Linux 常用命令学习 | 菜鸟教程

?第2章 新手必须掌握的Linux命令 | 《Linux就该这么学》

?作为web程序员,该掌握的linux命令有哪些,稍微高级点的? - 知乎

?https://www.cnblogs.com/peida/archive/2013/02/26/2932972.html

curl 的用法指南 - 阮一峰的网络日志?

Verifying your browser... | myfreax?

https://wsgzao.github.io/post/nc/?

iptables 命令,Linux iptables 命令详解:Linux上常用的防火墙软件 - Linux 命令搜索引擎?

文章来源:https://blog.csdn.net/qq_44091004/article/details/135308475
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。