Linux零基础入门:用户和组管理实战详解

前言

在上一篇文章中,我们学习了Linux用户管理和权限控制的基础概念。本文将深入实战操作,详细讲解用户和组的创建、修改、删除等完整管理流程,以及软链接的基础使用。通过本文的学习,你将能够熟练地进行Linux系统的用户和组管理操作,为后续的系统管理打下坚实基础。

文章目录

  • 前言
  • 一、用户管理完整操作流程
    • 1.1 创建用户完整示例
    • 1.2 查看用户信息
  • 二、用户修改操作
    • 2.1 修改用户名 - usermod -l
    • 2.2 锁定用户账户 - usermod -L
    • 2.3 解锁用户账户 - usermod -U
    • 2.4 其他用户修改命令
  • 三、用户删除操作
    • 3.1 删除用户 - userdel
    • 3.2 删除用户注意事项
  • 四、组管理完整操作
    • 4.1 查看系统组信息
    • 4.2 创建组 - groupadd
    • 4.3 修改组 - groupmod
    • 4.4 删除组 - groupdel
  • 五、组成员管理
    • 5.1 添加用户到组 - gpasswd -a
    • 5.2 从组中移除用户 - gpasswd -d
    • 5.3 设置组管理员 - gpasswd -A
    • 5.4 使用usermod管理组成员
  • 六、组管理实战案例
    • 6.1 创建开发团队组结构
    • 6.2 创建共享项目目录
    • 6.3 管理sudo权限
  • 七、软链接入门
    • 7.1 软链接基本概念
    • 7.2 创建软链接 - ln -s
    • 7.3 软链接实用示例
    • 7.4 软链接注意事项
  • 八、综合实战案例
    • 8.1 完整的用户组管理流程
    • 8.2 用户离职清理流程
  • 总结
    • 核心知识点回顾
    • 学习建议
    • 下一步学习

一、用户管理完整操作流程

1.1 创建用户完整示例

回顾上一篇文章中创建用户的命令:

sudouseradd-u1020-g1000-c"Test User Description"-d /home/user1 -Gsudouser1

参数详解:

  • -u 1020: 指定用户ID为1020
  • -g 1000: 指定主组ID为1000(kali组)
  • -c "Test User Description": 添加用户描述信息
  • -d /home/user1: 指定家目录
  • -G sudo: 指定附加组为sudo(拥有管理员权限)
  • user1: 要创建的用户名

设置用户密码:

sudopasswduser1

系统提示:

New password: (输入密码,不显示) Retype new password: (再次确认) passwd: password updated successfully

1.2 查看用户信息

查看用户账户信息:

cat/etc/passwd

找到创建的用户:

cat/etc/passwd|grepuser1

输出示例:

user1:x:1020:1000:Test User Description:/home/user1:/bin/bash

字段解释:

  • user1: 用户名
  • x: 密码占位符(实际密码在/etc/shadow)
  • 1020: UID(用户ID)
  • 1000: GID(主组ID)
  • Test User Description: 用户描述
  • /home/user1: 家目录
  • /bin/bash: 登录Shell

查看密码信息:

sudocat/etc/shadow|grepuser1

输出示例:

user1:$6$xyz...(哈希密码):19000:0:99999:7:::

密码加密说明:

  • Linux使用SHA-512哈希算法加密密码
  • 密码以$6$开头表示SHA-512加密
  • 不可逆加密,即使管理员也无法看到明文密码
  • Windows密码在内存中可通过Mimikatz等工具提取(安全风险)

查看用户所属组:

cat/etc/group|grepuser1iduser1

输出示例:

uid=1020(user1) gid=1000(kali) groups=1000(kali),27(sudo)

这表明user1的主组是kali(GID=1000),附加组是sudo(GID=27)。


二、用户修改操作

2.1 修改用户名 - usermod -l

基本语法:

sudousermod-l 新用户名 旧用户名

