如何使用Sysdig监控您的Ubuntu 16.04系统

介绍

Sysdig是一个全面的开源系统活动监视,捕获和分析应用程序。 它具有强大的过滤语言和可定制的输出,以及可以使用称为 凿子的 Lua脚本扩展的核心功能。 应用程序通过碰撞内核工作,允许它查看每个系统调用和通过内核的所有信息。这也使其成为监视和分析系统活动和由在系统上运行的应用程序容器生成的事件的出色工具。 核心Sysdig应用程序监视其安装的服务器。然而,该项目背后的公司提供了一个名为Sysdig Cloud的托管版本,可以远程监控任意数量的服务器。 独立应用程序在大多数Linux发行版上可用,但在Windows和macOS上也可用,功能更有限。 除了 sysdig命令行工具外,Sysdig还带有一个名为 csysdig的交互式UI,具有类似的选项。 在本教程中,您将安装并使用Sysdig监控Ubuntu 16.04服务器。您将流式传输直播活动,将活动保存到文件,过滤结果以及浏览 csysdig交互式UI。

先决条件

要完成本教程,您需要:

第1步 - 使用官方脚本安装Sysdig

在Ubuntu存储库中有一个Sysdig软件包,但它通常是当前版本的两个版本。在出版的时候,例如,使用Ubuntu的软件包管理器安装Sysdig会让你Sysdig 0.8.0。但是,您可以使用项目开发页面中的官方脚本进行安装,这是推荐的安装方法。这是我们将使用的方法。 但首先,更新包数据库以确保您具有最新的可用包列表:
sudo apt-get update
现在使用以下命令下载Sysdig的安装脚本和 curl
curl https://s3.amazonaws.com/download.draios.com/stable/install-sysdig -o install-sysdig
这会将 install-sysdig脚本下载到文件 install-sysdig到当前文件夹。 您需要使用提升的权限执行此脚本,运行从Internet下载的脚本很危险。 在执行脚本之前,通过在文本编辑器中打开脚本或使用 less命令在屏幕上显示内容来审核脚本的内容:
less ./install-sysdig
一旦您对脚本将运行的命令感到满意,请使用以下命令执行脚本:
cat ./install-sysdig | sudo bash
该命令将安装所有依赖项,包括内核头和模块。安装的输出将类似于以下内容:
Output* Detecting operating system
* Installing Sysdig public key
OK
* Installing sysdig repository
* Installing kernel headers
* Installing sysdig

...

sysdig-probe:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.4.0-59-generic/updates/dkms/

depmod....

DKMS: install completed.
Processing triggers for libc-bin (2.23-0ubuntu5) ...
现在你已经安装了Sysdig,让我们来看看使用它的一些方法。

第2步 - 实时监控系统

在本节中,您将使用 sysdig命令查看Ubuntu 16.04服务器上的一些事件。 sysdig命令需要root权限才能运行,并且它需要任意数量的选项和过滤器。运行命令的最简单的方法是没有任何参数。这将为您提供每两秒刷新一次系统数据的实时视图:
sudo sysdig
但是,正如你将看到,一旦你运行命令,可能很难分析正在写入屏幕的数据,因为它连续流,并有很多事件发生在你的服务器上。通过按 CTRL+C停止 sysdig 。 在使用某些选项再次运行命令之前,让我们通过查看命令的输出示例来熟悉输出:
Output253566 11:16:42.808339958 0 sshd (12392) > rt_sigprocmask
253567 11:16:42.808340777 0 sshd (12392) < rt_sigprocmask
253568 11:16:42.808341072 0 sshd (12392) > rt_sigprocmask
253569 11:16:42.808341377 0 sshd (12392) < rt_sigprocmask
253570 11:16:42.808342432 0 sshd (12392) > clock_gettime
253571 11:16:42.808343127 0 sshd (12392) < clock_gettime
253572 11:16:42.808344269 0 sshd (12392) > read fd=10(<f>/dev/ptmx) size=16384
253573 11:16:42.808346955 0 sshd (12392) < read res=2 data=..
输出的列为:
Output%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
以下是每列的含义:
  • evt.num是增量事件编号。
  • evt.outputtime是事件时间戳,您可以自定义。
  • evt.cpu是捕获事件的CPU号。 在上面的输出中, evt.cpu0 ,这是服务器的第一个CPU。
  • proc.name是生成事件的进程的名称。
  • thread.tid是生成事件的TID,它对应于单线程进程的PID。
  • evt.dir是事件方向。 您将看到>表示输入事件, <表示退出事件。
  • evt.type是事件的名称,例如“open”,“read”,“write”等。
  • evt.info是事件参数列表。在系统调用的情况下,这些趋向于对应于系统调用参数,但并不总是这样:为了简单或性能原因,排除了一些系统调用参数。
