基础命令

date

# unix 时间戳
date +%s
# 时间戳日期转换
[root@allinone ~]# date -d @1674108177 +"%F %H:%m%S"
2023-01-19 14:0157

[root@allinone ~]# date -d "2023-01-19 14:01:57" +%s
1674108117

# 查看时区
[root@allinone ~]# date -R 
Fri, 07 Apr 2023 12:17:09 +0800
# 设置时区
[root@allinone ~]# export TZ=Americas
[root@allinone ~]# echo $TZ          
Americas
[root@allinone ~]# date -R 
Fri, 07 Apr 2023 04:13:29 +0000
[root@allinone ~]# export TZ='Asia/Shanghai'
[root@allinone ~]# date -R 
Fri, 07 Apr 2023 12:14:09 +0800
# 设置时区永久生效
ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

yum

# 查询包信息
yum info lrzsz
# 列出所有可以用的版本
yum search --showduplicates docker
# 安装软件
yum install -y lrzsz
yum localinstall -y lrzsz
# 卸载软件
yum remove -y lrzsz 

rpm

# 无法 rpm -ivh 无法安装rpm 的依赖
rpm -ivh *.rpm
rpm -qa lrzsz
rpm -ql lrzsz
rpm -e --nodeps `rpm -qa|grep ceph`

source

source /etc/profile

getent

# grep ^root /etc/passwd
getent passwd root

read

-p    指定提示符  
-t    指定超时时间
-s    隐藏输入内容
-u    读取文件描述符
-n    读取指定字符后自动回车 例如: read -n 1 -p "将在你输入第一个字符后自动回车:"
REPLY 默认接受键盘的输入的变量名

#read -t 30 -p "please input firstname:" firstname
#echo $firstname
#read -t 30 -p "please input firstname:"
#echo $REPLY

问题:如下格式的文件内容

hosts="192.168.0.1 host1,192.168.0.2 host2"

需求:转换成数组

echo $hosts|awk -F ',' '{for(i=1;i<=NF;i++){H[$i]}}'
# -r:这个选项使 read 命令在读取时不进行反斜杠转义处理,即它将反斜杠视为普通字符。
# -a:这个选项告诉 read 将输入读取为数组
# <<<:这是 Bash 的 here string 操作符,它允许你将文本作为命令的输入。
IFS=",";read -r -a H <<< "$hosts"
IFS=""

问题:如下格式的文件内容

cat <<EOF
192.168.0.1 host1
192.168.0.2 host2
EOF

需求:转换成数组

readarray -t H <<EOF
192.168.0.1 host1
192.168.0.2 host2
EOF	
# < <(echo $hosts):这部分是 process substitution(进程替换)的用法。进程替换允许你将一个命令的输出用作另一个命令的输入,就像文件一样。这里 < <() 创建了一个从 echo $hosts 命令的输出读取的"文件"

readarray -t H < <(echo -e "192.168.0.1 host1\n192.168.0.2 host2") 

stat

[root@master prometheus]# stat -c %A `which curl`
-rwxr-xr-x
[root@master prometheus]# stat -c %a `which curl`
755
[root@tencent-sh ~]# stat -c %s /etc/services
670293

echo

echo -e 
转义

    \a 发出警告声; 
    \b 删除前一个字符; 
    \c 最后不加上换行符号; 
    \f 换行但光标仍旧停留在原来的位置; 
    \n 换行且光标移至行首; 
    \r 光标移至行首,但不换行; 
    \t 插入tab; 
    \v 与\f相同; 
    \\ 插入\字符; 
    \nnn 插入nnn(八进制)所代表的ASCII字符;

printf


printf "%s\n" {1..20}
printf "%10s\n" {1..20}
printf "%-10s\n" {1..20}
printf "%2.2f\n" {1..20}
printf "%2d\n" {1..20}
printf "(%d)\n" {1..20} 

printf的优势就在于,可以用格式替换符,帮我们处理一长串的str