实际操作:

# 将user1改名为user11sudousermod-l user11 user1

验证修改:

cat/etc/passwd|grepuser11

输出:

user11:x:1020:1000:Test User Description:/home/user1:/bin/bash

注意:

  • 用户名已改为user11
  • 家目录仍然是/home/user1(需要手动修改)
  • UID和GID保持不变

同步修改家目录(可选):

# 修改家目录路径sudousermod-d /home/user11 -m user11# 或手动重命名sudomv/home/user1 /home/user11

2.2 锁定用户账户 - usermod -L

锁定用户(禁止登录):

sudousermod-L user11

查看锁定状态:

sudocat/etc/shadow|grepuser11

输出示例:

user11:!$6$xyz...(哈希密码):19000:0:99999:7:::

关键变化: 密码字段前多了一个感叹号!,表示账户已被锁定。

锁定效果:

  • 用户无法通过密码登录(SSH、本地登录都会失败)
  • 但不影响该用户已经运行的进程
  • 不影响通过SSH密钥登录(如果配置了)

尝试登录(会失败):

suuser11# Password:# su: Authentication failure

2.3 解锁用户账户 - usermod -U

两种解锁方法:

方法一: 使用usermod -U(推荐)

sudousermod-U user11

方法二: 重新设置密码

sudopasswduser11

这会自动移除密码前的!,同时更新密码。

验证解锁:

sudocat/etc/shadow|grepuser11

输出:

user11:$6$xyz...(哈希密码):19001:0:99999:7:::

密码字段前的!已消失,账户可以正常登录。

测试登录:

suuser11# Password: (输入密码)# 成功切换到user11用户

2.4 其他用户修改命令

修改用户UID:

sudousermod-u2000user11

修改用户主组:

sudousermod-g1001user11

添加附加组:

sudousermod-aGdockeruser11# 不会移除现有附加组

修改家目录:

sudousermod-d /home/newdir -m user11# -m会移动文件

修改Shell:

sudousermod-s /bin/zsh user11

修改用户描述:

sudousermod-c"New Description"user11

三、用户删除操作

3.1 删除用户 - userdel

基本语法:

sudouserdel[选项]用户名

常用选项:

选项功能
无选项删除用户,保留家目录和邮件
-r删除用户及其家目录、邮件(推荐)
-f强制删除,即使用户已登录

标准删除(保留数据):

sudouserdeluser11

效果:

  • /etc/passwd删除用户记录
  • /etc/shadow删除密码记录
  • /etc/group删除用户组成员关系
  • 保留家目录/home/user11
  • 保留邮件/var/mail/user11

彻底删除(常用):

sudouserdel-r user11

效果:

  • 删除用户记录(同上)
  • 删除家目录/home/user11
  • 删除用户邮件
  • 删除用户cron任务

强制删除(即使用户在线):

sudouserdel-rf user11

验证删除:

# 检查用户记录cat/etc/passwd|grepuser11# (无输出,表示已删除)# 检查家目录ls/home/# (user11目录不存在)# 检查IDiduser11# id: 'user11': no such user

3.2 删除用户注意事项

删除前检查:

# 1. 检查用户是否在线who|grepuser11 w|grepuser11# 2. 检查用户进程psaux|grepuser11# 3. 检查用户文件find/ -user user112>/dev/null# 4. 备份重要数据sudotar-czf user11_backup.tar.gz /home/user11

删除后清理:

# 查找并处理用户遗留文件sudofind/ -user10202>/dev/null# 使用UID查找sudofind/ -nouser2>/dev/null# 查找无主文件

四、组管理完整操作

4.1 查看系统组信息

查看所有组:

cat/etc/group

输出格式:

组名:密码占位符:GID:组成员列表

实际示例:

root:x:0: sudo:x:27:kali,admin docker:x:118:kali,user1 kali:x:1000: playgame:x:1008:kali