运行 sysdig几乎没有任何价值像你在上一个命令,因为有这么多的信息流入。但你可以应用选项和过滤器命令使用这种语法:
sudo sysdig [option] [filter]
您可以使用以下方式查看可用过滤器的完整列表:
sysdig -l
有一个广泛的过滤器列表,涵盖几个类或类别。这里有一些类:
  • fd :对文件描述符(FD)信息进行过滤,如FD号和FD名。
  • process :过滤进程信息,如生成事件的进程的id和名称。
  • evt :过滤事件信息,如事件编号和时间。
  • user :过滤用户信息,如用户id,用户名,用户主目录或登录shell。
  • group :过滤组信息,如组id和名称。
  • syslog :过滤syslog信息,如设施和严重性。
  • fdlist :过滤轮询事件的文件描述符。
由于在本教程中涵盖每个过滤器是不切实际的,因此我们只需尝试一对,从 syslog类中的 syslog.severity.str过滤器开始,它允许您查看在特定严重性级别发送到syslog的消息。此命令显示在“信息”级别发送到syslog的消息:
sudo sysdig syslog.severity.str=info
注意:根据服务器上的活动级别,在键入此命令后可能看不到任何输出,或者可能需要很长时间才能看到任何输出。 要强制问题,请打开另一个终端仿真器并执行将生成消息到syslog的操作。 例如,执行软件包更新,升级系统或安装任何软件包。CTRL+C停止命令。 输出,应该很容易解释,应该看起来像这样:
Output10716 03:15:37.111266382 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:37 sudo: pam_unix(sudo:session): session opened for user root b
618099 03:15:57.643458223 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:57 sudo: pam_unix(sudo:session): session closed for user root
627648 03:16:23.212054906 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session opened for user root b
629992 03:16:23.248012987 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session closed for user root
639224 03:17:01.614343568 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session opened for user
639530 03:17:01.615731821 0 cron (27043) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27043]: (root) CMD (   cd / && run-parts --report /etc/
640031 03:17:01.619412864 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session closed for user
您还可以对单个进程进行过滤。例如,要从 nano中查找事件,请执行以下命令:
sudo sysdig proc.name=nano
由于此命令在 nano上进行 nano ,您将不得不使用 nano文本编辑器打开文件以查看任何输出。 打开另一个终端编辑器,连接到服务器,然后使用 nano打开文本文件。写几个字符并保存文件。然后返回到您的原始终端。 然后,您会看到类似于以下的一些输出:
Output21840 11:26:33.390634648 0 nano (27291) < mmap res=7F517150A000 vm_size=8884 vm_rss=436 vm_swap=0
21841 11:26:33.390654669 0 nano (27291) > close fd=3(<f>/lib/x86_64-linux-gnu/libc.so.6)
21842 11:26:33.390657136 0 nano (27291) < close res=0
21843 11:26:33.390682336 0 nano (27291) > access mode=0(F_OK)
21844 11:26:33.390690897 0 nano (27291) < access res=-2(ENOENT) name=/etc/ld.so.nohwcap
21845 11:26:33.390695494 0 nano (27291) > open
21846 11:26:33.390708360 0 nano (27291) < open fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) name=/lib/x86_64-linux-gnu/libdl.so.2 flags=4097(O_RDONLY|O_CLOEXEC) mode=0
21847 11:26:33.390710510 0 nano (27291) > read fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) size=832
再次,通过键入 CTRL+C来kill命令。 使用 sysdig获取系统事件的实时视图并不总是使用它的最佳方法。幸运的是,还有另一种方式 - 将事件捕获到文件以供稍后分析。让我们来看看如何。

第3步 - 使用Sysdig捕获系统活动到文件