替换符号
格式替换符
名称	含义
%s	字符串
%f	浮点格式
%b	对应的参数包含转义字符时,对应的转义字符会被转义
%c	ASCII字符,显示对应参数的第一个字符
%d,%i	十进制整数
%o	不带正负号的八进制值
%u	不带正负号的十进制值
%x	不带正负号的十六进制值,用a到f表示10至15
%X	不带正负号的十六进制值,用A到F表示10至15
%%	表示‘%’本身

转义字符
名称	含义
\a	警告字符,常为ASCII的BEL字符
\b	后退
\c	不显示输出结果中任何结尾的换行字符(%b格式下的参数字符串依然有效)
\f	换页(formfeed)
\n	换行
\r	回车
\t	水平制表符
\v	垂直制表符
\\	“\”本身
\ddd	表示1到3位数八进制值得字符串,仅在字符格式串中有效
\0ddd	表示1到3位数八进制值得字符串

修饰符
参数	含义
%7s	7就代表当前替换符对应的输出长度为7个字符宽,不足补齐,超出也正常显示
%-7s	“-”,表示左对齐,不加时,是右对齐
%+5d	正数会自动变为+num
%12.3f	“.3”表示保留小数点后三位,%f默认是小数点后6位
%12.5d	“.5”表示整数的长度,不足用0补齐

tail

tail -100f /var/log/messages
tail -F /var/log/messages

tailf

head

sort

example

sort 1.txt  对文件内容进行默认排序
sort -r 1.txt    对文件进行逆向排序
sort -u 1.txt  排序并合并1.txt中相同内容
sort 1.txt  >2.txt   排序内容输出到2.txt中
cat 1.txt 2.txt|sort
cat 1.txt 2.txt|sort >3.txt  将1.txt和2.txt文件合并后排序输出到3.txt中
sort -n filename  按数字排序
sort -M filename 按月份排序
sort -t ":" -k 3 -n /etc/passwd  按照uid排序

uniq

uniq 3.txt               显示文件
uniq -d 3.txt            -d只显示重复行
uniq -u 3.txt            -u显示不重复的内容
uniq -c 3.txt            -c显示出现的次数

wc

-L, --max-line-length
      print the length of the longest line 文件中最长一行的字符数
wc -w 3.txt    显示字数
wc -l 3.txt    显示行数
wc -c 3.txt    显示字节数
ps -ef|grep ssh|wc -l     (统计出有多少行的ssh进程存在)

cat

cat -n  显示行号
cat -b
cat -A
cat >>1.log<<EOF
EOF
less -N  显示行号

tac

tee

 date|tee 1.log
 date|tee -a 1.log
 cat 1.log
 
 tee >>1.log<<EOF
 EOF

seq

语法 命令格式seq [OPTION]... FIRST INCREMENT LAST

从2开始到10结尾步长为1 seq 2 10

从2开始到10结尾步长为3 seq 2 3 10

从2开始到10结尾步长为3。设置等宽 seq -w 2 3 10

从2开始到10结尾步长为3。设置等宽,修改分隔符为空格 seq -s " " -w 2 3 10

cut

语法: cut OPTION... [FILE]

option

-c, --characters=LIST 
-d --delimiter=DELIM 
-f, --fields=LIST

example

echo "http://127.0.0.1/#/zh-cn/bash"|cut -c 1-4,8-10
#1-  表示从第一个字符到结尾
#-5  表示从第一个字符到第5个
echo "http://127.0.0.1/#/zh-cn/bash"|cut -c 1-
echo "http://127.0.0.1/#/zh-cn/bash"|cut -d '/' -f1,2,3

tr

translate or delete characters

删除 echo {a..z}{1..10}|tr -d [0-9]

替换 echo {a..z}{1..10}|tr [a-z] [A-Z]

find

find / -type f -name curl -or -name wget -perm 755 
find /var/log/ -type f -mtime +7|xargs rm -f
find /etc -name "host*"
find /etc -name "host*" -print
find /etc -name "host*" -print0
# 查找时排除指定文件夹./rules_file

find . -path "./rules_file" -prune -o -print

