Linux学习笔记(五)----理解Linux文件权限

linux文件权限管理及目录内容查询 (1)有些函数是可重入的有些是不可重入的。(2) readdir函数和我们前面接触的一些函数是不同的,首先readdir函数直接返回了 (2)Readdir函数和我们前面接触的一些函数是不同的,首先Readdir函数直接返回了一个结构体变量指针,因为readdir内部申请了内存并且给我们返回了地址。多次调 --个结构体变量指针,因为Readdir内部申请了内存并且给我们返回了地址。多次调用readdir时,内部并不会重复申请内存,而是使用第一次调用readdir时分配的内存。 阅读详情

Linux允许用户和组根据每个文件和目录的安全性来访问文件

Linux的安全性

Linux安全系统的核心是用户账户;用户权限根据每个用户的UserID 跟踪

添加新用户

useradd       (默认值设置在/etc/default/useradd  文件中)   -D  参数可以查看 这些默认值

useradd   默认不会创建HOME目录    加 -m  即可

删除用户

userdel   只会删除/etc/passwd 中的用户信息      -r  可以删除HOME目录

修改用户

1.usermod

-l    修改用户账户的登录名

-L   锁定账户,  使用户无法登录

-p   修改账户密码

-U   解除锁定

2.passwd 和 chpasswd

passwd 修改自己密码. root用户 可以修改别人密码

chpasswd 能从标准输入 读取 (由冒号分割)

3.chsh shfn chage

chsh 修改默认用户登录shell(必须是shell全路径名)

chfn 提供 /etc/passwd 文件的备注字段中存储信息的标准方法

chage  管理用户账户的有效期

使用Linux组

组权限允许多个用户对系统中对象共享一组共用的权限

创建新组

groupadd  创建新组

usermod  -G   会把新组添加到用户的账户组列表中   (-g  会替换掉默认组)

 修改组

groupmod      (只有组名发生改变)

理解文件权限

把用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。

使用 ls 查看一个文件时,会出现一个文件的信息,例如 drwxr-xr-x. 3 root root 17 May 6 00:14 .config,对这个内容的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段。
  • 3:链接数;
  • root:文件拥有者;
  • root:所属群组;
  • 17:文件大小;
  • May 6 00:14:文件最后被修改的时间;
  • .config:文件名。

常见的文件类型及其含义有:

  • d:目录;
  • -:文件;
  • l:链接文件;

9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。

umask 设置默认权限  第一位为粘着位   后三位 为权限字段   文件全权限666  目录全权限777

例子  umask 0022     文件      对应  666 - 022    = 644 

文件属性以及权限的修改

1. 修改文件所属群组

# chgrp [-R] groupname dirname/filename
-R:递归修改

2. 修改文件拥有者

不仅可以修改文件拥有者,也可以修改文件所属群组。

# chown [-R] 用户名:群组名 dirname/filename

3. 修改权限

可以将一组权限用数字来表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r:4、w:2、x:1。

# chmod [-R] xyz dirname/filename

范例:将 .bashrc 文件的权限修改为 -rwxr-xr--。

# chmod 754 .bashrc

也可以使用符号来设定权限。

# chmod [ugoa]  [+-=] [rwx] dirname/filename
- u:拥有者
- g:所属群组
- o:其他人
- a:所有人
- +:添加权限
- -:移除权限
- =:设定权限

范例:为 .bashrc 文件的所有用户添加写权限。

# chmod a+w .bashrc

共享文件

共享文件的方法为创建组

SGID 可以强制在共享目录下创建的新文件都属于该组

mkdir 创建共享的目录 然后 chgrp 修改目录默认属组 然后将SGID置位 umask 002 即可.

【Linuc】深入理解 Linux 文件权限 理解 Linux 文件权限的数字计算逻辑(如777755等)是掌握权限管理的核心技能。通过本文的符号模式与数字模式对照、特殊权限解析及场景化示例,读者可以更精准地控制文件访问权限。切记:权限配置的本质是在便利性与安全性之间寻求平衡,永远不要为图省事滥用 777 权限!建议在日常操作中结合man chmod等手册命令深化学习,逐步构建安全的 Linux 系统环境。 阅读详情

相关推荐

掌握文件权限:理解Linux chomod