使用sysdig将系统事件捕获到文件允许您以后分析这些事件。要将系统事件保存到文件,请传递 sysdig -w选项并指定目标文件名,如下所示:
sudo sysdig -w sysdig-trace-file.scap
Sysdig将继续将生成的事件保存到目标文件,直到您按 CTRL+C 随着时间的推移,该文件可以增长相当大。 但是,使用 -n选项,您可以指定希望Sysdig捕获的事件数。在捕获目标数量的事件后,它将退出。例如,要将300个事件保存到文件,请键入:
sudo sysdig -n 300 -w sysdig-file.scap
虽然您可以使用Sysdig捕获指定数量的事件到文件,更好的方法是使用 -C选项将捕获分解成特定大小的较小文件。为了不淹没本地存储,您可以指示Sysdig只保留一些保存的文件。换句话说,Sysdig支持在一个命令中通过文件轮换捕获事件到日志。 例如,要将事件连续保存到大小不超过1 MB的文件,并且只保留最后五个文件(这是 -W选项所做的),请执行以下命令:
sudo sysdig -C 1 -W 5 -w sysdig-trace.scap
使用 ls -l sysdig-trace*列出文件,您将看到类似于此的输出,有五个日志文件:
Output-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap0
-rw-r--r-- 1 root root 952K Nov 23 04:14 sysdig-trace.scap1
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap2
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap3
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap4
与实时捕获一样,您可以对保存的事件应用过滤器。例如,要保存由进程 nano生成的200个事件,请键入以下命令:
sudo sysdig -n 200 -w sysdig-trace-nano.scap proc.name=nano
然后,在连接到服务器的另一个终端中,使用 nano打开文件,并通过键入文本或保存文件生成一些事件。 事件将捕获到 sysdig-trace-nano.scap ,直到 sysdig记录200个事件。 您将如何捕获在您的服务器上生成的所有写入事件?你可以这样应用过滤器:
sudo sysdig -w sysdig-write-events.scap evt.type=write
稍等片刻后按 CTRL+C退出。 当使用 sysdig将系统活动保存到文件时,你可以做更多的 sysdig ,但是这些例子应该给你一个很好的想法。让我们来看看如何分析这些文件。

第4步 - 使用Sysdig读取和分析事件数据