字段说明:

  • root: 组名
  • x: 组密码占位符(很少使用)
  • 0: 组ID(GID)
  • 最后字段: 该组的成员用户(逗号分隔,不包括以该组为主组的用户)

查看特定组:

cat/etc/group|grepsudo# sudo:x:27:kali,admin

4.2 创建组 - groupadd

基本语法:

sudogroupadd[选项]组名

创建组示例:

sudogroupaddplaygame

验证创建:

cat/etc/group|grepplaygame# playgame:x:1008:

系统自动分配了GID=1008。

指定GID创建组:

sudogroupadd-g2000testgroup

创建系统组:

sudogroupadd-r sysgroup

系统组的GID通常小于1000。

4.3 修改组 - groupmod

修改组ID:

sudogroupmod-g1009playgame

验证修改:

cat/etc/group|grepplaygame# playgame:x:1009:

GID已从1008改为1009。

修改组名:

sudogroupmod-n newgame playgame

验证:

cat/etc/group|grepnewgame# newgame:x:1009:

4.4 删除组 - groupdel

删除组:

sudogroupdelplaygame

验证删除:

cat/etc/group|grepplaygame# (无输出,表示已删除)

注意事项:

  • 不能删除用户的主组
  • 必须先删除以该组为主组的所有用户,或修改其主组
  • 附加组可以直接删除

删除主组示例(会失败):

sudogroupdelkali# groupdel: cannot remove the primary group of user 'kali'

正确做法:

# 1. 修改用户主组sudousermod-g1000kali# 2. 然后删除原主组sudogroupdeloldgroup

五、组成员管理

5.1 添加用户到组 - gpasswd -a

基本语法:

sudogpasswd -a 用户名 组名

实际操作:

# 将kali用户添加到playgame组sudogpasswd -a kali playgame

输出:

Adding user kali to group playgame

验证添加:

# 方法1: 查看组文件cat/etc/group|grepplaygame# playgame:x:1008:kali# 方法2: 查看用户信息idkali# uid=1000(kali) gid=1000(kali) groups=1000(kali),27(sudo),1008(playgame)

批量添加用户:

sudogpasswd -a user1 playgamesudogpasswd -a user2 playgamesudogpasswd -a user3 playgame

验证:

cat/etc/group|grepplaygame# playgame:x:1008:kali,user1,user2,user3

5.2 从组中移除用户 - gpasswd -d

基本语法:

sudogpasswd -d 用户名 组名

实际操作:

# 将kali从playgame组中移除sudogpasswd -d kali playgame

输出:

Removing user kali from group playgame

验证移除:

# 查看组成员cat/etc/group|grepplaygame# playgame:x:1008:# 查看用户组信息idkali# uid=1000(kali) gid=1000(kali) groups=1000(kali),27(sudo)# (playgame已不在组列表中)

5.3 设置组管理员 - gpasswd -A

设置组管理员:

sudogpasswd -A admin playgame

组管理员可以添加或删除该组的成员(无需sudo权限)。

组管理员操作:

# admin用户可以直接操作playgame组gpasswd -a user1 playgame gpasswd -d user1 playgame

5.4 使用usermod管理组成员

添加附加组(推荐):

sudousermod-aGdockerkali

注意: 必须使用-aG(append group),如果只用-G会覆盖所有附加组。

错误示例(危险):

sudousermod-Gdockerkali# 这会移除kali的所有其他附加组,只保留docker组!

正确示例:

# 保留现有组,添加新组sudousermod-aG docker,sudo,playgame kali

替换主组:

sudousermod-g developers kali

六、组管理实战案例

6.1 创建开发团队组结构

场景: 创建一个开发团队,包含开发组、测试组和管理组

