Docker安全及日志管理
DockerRemoteAPI访问控制
默认只开启了unix socket,如需开放http,做如下操作:
1、dockerd -H unix:///var/run/docker.sock -H tcp://192.168.180.210:2375
2、vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unit:///var/run/docker.sock -H tcp://192.168.180.210:2375
vi /etc/sysconfig/docker
加上如下字段:
OPTIONS=‘–selinux-enabled -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375’
//重启docker
systemctl daemon-reload
systemctl restart docker
netstat -nplt |grep 2375
(2)通过curl和http来获取docker的容器的相关信息
2.1 获取当前容器信息
通过curl:curl http://localhost:2375/containers/json
通过RemoteAPI获取docker的容器的相关信息
获取当前容器信息:
curl http://192.168.107.197:2375/containers/json
可以在浏览器中输入http://192.168.107.197:2375/containers/json
监控容器信息和导出容器
http://192.168.107.197:2375/containers/faf081fd4843/json
http://192.168.107.197:2375/containers/faf081fd4843/export
获取镜像相关信息
curl http://192.168.107.197:2375/images/json
http://192.168.107.197:2375/images/json
放行端口:
firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“192.168.107.197” port protocol=“tcp” port=“2375” accept”
firewall-reload
客户端访问:
docker -H=tcp://192.168.107.197:2375 ps
镜像的检验
CI=true dive
DockerClient 端与 DockerDaemon 的通信安全
yum install -y epel-release
yum install -y yum-utils device-mapper- persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
docker master:
hostnamectl set-hostname master && bash
vim /etc/hosts
192.168.180.210 master
192.168.180.200 client
mkdir tls
cd tls
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj “/CN=master” -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj “/CN=master” -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:master,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj ‘/CN=client’ -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
rm -rf client.csr server.csr extfile.cnf extfile-client.cnf ca.srl
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
systemctl daemon-reload
systemctl restart docker
scp ca.pem root@192.168.180.200:/etc/docker/
scp cert.pem root@192.168.180.200:/etc/docker/
scp key.pem root@192.168.180.200:/etc/docker/
客户端:
hostnamectl set-hostname client && bash
vim /etc/hosts
192.168.180.210 master
192.168.180.200 client
cd /etc/docker
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
export GODEBUG=x509ignoreCN=0
CPU 内存 硬盘
check created users
grep authorized_keys $dockerfile
check OS users
grep “etc/group” $dockerfile
Check sudo users
grep “etc/sudoers.d” $dockerfile
Check ssh key pair
grep “.ssh/.*id_rsa” $dockerfile
Add your checks in below…
git clone https://github.com/docker/docker-bench-security.git
stress
vim /root/stress/Dockerfile
FROM centos:7
MAINTAINER 5CC
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install stress
docker build -t centos:stress .
docker run -tid --cpu-shares 100 centos:stress
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
docker run -tid --name cpu1 --cpuset-cpus 0-2 centos:stress
cat /sys/fs/cgroup/cpuset/cpuset.cpus
docker exec 5204fe18208e taskset -c -p 1
docker run -tid --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
docker run -tid --name cpu4 --cpuset-cpus 0 --cpu-shares 1024 centos:stress stress -c 1
内存
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M
BLKIO
docker run -it --name container_A --blkio-weight 600 centos:stress
docker run -it --device-write-bps /dev/sda:5MB centos:stress
ELK:
mkdir /var/log/Elasticsearch
chmod -R 777 /var/log/Elasticsearch
vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
vim /etc/security/limits.conf
- soft nofile 65535
- hard nofile 65535
- soft nproc 65535
- hard nproc 65535
- soft memlock unlimited
- hard memlock unlimited
docker network create ELK-kgc
dcoker network ls
cd /root/ELK/Elasticsearch
创建网络,并绑定网段
docker network create --driver bridge --subnet=172.19.0.0/16 ELK-kgc
运行Nginx:
复制nginx的配置文件到主机的/opt/nginx/目录下
配置日志格式:
log_format main '“ h t t p u s e r a g e n t " " http_user_agent"" httpuseragent""http_x_forwarded_for” ’
' r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 16: request" ' '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘$upstream_addr $upstream_status $upstream_response_time’;
构建nginx
docker run -itd -p 8011:80 --network ELK-kgc -v /var/log/nginx:/var/log/nginx -v /opt/nginx/html:/usr/share/nginx/html --name nginx-ELK --ip 172.19.0.200 nginx:kgc
在/opt/nginx/html目录下,创建index.html文件
创建日志文件:
vim /var/log/nginx/www.bdqn.cn-access.log
“YisouSpider”“106.11.155.156” - [18/Jul/2022:00:00:13 +0800] “GET /applier/position?gwid=17728&qyid=122257 HTTP/1.0” 200 9197 “-” 192.168.168.108:80 2000.032
“-”“162.209.213.146” - [18/Jul/2022:00:02:11 +0800] "GET //tag/7764.shtml HTTP/1.0"20024922 “-” 192.168.168.108:80 200 0.074
“YisouSpider”“106.11.152.248” - [18/Jul/2022:00:07:44 +0800] “GET /news/201712/21424.shtml HTTP/1.0” 200 8821 “-” 192.168.168.110:80 2000.097
“YisouSpider”“106.11.158.233” - [18/Jul/2022:00:07:44+0800]“GET/news/201301/7672.shtml HTTP/1.0” 200 8666 “-” 192.168.168.110:80 2000.111
“YisouSpider”“106.11.159.250” - [18/Jul/2022:00:07:44+0800]“GET/news/info/id/7312.html HTTP/1.0” 200 6617 “-” 192.168.168.110:80 2000.339
“Mozilla/5.0 (compatible;SemrushBot/2~bl;+http://www.semrush.com/bot.html)”“46.229.168.83”- [18/Jul/2022:00:08:57+0800]“GET/tag/1134.shtmlHTTP/1.0” 200 6030 “-” 192.168.168.108:80 200 0.079
运行Elasticsearch:
构建:
docker build -t elasticsearch .
运行:
docker run -itd --privileged -p 9200:9200 -p 9300:9300 --network ELK-kgc --ip 172.19.0.100 -v /var/log/elasticsearch:/var/log/elasticsearch --name elasticsearch elasticsearch
查看、验证:
curl -X PUT “localhost:9200/customer?pretty”
查看索引:
curl -X GET “localhost:9200/_cat/indices?v”
删除索引,通配符形式
curl -XDELETE localhost:9200/索引*
测试数据:
curl -H ‘Content-Type: application/x-ndjson’ -XPOST ‘localhost:9200/bank/account/_bulk?pretty’ --data-binary @accounts.json
curl -H ‘Content-Type: application/x-ndjson’ -XPOST ‘localhost:9200/shakespeare/doc/_bulk?pretty’ --data-binary @shakespeare_6.0.json
curl -H ‘Content-Type: application/x-ndjson’ -XPOST ‘localhost:9200/_bulk?pretty’ --data-binary @logs.jsonl
运行Kibana:
docker build -t kibana .
docker run -itd --privileged -p 5601:5601 --ip 172.19.0.110 --network ELK-kgc --name kibana kibana
运行logstash:
docker build -t logstash .
docker run -itd --privileged -p 5044:5044 --network ELK-kgc -v /opt/logstash/conf:/opt/logstash/conf --ip 172.19.0.120 --name logstash logstash
运行filebeat
docker build -t filebeat .
docker run -itd --privileged --network ELK-kgc -v /var/log/nginx:/var/log/nginx --ip 172.19.0.130 --name Filebeat filebeat
mkdir -p /opt/logstash/conf
#日志输入,可以是从stdin屏幕输入读取,可以从file指定的文件,也可以从es,filebeat,kafka,redis等读取
input {
beats {
port => 5044
}
}
#日志过滤,不是必须的
filter {
if “www-bdqn-cn-pro-access” in [tags] {
grok {
match => {“message” => ‘%{QS:agent} “%{IPORHOST:http_x_forwarded_for}” - [%{HTTPDATE:timestamp}]
“(?:%{WORD:verb}
%{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|-)” %{NUMBER:response}
%{NUMBER:bytes} %{QS:referrer} %{IPORHOST:remote_addr}:%{P
OSINT:port} %{NUMBER:remote_addr_response} %{BASE16FLOAT:request_time}’}
}
}
#用于解码被编码的字段,可以解决URL中 中文乱码的问题
urldecode {all_fields => true}
#日期解析字段 日期解析 解析字段中的日期,然后转存到@timestamp
date {
match => [ “timestamp” , “dd/MMM/YYYY:HH:mm:ss Z” ]
}
#添加有关用户代理(如系列,操作系统,版本和设备)的信息
useragent {
source =>“agent”
target =>“ua”
}
}
#输出字段 将事件发送到特定目标
output {
if “www-bdqn-cn-pro-access” in [tags]
{ Elasticsearch {
hosts => [“Elasticsearch:9200”]
manage_template => false
index =>“www-bdqn-cn-pro-access-%{+YYYY.MM.dd}”
}
}
}
filebeat
/var/lib/filebeat/registry
logstash
/usr/local/logstash-6.1.0/data/uuid
=ELKF日志收集=====================
一、安装docker:
yum install -y yum-utils device-mapperpersistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker && systemctl enable docker
修改内核参数
vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
vim /etc/security/limits.conf
- soft nofile 65535
- hard nofile 65535
- soft nproc 65535
- hard nproc 65535
- soft memlock unlimited
- hard memlock unlimited
二、构建Nginx
在opt目录下新建nginx目录
mkdir -p /opt/nginx/html
cd /opt/nginx
上传nginx的dockerfile
创建网络
docker network create --driver bridge --subnet=172.19.0.0/16 ELK-kgc
构建Nginx
docker build -t nginx .
运行nginx容器
docker run -itd -p 8011:80 --network ELK-kgc -v /var/log/nginx:/var/log/nginx -v /opt/nginx/html:/usr/share/nginx/html --name nginx-ELK --ip 172.19.0.200 nginx
在/opt/nginx/html目录下添加index.html文件
三、构建elasticsearch
在opt目录新建elasticsearch目录
mkdir /opt/elasticsearch
在/var/log/下新建elasticsearch目录,并赋予完全控制权限
mkdir /var/log/elasticsearch
chmod 777 /var/log/elasticsearch
cd /opt/elasticsearch/
上传dockerfile到/opt/elasticsearch目录
构建elasticsearch
docker build -t elasticsearch .
运行elasticsearch
docker run -itd -p 9200:9200 -p 9300:9300 --network ELK-kgc --ip 172.19.0.100 -v /var/log/elasticsearch:/var/log/elasticsearch --name elasticsearch elasticsearch
新建索引:
curl -X PUT “localhost:9200/customer?pretty”
查看索引:
curl -X GET “localhost:9200/_cat/indices?v”
四、构建kibana
在/opt/新建kibana目录
mkdir /opt/kibana
cd /opt/kibana
上传Dockerfile
构建Kibana:
docker build -t kibana .
运行:
docker run -itd -p 5601:5601 --ip 172.19.0.110 --network ELK-kgc --name kibana kibana
五、构建logstash
在opt目录下新建logstash目录
mkdir -p /opt/logstash/conf
cd /opt/logstash/
上传Dockerfile
mv nginx-log.conf conf
在/opt/logstash目录下新建conf,将nginx-log.conf拷贝到conf
构建:
docker build -t logstash .
运行:
docker run -itd -p 5044:5044 --network ELK-kgc -v /opt/logstash/conf:/opt/logstash/conf --ip 172.19.0.120 --name logstash logstash
六、构建filebeat
在opt新建filebeat目录
mkdir /opt/filebeat
cd /opt/filebeat
上传Dockerfile
构建:
docker build -t filebeat .
运行:
docker run -itd --network ELK-kgc -v /var/log/nginx:/var/log/nginx --ip 172.19.0.130 --name filebeat filebeat
相关文章:
Docker安全及日志管理
DockerRemoteAPI访问控制 默认只开启了unix socket,如需开放http,做如下操作: 1、dockerd -H unix:///var/run/docker.sock -H tcp://192.168.180.210:2375 2、vim /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H uni…...
【LeetCode每日一题】152. 乘积最大子数组
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 思路 由于做了53. 最大子数组和 下意识觉得求出所有元素的以该元素结尾的连续…...
Python 反射
Python 反射是什么? 学习了几天,做个总结留给自己看。 感觉跟 SQL 入门要掌握的原理一样,Python 反射看起来也会做4件事,“增删查获” 增 - 增加属性,方法 setattr 删 - 删除属性,方法 delattr 查 - …...
HTML基本网页制作
一、制作工商银行电子表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>第一个网页的标题</ti…...
Tcl语言语法精炼总结
一、置换符号 1.变量置换 $ TCl解释器会将认为$后面为变量名,将变量名置换成它的值 2.命令置换 [] []内是一个独立的TCL语句 3.反斜杠置换 \ 换行符、空格、[、$等被TCL解释器当作特殊符号处理。加上反斜杠后变成普通字符 \t TAB \n 换行符 4.双引号 “” “…...
[GPT]Andrej Karpathy微软Build大会GPT演讲(下)--该如何使用GPT助手
该如何使用GPT助手--将GPT助手模型应用于问题 现在我要换个方向,让我们看看如何最好地将 GPT 助手模型应用于您的问题。 现在我想在一个具体示例的场景里展示。让我们在这里使用一个具体示例。 假设你正在写一篇文章或一篇博客文章,你打算在最后写这句话。 加州的人口是阿拉…...
路由器静态路由的配置
路由器静态路由的配置步骤如下: 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0,其中g0/0/0表示路由器的接口,可以根据实际情况进行修改。然后使用命令ip add配置接口的IP地址。配置下一跳地址。在静…...
[Firefly-Linux] RK3568在Ubuntu上安装内核头文件实现本地编译驱动程序
文章目录 一、介绍二、安装三、编译驱动四、自行编译debian包一、介绍 在 Linux 操作系统中,linux-headers.deb 和 linux-images.deb 分别用于安装内核头文件和内核二进制文件。 linux-headers.deb: 内核头文件包,通常以 linux-headers-x.x.x-x 的形式命名。包含编译内核模…...
RabbitMQ Streams 详解
RabbitMQ Streams是一种持久复制数据结构,可以完成与队列相同的任务:它们缓冲来自生产者的消息,这些消息由消费者读取。然而,流与队列的区别在于两个重要方面:消息的存储和消费方式。 Streams为仅追加的消息日志建模&a…...
跨境电商如何利用跨境客服软件提升销售额
随着全球化的推进,跨境电商成为了许多企业拓展市场的重要途径。然而,跨境电商面临着语言、文化、时差等多种挑战,为了提供更好的客户服务并提升销售额,跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…...
css/less/scss代码注意事项
一.命名 1.类名使用小写字母,以中划线分割;id 使用 驼峰式命名; 2.less/scss中的函数、混合采用驼峰命名; 3. class 的命名不要使用 标签名,如.p .div .img; 二.选择器 尽量使用直接子选择器,否则,有时会造成性能损耗 .content .title { .…...
Git应用——代码提交规范 feat ,fix ,style
当前使用 feat 增加新功能fix 修复问题/BUGstyle 代码风格相关无影响运行结果的perf 优化/性能提升refactor 重构revert 撤销修改test 测试相关docs 文档/注释chore 依赖更新/脚手架配置修改等workflow 工作流改进ci 持续集成types 类型定义文件更改wip 开发中 别处看到 fea…...
TDengine Kafka Connector将 Kafka 中指定 topic 的数据(批量或实时)同步到 TDengine
教程放在这里:TDengine Java Connector,官方文档已经写的很清晰了,不再赘述。 这里记录一下踩坑: 1.报错 java.lang.UnsatisfiedLinkError: no taos in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.j…...
单片机的低功耗模式介绍
文章目录 简介一、功耗来源说明1.1、芯片工作模式1.2、静态损耗1.3、I/O额外损耗1.4、动态损耗 二、功耗如何测量三、降低功耗有什么方法3.1、选取合适的芯片工作模式3.2、降低工作频率3.3、关闭不需要使用的外设3.4、 降低静态电流损耗3.5、 周期采集供电3.6、 设置IO口状态 四…...
基于SSM实现的精品课程网站
一、系统架构 前端:jsp | js | css | jquery | bootstrap 后端:spring | springmvc | mybatis 环境:jdk1.7 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. web端-首页 03. web端-视频教程 04. web端-资料…...
广州旅游攻略(略说一二)
广州是中国南方的一个重要城市,也是广东省的省会,拥有着悠久的历史和丰富的文化遗产。作为中国最繁华的城市之一,广州吸引了大量的游客前来探索其独特的魅力。今天我将为大家介绍一份广州旅游攻略,希望能帮助各位游客更好地了解这…...
C++STL的list模拟实现
文章目录 前言 list实现push_back迭代器(重点)普通迭代器const迭代器 inserterase析构函数构造函数拷贝构造赋值 vector和list的区别 前言 要实现STL的list, 首先我们还得看一下list的源码。 我们看到这么一个东西,我们知道C兼容C,可以用struct来创建一…...
django--分页功能
Django 提供了强大的分页功能,可以轻松地在视图中实现分页。 在视图中使用分页: # views.py from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render from .models import YourModeldef your…...
centOS安装bochsXshell连接centos启动可视化界面
centOS安装bochs 参考:https://blog.csdn.net/muzi_since/article/details/102559187 首先安装依赖环境: yum install gtk2 gtk2-devel yum install libXt libXt-devel yum install libXpm libXpm-devel yum install SDL SDL-devel yum install libXr…...
mac m2芯片 安装nginx + php + mysql
1.安装homebrew: 系统本身就有(命令brew -v查看下),如果没有安装一下 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.安装nginx brew install nginx 3.安装php bre…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