(更改模式)命令chmod是管理 Linux 中文件权限的基础,它使管理员能够定义或调整用户、组和其他人的读取、写入和执行权限。此功能不同于 chown(更改所有者)命令,后者会更改文件或目录的所有权而不是其权限。对于那些不熟悉文件权限或寻求基础知识的人来说,需要奠定基础。

ghie9090的博客 887

【Linux】Linux文件权限的理解

1、文件天生不具备某种权限2、文件具备权限但限制你的访问

学了就忘是正常现象 4712

Linux:修改文件权限

在Linux系统中,权限管理是文件和目录安全性的核心。文件权限是非常重要的,它们决定了哪些用户可以读取、写入或执行文件。

Kant2048的博客 1494

理解Linux文件权限

Linux的安全性总结来说,Linux系统通过用户账户、UID、文件以及文件权限机制,构建了一套相对完善的访问控制体系,以确保系统的安全性和稳定性。/etc/groupUSERNAME/etc/group/etc/group理解文献权限和改变安全设置总结。

Q123321777的博客 996

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 432

利用BMC和KVM远程安装联想服务器Ubuntu 22.04的完整指南

本文提供了一份详尽的指南,介绍如何利用联想服务器的BMC(基板管理控制器)和KVM(键盘、视频、鼠标)重定向功能,远程安装Ubuntu 22.04 LTS操作系统。内容涵盖从准备工作(如获取BMC信息、配置Java环境)、登录BMC并启动远程控制台,到挂载ISO镜像、设置引导以及完成Ubuntu安装与后续配置的全过程。该方法能极大提升服务器部署与运维效率,尤其适用于无法物理接触服务器的场景。

p8q9r0的博客 620

五、Linux下的文件权限管理

文章目录目标1.如何查看及读取权限信息对于属性各字段的理解2. 文件的拥有者及拥有组 目标 1.如何查看及读取权限信息 2.设定文件的拥有者及拥有组 3.理解各种权限类型对于文件的影响 学习目标 OBJECTIVES 4.熟练设定权限 5.权限预留阀值umask 6.系统中的特殊权限 7.facl权限列表的应用 1.如何查看及读取权限信息 ls -l 文件名 #查看文件属性(=ll 文件名) l...

weixin_46138661的博客 1933

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1027

Linux文件权限理解

摘要: 文件权限通过角色(拥有者、所属组、其他用户)和属性(读r、写w、执行x)控制访问。权限由ll命令显示的10字符标识:首字符区分文件类型(如-普通文件,d目录),后9字符分三组对应角色权限。操作权限使用chmod(符号模式如u+x或数字模式如755),修改角色用chown/chgrp。umask决定新建文件/目录的默认权限(如022屏蔽组和其他用户的写权限)。粘滞位(如/tmp的t权限)限制目录内文件仅所有者、目录所有者或root可删除,确保共享目录安全。权限管理保障了系统安全与协作效率。

2402_87398803的博客 1211

零代码进行单细胞数据全流程分析教程

我开发的本地电脑无限使用无限分析作图的生信零代码一键分析电脑软件神器OmicsTools 软件在github上的zihaoxingstudy1/OmicsTools仓库 中,大家可以下载安装OmicsTools进行各种生信分析和可视化作图。

qq_40073899的博客 3617

Windows: 深入剖析pip install SSLError与SSL模块缺失的根源及系统级修复

本文深入分析Windows系统下pip install SSLError与SSL模块缺失的根本原因,提供系统级修复方案。从Python安装包缺失SSL支持、OpenSSL库冲突到环境变量配置问题,详细讲解四大成因及对应的解决方案,包括重新安装Python、手动修复OpenSSL依赖等实用技巧,帮助开发者彻底解决HTTPS连接问题。

weixin_28595749的博客 459

【Linux】文件权限的理解

更新你对于Linux文件权限的认知!

The porters of knowledge 2911

双通道中频信号数字下变频及相位差估计(FPGA)

双通道中频信号数字下变频及相位差估计实验 一、上框图(通俗易懂) 二、实验要求 1、 用点频信号模拟中频信号:中频信号由DDS1和DDS2产生。具体产生方法见第2点。 2、 DDS1和 DDS2:调用IPcore里的数字信号处理中的NCO模块,工作时钟为100MHz,数据率即为100MHz,DDS1和DDS2的频率为:(学号后三位+500)Khz+f0(可设为20MHz);输出为16位;DDS1...

qq_39809425的博客 6941