# 1. 创建组sudogroupadddeveloperssudogroupaddtesterssudogroupaddmanagers# 2. 创建用户并分配组sudouseradd-m -G developers dev1sudouseradd-m -G developers dev2sudouseradd-m -G testers test1sudouseradd-m -G managers,developers manager1# 3. 设置密码sudopasswddev1sudopasswddev2sudopasswdtest1sudopasswdmanager1# 4. 验证cat/etc/group|grep-E"developers|testers|managers"

6.2 创建共享项目目录

# 1. 创建项目目录sudomkdir/opt/project# 2. 设置组所有权sudochown:developers /opt/project# 3. 设置权限(组成员可读写执行)sudochmod775/opt/project# 4. 设置SGID(新文件自动继承组)sudochmodg+s /opt/project# 5. 验证ls-ld /opt/project# drwxrwsr-x 2 root developers 4096 Jan 15 16:00 /opt/project# 6. 测试sudev1touch/opt/project/test.txtls-l /opt/project/test.txt# -rw-r--r-- 1 dev1 developers 0 Jan 15 16:01 test.txt# (自动继承了developers组)

6.3 管理sudo权限

# 1. 查看sudo组成员cat/etc/group|grepsudo# sudo:x:27:kali,admin# 2. 添加用户到sudo组sudogpasswd -a dev1sudo# 3. 验证权限sudev1sudowhoami# root# (dev1现在可以使用sudo了)# 4. 移除sudo权限sudogpasswd -d dev1sudo

七、软链接入门

7.1 软链接基本概念

软链接(Symbolic Link):

  • 也叫符号链接,类似Windows的快捷方式
  • 是一个特殊文件,指向另一个文件或目录
  • 删除软链接不影响原文件
  • 删除原文件会导致软链接失效(断链)

硬链接vs软链接:

  • 软链接可以跨文件系统,硬链接不能
  • 软链接可以指向目录,硬链接通常不能
  • 软链接有自己的inode,硬链接共享inode

7.2 创建软链接 - ln -s

基本语法:

ln-s 源文件路径 链接名称

创建文件软链接:

# 1. 创建源文件echo"Original content">original.txt# 2. 创建软链接ln-s original.txt link.txt# 3. 查看ls-l# -rw-r--r-- 1 kali kali 17 Jan 15 16:10 original.txt# lrwxrwxrwx 1 kali kali 12 Jan 15 16:10 link.txt -> original.txt

软链接特征:

  • 文件类型是l(link)
  • 权限总是rwxrwxrwx(实际权限由源文件决定)
  • 箭头->指向源文件
  • 文件大小是源文件路径的字符数

使用软链接:

# 通过链接读取内容catlink.txt# Original content# 通过链接修改内容echo"Modified">>link.txt# 查看原文件catoriginal.txt# Original content# Modified

7.3 软链接实用示例

为常用目录创建快捷方式:

# 创建到项目目录的链接ln-s /var/www/html/myproject ~/project# 快速访问cd~/project# 等同于 cd /var/www/html/myproject

为程序创建快捷命令:

# 将自定义脚本链接到系统路径sudoln-s /opt/myapp/bin/mycommand /usr/local/bin/mycommand# 现在可以直接运行mycommand

配置文件管理:

# 链接配置文件到home目录ln-s /etc/nginx/nginx.conf ~/nginx.conf# 编辑更方便vim~/nginx.conf

多版本软件切换:

# 安装了多个Python版本ls-l /usr/bin/python*# /usr/bin/python3.8# /usr/bin/python3.9# /usr/bin/python3.10# 创建默认版本链接sudoln-s /usr/bin/python3.10 /usr/bin/python3# 切换版本sudorm/usr/bin/python3sudoln-s /usr/bin/python3.9 /usr/bin/python3

7.4 软链接注意事项

使用绝对路径(推荐):

# 推荐(绝对路径)ln-s /home/user/file.txt link.txt# 不推荐(相对路径,移动链接可能失效)ln-s../file.txt link.txt

删除软链接:

# 正确删除(不要加斜杠)rmlink.txt# 错误(会删除目标目录内容!)rmlink.txt/