find /etc -user root
find /home -nouser
find /apps -group gem 
find / -nogroup

   [!]--maxdepth levels
   [!]-name 
    -o   or 或
    -a   and
    -mtime +-7
    -ctime +-7 
    -atime +-7
    -perm 
    [!]-type 

     b      block             mknod  创建块设备
     c      character 
     d      directory          mkdir 创建目录
     p      named pipe (FIFO)
     f      regular file       touch 创建普通文件   file  查看普通文件类型 
     l      symbolic link;     ln
     s      socket
     D      door (Solaris)

expr

'STRING : REGEX'
     执行模式匹配。两端参数会转换为字符格式,且第二个参数被视为正则表达式(GNU基本正则),它默认会隐含前缀"^"。随后将第一个参数和正则模式做匹配。
 
     如果匹配成功,且REGEX使用了'\('和'\)',则此表达式返回匹配到的,如果未使用'\('和'\)',则返回匹配的字符数。
 
     如果匹配失败,如果REGEX中使用了'\('和'\)',则此表达式返回空字符串,否则返回为0。
 
     只有第一个'\(...\)'会引用返回的值;其余的'\(...\)'只在正则表达式分组时有意义。
 
     在正则表达式中,'\+','\?'和'\|'分表代表匹配一个或多个,0个或1个以及两端任选其一的意思
[root@allinone ~]# expr "423-46-7" : "\([0-9]\{,3\}-[0-9]\{,3\}-[0-9]\{,3\}\)"
423-46-7
[root@allinone ~]# expr "423-46-7" : "[0-9]\{,3\}-[0-9]\{,3\}-[0-9]\{,3\}"    
8

返回字符串长度

[root@allinone ~]# expr length "zhangshan"  
9

touch
mkdir

mktemp

创建临时的文件:`mktemp`
创建临时的命名文件: `mktemp -t test.XXXXXXXXXX`
创建一个临时目录 `mktemp -d`
创建一个临时命名目录 `mktemp -d test.XXXXXXXXXX`

install
base64

base64加密 echo "123"|bash64
base64解码 echo $(echo 123|base64)|base64 -d

crontab

crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。

特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行。

# 编辑后的文件存放位置/var/spool/cron/root
echo "*/5 * * * * echo 1 >/dev/null 2>&1"/var/spool/cron/root
echo "10/5 * * * * echo 1 >/dev/null 2>&1"/var/spool/cron/root
echo "*/5 23,24 * * * echo 1 >/dev/null 2>&1"/var/spool/cron/root
echo "*/5 20-24 * * * echo 1 >/dev/null 2>&1"/var/spool/cron/root
crontab -e 
crontab -l
crontab -e -u root

at

curl

curl 是向服务端发送和接收数据的工具。
支持的协议(DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP,LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)


-k 允许自签证书

--cacert 指定ca

--cert指定公钥

--key指定私钥

curl -k --cacert /etc/kubernetes/pki/ca.crt  --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key  /etc/kubernetes/pki/apiserver-kubelet-client.key https://127.0.0.1:10250/metrics

# 模拟浏览器User-Agent
curl -H "User-Agent: Chrome" http://www.baidu.com
# 
curl -H "Host: www.baidu.com" http://nginx代理

# -X 参数
# -g, --globoff  允许url中存在 {} [] 等特殊字符
# -d pos方法传递的数据
curl -g -X GET http://47.113.100.31:9100/metrics?collect[]=cpu
curl -X POST http://172.16.100.10:8060/dingtalk/webhook1/send -H 'content-type: application/json' -d '{"password":"123"}'

# -w, --write-out 定义输出哪些http response
curl -o /dev/null -s -w "%{http_code}" baidu.com
200

# 下载文件
# -f, --fail  如果curl失败时不显示错误输出,主要用于书写脚本
# -s, --silent   静默
# -L, --location  如果站定已经搬迁,支持重定向
curl -fs www.baidu.com
curl -L www.baidu.com
# 返回服务器头信息
curl -I www.baidu.com

-m --max-time 整个请求的最大时长

要使用 curl 命令下载文件并显示进度条,你可以使用 -# 或 --progress-bar 选项来替代默认的进度指示器。这会显示一个简洁的进度条而不是详细的统计数据。如果你想看到详细的进度信息,可以使用 -v 或 --verbose 选项。