Linux 文件权限

    和周围人交流发现,文件权限这一块似乎是很多人弄得不明不白的地方,就是知道这么个东西,但是看也看不太懂,知道得也不清楚,毕竟也可能是有些同学还没学到需要清楚了解文件权限的地方,没有怎么去看过或处理过与文件权限相关的信息,于是就是仅仅知道而已,但是文件权限其实是相当重要的知识,尤其是学到网络这一块你就会知道。下面开始进入正题一、查看文件权限    首先,在终端你输入这个命令ls -l    得...

刘斐浩的博客 1万+

Jetson 平台编译安装 FFmpeg 7.1(支持 Nvmpi + SRT + x265)

摘要: 本文详细介绍了在NVIDIA Jetson平台上编译FFmpeg 7.1并集成关键功能的全过程。通过补丁方式加入Nvmpi实现硬件加速支持,同时编译集成x265编码器和SRT低延迟传输协议。步骤涵盖:1)安装x265编码器;2)配置SRT协议支持;3)编译jetson-ffmpeg的Nvmpi接口;4)定制化编译FFmpeg 7.1;5)验证模块集成情况。最终实现支持硬件编解码、高效HEVC压缩和可靠推流的增强版FFmpeg,为Jetson平台的音视频处理提供完整解决方案。

J。 345

华为OD机考真题 新系统 9月23号 【世界杯徽章换购】多语言题解

华为OD机试真题 新系统【世界杯徽章换购】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【世界杯徽章换购】多语言题解。

qq_45776114的博客 686

Linux文件权限

Linux权限的理解

sqjddb的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux文件权限详解

Linux文件权限是系统管理的重要组成部分,理解并正确应用这些权限对于确保系统的安全性和数据的完整性至关重要。通过掌握文件权限的基础知识、管理工具和最佳实践,您可以更有效地保护您的Linux系统。本文将深入探讨Linux文件权限的各个方面,包括权限的表示、设置、修改以及如何通过命令行管理权限。例如,对于仅需要读取的文件,应移除写和执行权限。它可以让你为单个用户或组设置特定的权限,而不仅仅是文件的所有者、组和其他用户。umask命令用于设置默认权限掩码,它决定了新创建的文件和目录的默认权限。

huang714的专栏 3384

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

理解linux文件权限

c 修改备注字段 -e修改过期日期 -g 修改默认的登录组 -l修改用户账户的登录名 -p修改账户的密码 -U解除锁定,使用户能够登录 -L选项尤其实用。使用userdel,但默认情况下,userdel命令会只删除/etc/passwd和 /etc/shadow文件中的用户信息,而不会删除系统中属于该账户的任何文件。练习:•为你的组员创建新组•使用usermod将创建的组添加到用户列表•修改组名和GID•删除创建的组。

weixin_69406831的博客 721

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux系统的文件权限

Linux权限

2201_75964502的博客 1481

文件权限linux

Linux文件权限命令 一、查看文件的权限 用 ll 或者 ls -l 这两种命令的区别在于:ll会列出该文件下的所有文件信息,包括隐藏的文件,而ls -l只列出显式文件。 例如: 二、读权限 第一段:第1位,表示文件类型(看红色框框) -为:表示文件; d为:表示文件夹; l为:表示链接文件,可以理解为 windows中的快捷方式(link file); b为:表示里面可以供存储周边设备; c为:表示里面为一次性读取装置。 第二段:第2,3,4位,拥有者具有的权限。 类似于windows中的所有

@@老胡的博客 1万+

理解 Linux 文件权限

Linux 的安全性、使用 Linux 组、理解文件权限、改变安全性设置、共享文件

Jia ming 的日常学习笔记 1222

【Linux】查看文件权限

所有者权限,这一点相信你应该明白了,至于所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限,比如,你有一个 iPad,那么这个用户组权限就决定了你的兄弟姐妹有没有权限使用它破坏它和占有它。:链接文件是分为两种的,另一种当然是“硬链接”(硬链接不常用,具体内容不作为本课程讨论重点,而软链接等同于 Windows 上的快捷方式,你记住这一点就够了)。命令了,如你所见,我们用它来列出并显示当前目录下的文件,当然这是在不带任何参数的情况下,它能做的当然不止这么多,现在我们就要用它来查看文件权限。

double222222的博客 1861
上一篇: Linux学习笔记(四)----使用Linux环境变量
下一篇: Linux学习笔记(六)----安装软件程序
普通网友
博客等级 码龄9年 489粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值