检查断链:

# 查找断链(源文件不存在的链接)find.-type l!-exectest-e{}\;-print

更新软链接:

# 方法1: 先删除再创建rmlink.txtln-s newfile.txt link.txt# 方法2: 使用-f强制覆盖ln-sf newfile.txt link.txt

八、综合实战案例

8.1 完整的用户组管理流程

场景: 为新员工创建账户并配置权限

# 1. 创建用户sudouseradd-m -c"John Doe, Developer"-s /bin/bash john# 2. 设置密码sudopasswdjohn# 3. 添加到开发组sudogpasswd -a john developers# 4. 添加到sudo组(如需管理权限)sudogpasswd -a johnsudo# 5. 创建项目链接sujohnln-s /opt/projects/webapp ~/webapp# 6. 验证idjohnls-l ~/webapp# 7. 测试权限cd~/webapptouchtest.txt

8.2 用户离职清理流程

# 1. 锁定账户sudousermod-L john# 2. 终止用户进程sudopkill-u john# 3. 备份用户数据sudotar-czf john_backup_$(date+%Y%m%d).tar.gz /home/john# 4. 检查用户文件sudofind/ -user john2>/dev/null>john_files.txt# 5. 从关键组移除sudogpasswd -d johnsudosudogpasswd -d john developers# 6. 彻底删除(确认备份后)sudouserdel-r john# 7. 清理遗留文件sudofind/ -nouser2>/dev/null

总结

核心知识点回顾

  1. 用户管理命令:
    • usermod -l: 修改用户名
    • usermod -L/-U: 锁定/解锁用户
    • userdel -r: 彻底删除用户
  2. 组管理命令:
    • groupadd: 创建组
    • groupmod: 修改组
    • groupdel: 删除组
    • gpasswd -a/-d: 添加/删除组成员
  3. 重要文件:
    • /etc/passwd: 用户信息
    • /etc/shadow: 密码信息(加密)
    • /etc/group: 组信息
  4. 软链接:
    • ln -s: 创建软链接
    • 类似快捷方式,指向原文件
    • 下篇文章将详细介绍硬链接和软链接的区别

学习建议

  1. 实践操作: 在虚拟机中反复练习用户和组管理
  2. 理解关系: 清楚用户、主组、附加组的关系
  3. 注意安全: 删除前备份,修改前确认
  4. 善用验证: 每次操作后使用id、cat等命令验证结果
  5. 记录操作: 重要操作记录日志,便于追溯

下一步学习

掌握了用户和组管理后,下一篇文章将深入学习:

  • 进程管理: 进程查看、控制和调度
  • 链接文件详解: 硬链接vs软链接,inode概念
  • SSH配置: 远程登录和密钥认证

用户和组管理是Linux系统管理的核心技能。通过本文的系统学习和实战演练,相信你已经能够熟练地进行用户和组的日常管理操作。继续深入学习,成为专业的Linux系统管理员!


系列文章说明: 本文是"Linux零基础入门系列"的第六部分,专注于用户和组管理的实战操作。建议结合前面的权限管理知识,系统掌握Linux用户体系。下一篇将介绍进程管理和链接文件的高级应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习毕设项目推荐-基于python-CNN卷积神经网络对不同柑橘病变识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

从历史角度理解当前市场状况的重要性

从历史角度理解当前市场状况的重要性 关键词:历史角度、市场状况、经济周期、市场规律、决策依据、风险评估、未来趋势 摘要:本文旨在探讨从历史角度理解当前市场状况的重要性。通过回顾市场发展的历史,我们能够发现经济周期、市场规律等关键要素,这些要素对于准确评估当前…

【毕业设计】基于python-CNN卷积神经网络对不同柑橘病变识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

C++编程从新手到高手的成长之路