curl -# -o example.zip http://example.com/example.zip

wget

dig

dig example.com +trace
dig example.com +debug

mount

命令 参数 注释
mount 查看所有系统的挂载
mount -a 重新挂载/etc/fstab中的挂载
-o mount -o loop 挂载一个文件
mount -o ro 以只读的方式挂载

showmount

showmount 
解释:显示nfs服务端挂载信息
【参数】
-a --all     显示已经挂载的nfs目录和客户端IP
-e --exports 显示NFS服务端已经创建的共享
【例子】
showmount -e localhost



/etc/exports
解释:NFS系统文件配置

【参数】
rw     读写 默认不允许
ro     只读
sync   实时同步
async  异步同步
root_squash   root用户匿名访问
no_root_squash  root用户不匿名
all_squash      所有用户匿名访问
anonuid          匿名用户uid 
anongid          匿名用户gid

xargs

举例:
[root@test /]# cat 1.txt 
a b c d e f
a b c d e f
a b c d e f
a b c d e f
[root@test /]# cat 1.txt|xargs       对文本格式的重定向
a b c d e f a b c d e f a b c d e f a b c d e f
[root@test /]# cat 1.txt|xargs -n6   每行6个重排
a b c d e f
a b c d e f
a b c d e f
a b c d e f

[root@test /]# cat 1.txt|xargs|sort >2.txt      对文本格式重定向后默认排序输出到2.txt
a b c d e f a b c d e f a b c d e f a b c d e f

举例:
[root@test /]# cat 2.txt 
a b ,c d e f a b ,c d e f a b ,c d e f a b ,c d e f
[root@test /]# cat 2.txt|xargs -d"," -n2  以,为分隔符每行两个域重排
a b  c d e f a b 
c d e f a b  c d e f a b 
c d e f

find /tmp -name 1.log -type f -print0|xargs -0 rm -f   可用于处理文件中含有空格换行的文件
find ./ -name "*.log" -type f -print0|xargs -0 rm -f    用于日志的删除
find -type f -name "*.jpg" -print|xargs tar zcvf jpg.tar.gz  压缩所有图片文件
cat url-list.txt|xargs wget -c  

kill

kill -l 查询所有信号量
kill -s HUP 3940
kill -0 3940
kill -15 

**killall **

tar

option

 -v, --verbose 显示过程
 -f  --file    
 -c  --creat
 -z, --gzip   gzip压缩方式
 -j, --bzip2  bizp压缩方式
 -x  --extract  取出
 -C, --directory DIR 指定解压路径
 -t, --list 显示压缩文件列表
 --exclude=     压缩但不包含否个文件
 -X, --exclude-from FILE 用文件列表的方式排除不需要打包的文件
 -Z, --compress, --uncompress 调用compress完成压缩
 -N, --after-date DATE, --newer DATE 打包比指定日期新的文件,用于增量打包
 -p, --same-permissions, --preserve-permissions   保持属性
              extract all protection information

 -P, --absolute-names                             保存根目录的 /
              don't strip leading '/'s from file names  

example

 压缩文件 :tar zcvf test.tar.bz /etc
           tar jcvf test.tar.gz /etc
           tar zcvf test.tar.gz /etc --exclude=1.txt,2
           # -X ,--exclude-from file
           tar zcvf test.tar.gz /etc --exclude-from=1.txt
 
 解压文件 : tar zxvf test.tar.gz
           tar jxcf test.tar.bz
           tar xf test.tar.gz
           tar xf test.tar.gz -C /home  解压到指定目录
 查看压缩文件列表:
           tar tf text.tar.gz

dumpe2fs

dump ext2/ext3/ext4 的文件系统信息,xfs 文件格式待整理

# 磁盘
[root@tencent-sh ~]# dumpe2fs /dev/vda1 |grep -i "inode size"
dumpe2fs 1.42.9 (28-Dec-2013)
Inode size:               256
[root@tencent-sh ~]# dumpe2fs /dev/vda1 |grep -i "block size"
dumpe2fs 1.42.9 (28-Dec-2013)
Block size:               4096

grep

grep -c "word" filename   统计有多少行包含"word"
grep -E
grep -v
grep -o