使用Sysdig从文件读取捕获的数据与将 -r开关传递到 sysdig命令一样简单,如下所示:
sudo sysdig -r sysdig-trace-file.scap
这将把文件的整个内容转储到屏幕,这不是真的最好的方法,特别是如果该文件是大的。幸运的是,你可以应用相同的过滤器,当你读它时,它被应用到它正在写入的文件。 例如,要读取您创建的 sysdig-trace-nano.scap跟踪文件,但仅查看特定类型的事件(如写事件),请键入以下命令:
sysdig -r sysdig-trace-nano.scap evt.type=write
输出应类似于:
Output21340 13:32:14.577121096 0 nano (27590) < write res=1 data=.
21736 13:32:17.378737309 0 nano (27590) > write fd=1 size=23
21737 13:32:17.378748803 0 nano (27590) < write res=23 data=#This is a test file..#
21752 13:32:17.611797048 0 nano (27590) > write fd=1 size=24
21753 13:32:17.611808865 0 nano (27590) < write res=24 data= This is a test file..#  
21768 13:32:17.992495582 0 nano (27590) > write fd=1 size=25
21769 13:32:17.992504622 0 nano (27590) < write res=25 data=TThis is a test file..# T
21848 13:32:18.338497906 0 nano (27590) > write fd=1 size=25
21849 13:32:18.338506469 0 nano (27590) < write res=25 data=hThis is a test file..[5G
21864 13:32:18.500692107 0 nano (27590) > write fd=1 size=25
21865 13:32:18.500714395 0 nano (27590) < write res=25 data=iThis is a test file..[6G
21880 13:32:18.529249448 0 nano (27590) > write fd=1 size=25
21881 13:32:18.529258664 0 nano (27590) < write res=25 data=sThis is a test file..[7G
21896 13:32:18.620305802 0 nano (27590) > write fd=1 size=25
让我们看看在上一节中保存的文件的内容: sysdig-write-events.scap文件。我们知道保存到文件的所有事件都是写事件,所以让我们查看内容:
sudo sysdig -r sysdig-write-events.scap evt.type=write
这是部分输出。如果在捕获事件时在服务器上有任何SSH活动,您将看到类似的结果:
Output42585 19:58:03.040970004 0 gmain (14818) < write res=8 data=........
42650 19:58:04.279052747 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
42651 19:58:04.279128102 0 sshd (22863) < write res=28 data=.8c..jp...P........s.E<...s.
42780 19:58:06.046898181 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
42781 19:58:06.046969936 0 sshd (12392) < write res=28 data=M~......V.....Z...\..o...N..
42974 19:58:09.338168745 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
42975 19:58:09.338221272 0 sshd (22863) < write res=28 data=66..J.._s&U.UL8..A....U.qV.*
43104 19:58:11.101315981 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
43105 19:58:11.101366417 0 sshd (12392) < write res=28 data=d).(...e....l..D.*_e...}..!e
43298 19:58:14.395655322 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
43299 19:58:14.395701578 0 sshd (22863) < write res=28 data=.|.o....\...V...2.$_...{3.3|
43428 19:58:16.160703443 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
43429 19:58:16.160788675 0 sshd (12392) < write res=28 data=..Hf.%.Y.,.s...q...=..(.1De.
43622 19:58:19.451623249 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
43623 19:58:19.451689929 0 sshd (22863) < write res=28 data=.ZT^U.pN....Q.z.!.i-Kp.o.y..
43752 19:58:21.216882561 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
注意,前面输出中的所有行包含 11.11.11.11:51282->22.22.22.22:ssh 。 这些是来自客户端的外部IP地址, 11.11.11.11到服务器的IP地址 22.22.22.22 。这些事件通过到服务器的SSH连接发生,因此这些事件是预期的。但是是否有其他SSH写事件不是从这个已知的客户端IP地址?很容易找到。 有很多比较运算符,您可以使用Sysdig。你看到的第一个是 = 。 其他是 !=>> =<<= 。 在以下命令中, fd.rip过滤远程IP地址。 我们将使用 !=比较运算符来查找来自11.11.11.11之外的IP地址的事件:
sysdig -r sysdig-write-events.scap fd.rip!=11.11.11.11
部分输出显示以下输出中显示来自除客户端IP地址之外的IP地址的写入事件:
Output294479 21:47:47.812314954 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294480 21:47:47.812315804 0 sshd (28766) < read res=1 data=T
294481 21:47:47.812316247 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294482 21:47:47.812317094 0 sshd (28766) < read res=1 data=Y
294483 21:47:47.812317547 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294484 21:47:47.812318401 0 sshd (28766) < read res=1 data=.
294485 21:47:47.812318901 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294486 21:47:47.812320884 0 sshd (28766) < read res=1 data=.
294487 21:47:47.812349108 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=4(F_GETFL)
294488 21:47:47.812350355 0 sshd (28766) < fcntl res=2(<f>/dev/null)
294489 21:47:47.812351048 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=5(F_SETFL)
294490 21:47:47.812351918 0 sshd (28766) < fcntl res=0(<f>/dev/null)
294554 21:47:47.813383844 0 sshd (28767) > write fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=976
294555 21:47:47.813395154 0 sshd (28767) < write res=976 data=........zt.....L.....}....curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-s
294691 21:47:48.039025654 0 sshd (28767) > read fd=3(<4t>221.229.172.117:49802->45.55.71.190:ssh) size=8192
进一步调查还表明,流氓IP地址 33.33.33.33属于中国的一台机器。这是值得担心的!这只是一个例子,说明如何使用Sysdig来监视流量打击你的服务器。 让我们看看使用一些额外的脚本来分析事件流。

第5步 - 使用Sysdig Chisels进行系统监控和分析

在Sysdig中, 凿子是可以用来分析Sysdig事件流以执行有用操作的Lua脚本。每个Sysdig安装都附带近50个脚本,您可以使用此命令查看系统上可用的凿子列表:
sysdig -cl
一些更有趣的凿子包括:
  • netstat :列出(和可选的过滤器)网络连接。
  • shellshock_detect :打印shellshock攻击
  • spy_users :显示交互式用户活动。
  • list login shells :列出登录shell标识。
  • spy_ip :显示与给定IP地址交换的数据。
  • spy_port :显示使用给定IP端口号交换的数据。
  • spy_file :回显任何进程对所有文件的任何读取或写入。或者,您可以提供文件的名称,以仅拦截对该文件的读取或写入。
  • httptop :显示顶部的HTTP请求
有关凿子(包括任何关联参数)的更详细描述,请使用 -i标志,后跟凿子名称。 因此,例如,要查看有关 netstat凿子的更多信息,请键入:
sysdig -i netstat
现在,你知道所有你需要知道使用 netstat凿子,通过运行以下功能来监视你的系统:
sudo sysdig -c netstat
输出应类似于以下内容:
OutputProto Server Address           Client Address           State          TID/PID/Program Name
tcp   22.22.22.22:22           11.11.11.11:60422        ESTABLISHED    15567/15567/sshd
tcp   0.0.0.0:22               0.0.0.0:*                LISTEN         1613/1613/sshd
如果在“ 客户端地址”列中看到来自除您的IP地址之外的其他IP地址的 建立的 SSH连接,那么应该是一个红色标记,您应该探索更深入。 更有趣的凿子是 spy_users ,它允许您查看系统上的交互式用户活动。 退出此命令:
sudo sysdig -c spy_users
然后,打开第二个终端并连接到您的服务器。在第二个终端执行一些命令,然后返回到运行 sysdig的终端。 您在第一个终端中键入的命令将在您 sysdig -c spy_users执行 sysdig -c spy_users命令的终端上回显。 接下来,让我们探索Csysdig,一个图形工具。

第6步 - 使用Csysdig进行系统监控和分析

Csysdig是Sysdig附带的另一个实用程序。它有一个交互式用户界面,提供与sysdig命令行相同的功能。它像 tophtopstrace ,但更多的功能丰富。 与 sysdig命令一样, csysdig命令可以执行实时监控,并可以将事件捕获到文件以供以后分析。 但是 csysdig给你一个更有用的实时视图的系统数据每两秒刷新。要查看示例,请键入以下命令:
sudo csysdig
这将打开一个接口,如下图所示,它显示由受监控主机上的所有用户和应用程序生成的事件数据。 Csysdig的主界面 在界面的底部有几个按钮可以用来访问程序的不同方面。最值得注意的是 视图按钮,类似于csysdig收集的指标 csysdig 。 有29个视图可用的开箱即用,包括 进程系统调用线程容器进程CPU页面错误文件目录 。 当您不带参数启动 csysdig时,您将看到 Processes视图中的实时事件。 点击 视图按钮或按 F2键,您将看到可用视图的列表,包括列的说明。 您还可以通过按 F7键或单击 图例按钮查看列的描述。 并且可以通过按 F1键或单击 帮助按钮访问应用程序本身的摘要手册页( csysdig )。 下图显示了应用程序的 Views界面的列表。 Csysdig视图窗口 注意:对于每个按钮,在按钮的左侧有一个相应的键盘快捷键或热键。 按快捷键两次将返回到上一个窗口。 ESC键将获得相同的结果。 虽然您可以运行 csysdig没有任何选项和参数,命令的语法,如 sysdig的,通常采取这种形式:
sudo csysdig [option]...  [filter]
最常见的选项是 -d ,用于以毫秒为单位修改更新之间的延迟。 例如,要查看每10秒更新一次 csysdig输出,而不是默认值2秒,请键入:
sudo csysdig -d 10000
您可以使用 -E选项从视图中排除用户和组信息:
sudo csysdig -E
这可以使 csysdig启动更快,但速度增益在大多数情况下可以忽略不计。 要指示 csysdig在一定数量的事件后停止捕获,请使用 -n选项。 应用程序将在达到该号码后退出。 捕获的事件的数量必须在五个数字; 否则你甚至不会看到 csysdig UI:
sudo csysdig -n 100000
要分析跟踪文件,请传递 csysdig -r选项,如下所示:
sudo csysdig -r sysdig-trace-file.scap
您可以使用与 sysdig一起使用的相同过滤器来限制 csysdig的输出。 因此,例如,不是查看系统上所有用户生成的事件数据,您可以通过使用以下命令启动 csysdig来过滤用户的输出,该命令将显示仅由root用户生成的事件数据:
sudo csysdig user.name=root
输出应类似于下图所示,但输出将反映您的服务器上运行的内容: 由根生成的Csysdig数据 要查看生成事件的可执行文件的输出,请将过滤器的名称传递给没有路径的二进制文件。以下示例将显示由 nano命令生成的所有事件。 换句话说,它将显示文本编辑器为 nano所有打开的文件:
sudo csysdig proc.name=nano
有几十个过滤器可用,您可以使用以下命令查看:
sudo csysdig -l
你会注意到,这是与用来查看 sysdig命令可用的过滤器相同的选项。 所以 sysdigcsysdig是大致相同。 主要区别是 csysdig自带了一个鼠标友好的交互式UI。 要随时退出 csysdig ,请按键盘上的 Q键。

结论

Sysdig帮助您监视和故障排除您的服务器。它将让您深入了解受监视主机上的所有系统活动,包括应用程序容器生成的活动。虽然本教程没有特别地涵盖容器,但是监视容器生成的系统活动的能力是Sysdig与类似应用程序的区别。更多信息可以在项目的 主页上找到 。 Sysdig的凿子是核心Sysdig功能的强大扩展。它们是用Lua编写的,所以你可以自定义它们或从头开始编写。要了解有关制作凿子的更多信息,请访问项目的 官方凿子页面
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