我的C学习之旅 我:最近想学C,但是感觉好难啊!指针、内存管理、模板… 头都大了! C导师:别担心,每个C程序员都经历过这个阶段。让我带你一步步理解C的精髓。想想看,C就像一辆超级跑车——既能像…

计算机深度学习毕设实战-基于python-CNN人工智能卷积神经网络对不同柑橘病变识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Transformer之后,AI编程未来趋势会向哪里发展?AI应用架构师的思考

Transformer之后,AI编程未来趋势会向哪里发展?——AI应用架构师的思考 一、引入:当“代码补全”遇到“系统思维”——AI编程的下一个拐点 小张是某电商公司的资深程序员,最近他的工作发生了微妙的变化:以前写接口需要查文档、调参数,现在只要对着Copilot说“帮我写一个…

【毕业设计】基于python-CNN深度学习卷积神经网络的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

A2O MAY斩获中国MBIA行业盛典新人奖 达成全球新人奖四冠王

由A2O Entertainment(以下简称A2O)推出的全球女团 A2O MAY(成员包括朱晨予 CHENYU、李诗洁 SHIJIE、曲唱 QUCHANG、陈佳仪 MICHE、陈佳辰 KAT)在中国颁奖典礼上再添新人奖项,正式达成全球新人奖「四冠王」成绩。于17日…

学习Java41天

抽象类 (Abstract Class)一、抽象类的基本概念1. 抽象方法定义:一个没有方法体的方法(即只有方法声明,没有具体的实现)。格式:javapublic abstract 返回值类型 方法名(参数列表);特点:使用 abstract 关键字…

2024美团_京东Hive面试真题解析:原理+实战+优化,附详细答案

2024美团/京东Hive面试真题解析:原理实战优化,附详细答案 一、引言:从面试场景到核心能力 你坐在美团的面试间里,面前的面试官放下简历,推过来一道题: “为什么Hive查询慢?从原理到优化&#xf…

27考研记录数据结构以及一元函数微分学的学习记录

作为科班的学生,已经学习过了数据结构和计算机网络,但是作为408 的知识,之前学习会有一些浅显,现在在王道的哔站中进行复习,但是 之前并没有学习过计算机组成原理,听说这个挺难学的,之后还有进行 学习,今天对于…

Flutter for OpenHarmony移动数据使用监管助手App实战 - 帮助实现

Flutter for OpenHarmony移动数据使用监管助手App实战 - 帮助实现

深度学习毕设项目:基于python-CNN机器学习卷积神经网络的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【课程设计/毕业设计】基于python-CNN机器学习卷积神经网络对不同柑橘病变识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Flutter入门:打包

一般运行/调试后,会出现这个文件: build/app/outputs/apk/flutter-apk/app-debug.apk这个apk不能直接安装在安卓手机。 需要运行: flutter build apk --release --split-per-abi --target-platform android-arm,and…

RHCSA(2)

一.作业要求作业需求查看文件文件查找查找文件中包含字符串ro的所有行,将所有行的副本按原始顺序放在文件中将目录下的文件打包并压缩写一个命令命为hello命令创建组群,再创建用户,并写出该命令创建g1组,要求创建一个属…

PDF Eraser Pro 2.0 PDF Eraser:支持文本 图像精准擦除,可添加文字图片,适配办公、学习等 PDF 轻编辑场景

大家好,我是大飞哥。处理PDF文件时,我们常遇到无法精准删除内容、编辑功能单一、操作繁琐的痛点——传统PDF工具要么仅支持简单文本修改,要么删除后易留痕迹,难以适配“精准擦除补充编辑”的需求。PDF Eraser是一款聚焦PDF内容精准…

【课程设计/毕业设计】基于深度学习python-CNN卷积神经网络的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Flutter开发环境:VS Code + Android Studio

https://www.botaokeji.net/基于vs-code及android-studio的flutter移动应用开发环境配置教程/

深度学习毕设选题推荐:基于python-CNN卷积神经网络人工智能的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…