ln

语法:ln [OPTION]src dest

example

ln -svf /etc/hosts /tmp/hosts

nl

语法:nl [OPTION] file

example

# 显示行号
nl /etc/hosts

hostname

hostname -I

df

df -hi   查看磁盘空间

du

du -sh    列出文件的总大小

ntpdate
在centos6 中我们经常使用的时间同步命令

timedatectl set-timezone Asia/Shanghai            
date -s "12/12/2010 15:40:30“
hwclock -w 

*/5 * * * * /usr/sbin/ntpdate 10.0.76.177 >/dev/null 2>&1

chronyd

cfssl

下载地址

# cfssl  生成证书
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
# cfssl-json  证书格式化成文件
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
# cfss-certinfo  查看证书的信息,发证机构,证书有效期
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo
      cfssl-certinfo -cert file
      cfssl-certinfo -domain domain_name
      cfssl-certinfo -domain pinduoduo.com
      cfssl certinfo -domain jd.com
      cfssl-certinfo -cert apiserver.pem 
      cfssl-certinfo -domain dashboard.od.com

openssl

SSL: Secure Socket Layer(安全套接层协议)

TLS: Transport Layer Security(传输层安全协议)

加密算法

  1. RSA算法是一个广泛使用的公钥算法。其密钥包括公钥和私钥。它能用于数字签名、身份认证以及密钥交换。RSA密钥长度一般使用1024位或者更高。
  2. DSA (Digital Signature Algorithm)算法是一种公钥算法.

功能

  1. 证书签发
  2. 文件加密
  3. 数字签名
  4. 生成随机数

证书签发

#自签CA
openssl genrsa -out caKey.pem 2048
openssl req -new -key caKey.pem -out ca.csr -subj "/C=CN/ST=Gd/L=SZ/O=od.com/CN=harbor.od.com"
openssl x509 -req -in ca.csr -out ca-cert.pem -signkey caKey.pem -days 3650

#签署应用key和crt
# 1)用户生成自己的私钥;
# genrsa Generation of DSA Private Key
# gendsa Generation of DSA Private Key
openssl genrsa -out serverkey.pem 2048
# 2)构造证书申请文件
openssl req  -new -key serverkey.pem -out server.csr -subj "/C=CN/ST=Gd/L=SZ/O=od.com/CN=harbor.od.com"
# req X.509 Certificate Signing Request (CSR) Management.
# -new   new request.
# 3)用户将证书申请文件提交给CA;CA验证签名,提取用户信息,并加上其他信息(比如颁发者等信息)
openssl x509 -req \
-in server.csr \
-out server-cert.pem \
-signkey serverkey.pem \
-CA ca-cert.pem \
-CAkey caKey.pem \
-CAcreateserial \
-days 3650
# x509      X.509 Certificate Data Management.
# -signkey arg    - self sign cert with arg
# -CAcreateserial - create serial number file if it does not exist
# -CA arg         - set the CA certificate, must be PEM format.
# -CAkey arg      - set the CA key, must be PEM format
#                  missing, it is assumed to be in the CA file.

另一种签发方式

# 跳过ca自签秘钥,如Nginx 中ssl
openssl genrsa -out server.key 2048
#-x509   output a x509 structure instead of a cert
openssl req -new -x509 -key server.key -out server.crt -subj /C=CN/ST=GD/L=SZ/O=devops/CN=wangendao.xyz -days 3650

-subj

C:Country ,单位所在国家,为两位数的国家缩写,如: CN 就是中国
ST:State/Province ,单位所在州或省
L:Locality ,单位所在城市 / 或县区
O:Organization ,网站的单位名称
OU:Organization Unit,部门名称,也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等
CN:Common Name ,网站的域名;
EA:Email Address ,邮箱地址
# 查看证书的信息
# -noout          - no certificate output
# -text           - print the certificate in text form

openssl x509 -noout -text -in server.crt
# 检查证书CN是否与域名匹配
# -checkhost host - check certificate matches "host"
openssl x509 -noout -checkhost seafile.example.com -in cert.pem  
Hostname seafile.example.com does match certificate

#  检查证书是否包含对应ip
# -checkip ipaddr - check certificate matches "ipaddr"
[root@hdss7-21 certs]# openssl x509 -checkip 10.4.7.55 -in kubelet.pem 
IP 10.4.7.55 does NOT match certificate
#  检查证书是否过期
#  -checkend arg   - check whether the cert expires in the next arg seconds
#                  exit 1 if so, 0 if not
[root@hdss7-21 ssl]# openssl x509 -checkend 2592000 -in cert.pem          
Certificate will expire

文件加密

# 生成私钥
openssl genrsa -out private.pem 2048
# 生成公钥
openssl rsa -in private.pem -pubout -out public.pem
# 创建文件
echo 12345678 >a.txt
# 加密文件
openssl rsautl -encrypt -in a.txt -inkey public.pem -pubin -out miwen.txt
# 解密文件
openssl rsautl -decrypt -in miwen.txt -inkey private.pem -out b.txt

文件摘要(文件md5等验证是否被篡改)

openssl dgst -sign private.pem -md5 -out check a.txt

生成随机数

openssl rand -base64 10
openssl rand -hex 10

https://www.cnblogs.com/technology178/p/14094375.html
https://blog.csdn.net/qq_35014708/article/details/89351248
https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices
https://www.cnblogs.com/littleatp/p/5878763.html

查看主机型号:

[root@spa00x1 ~]# dmidecode |grep 'Product Name'
        
Product Name: PowerEdge R720
Product Name: 0X6FFV

查看主机序列号: dmidecode |grep 'Serial Number'

查看操作系统:cat /etc/redhat-release

查看cpu:/proc/cpuinfo

查看内存:/proc/meminfo free -m

查看负载: /proc/loadavg load uptime

nc
网络命令nc

centos中的目录

目录 功能
/var/log/cron 定时任务的日志
/etc/crontab 系统定时任务
/etc/cron.deny 该文件中所列用户不允许使用crontab命令。
/etc/cron.allow 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny
/var/spool/cron 所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名。
/etc/redhat-release
/etc/issue
/proc/meminfo
/proc/cpuinfo
/proc/loadavg
/var/log/messages 服务异常时要检查的日志
/var/log/secure 用户登录日志
/var/log/wtmp
/etc/rsyslog 日志配置文件
/var/spool/clientmqueue 邮件队列
/etc/motd 添加登录时提示信息

journalctl

journalctl 命令用于显示系统日志。默认情况下,journalctl 仅显示当前会话的日志,并滚动显示最新的日志条目。若要显示完整的日志信息,应使用 journalctl 命令配合一些选项来获取更多的日志细节。以下是一些常用的选项:

  • -u <unit>:指定要查看的服务名称,例如 -u nginx
  • -f:以滚动模式显示日志,实时显示新日志条目。
  • -r:以相反顺序(即从新到旧的顺序)显示日志条目。
  • -o <format>:指定输出格式,可以是 shortverbosejson 等。例如,使用 journalctl -o json 将输出日志以 JSON 格式显示。
  • --since <time>:指定要显示的日志开始时间,该参数可以是时间戳,或者使用类似 yesterday1 hour ago 的时间表达式。例如,使用 journalctl --since "2023-06-24 10:00:00" 将显示从 2023-06-24 10:00:00 开始的所有日志。
  • --until <time>:指定要显示的日志截止时间。例如: journalctl --until "1 hour ago" 将显示截止到 1 小时前的所有日志。
  • -n <number>:指定要显示的日志条目数量。例如,使用 journalctl -n 50 将仅显示最新的 50 条日志。

以下是一个示例,可以使用该示例来查看系统的所有服务的日志,显示所有启动时间为 2022 年 1 月 1 日之后的日志,以详细模式显示这些日志,并按照事件发生的反向顺序排列输出:

journalctl --since "2022-01-01" -o verbose -u all -r

此示例将显示启动时间为 2022 年 1 月 1 日后的所有服务日志以详细模式和反向顺序进行排列输出。

posted @ 2021-03-17 09:17  mingtian是吧  阅读(715)  评论(0编辑  收藏  举报