Day11(Linux软件包管理与权限管理)

本文详细介绍了Linux系统中RPM软件包的管理,包括查询、安装、卸载等操作,以及YUM作为RPM的前端程序如何自动解决依赖关系。此外,还阐述了用户和权限管理,如创建、修改和删除用户,以及文件和目录的权限设置,重点讲解了用户信息、密码管理和文件权限的查看与修改。通过对这些内容的学习,读者能深入理解Linux系统的软件包管理和权限控制机制。
摘要由CSDN通过智能技术生成

一:RPM软件包管理

1.RPM概述:

● 由 Red Hat 公司提出,被众多 Linux 发行版所采用
》》》YUM软件包管理器《《《
● YUM-软件包管理器
● 建立统一的数据库文件
● 详细记录软件包安装、卸载等变化信息
● 自动分析软件包依赖关系

2.RPM命令格式:

使用rpm命令能够实现几乎所有对RPM软件包的管理功能,执行“man rpm”命令可以获得关于rmp命令的详细帮助信息,如下:
在这里插入图片描述在这里插入图片描述

从rpm命令的手册页信息中可以看出,rpm命令有好多的命令选项,结合这些选项主要可以实现以下三类功能。
● 查询、验证RPM软件包的相关信息
● 安装、升级、卸载RPM软件包
● 维护RPM数据库信息等综合管理操作

3.查询RPM软件包信息

使用rpm命令的查询功能可以查看某个软件包是否已经安装,软件包的用途以及软件包的复制到系统中的文件等相关信息,以便更好地管理Linux操作系统中的应用程序。

3.1:查询已安装的RPM软件信息

rpm -q【子选项】【软件名】
● -qa:显示当前系统中以RPM方式安装的所有软件列表
● -qi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息
● -ql:显示指定的软件包在当前系统中安装的所有目录、文件列表
● -qf:查看当前指定的文件或目录是由哪个软件包所安装的
直接执行‘rpm -qa’命令将列出当前操作系统中以RPM方式安装的所有软件包清单
在这里插入图片描述

可以结合管道符和‘wc -l’命令统计系统中以安装的RPM软件的个数
在这里插入图片描述

当需要查询某个软件包是否已经安装时,可以直接使用软件名称作为查询参数
在这里插入图片描述

如果不知道准确的软件包名称,还可以对全部查询结果进行过滤
在这里插入图片描述

如果想知道已安装的某个软件的用途,可以使用“rpm -qi 软件名”
在这里插入图片描述

当需要查看某个软件包安装的目录和文件清单时,可以使用“-ql”选项
在这里插入图片描述

当需要知道系统中的某一个文件是由哪个软件生成的时候,可以用“-qf”
在这里插入图片描述在这里插入图片描述

注意:使用rpm命令只能查询通过RPM方式安装的软件包信息用,其他途径安装到系统中的软件包,rpm命令将无法获取相关信息

3.2:查询未安装的RPM软件包文件中信息

使用“-qp”选项时,必须以RPM软件包文件的路径作为参数(可以有多个),而不是软件包名称
● -qpi: 查看指定软件包的名称、版本、许可协议、用途描述等详细信息
● -qpl: 显示指定的软件包准备要安装的所有目录、文件列表

3.3:安装、升级、卸载RPM软件包

● -i:(install)在当前系统中安装一个新的RPM软件包-e:卸载指定名称的软件包
● -U:检查并升级系统中的某个软件包,若该软件包原来并未安装,则等同于“-i”选项
● -F: 检查更新系统中的某个软件包,若该软件包原来并未安装,则放弃安装
● -h:在安装或升级软件包的过程中,以“#”号显示安装进度
● -v:显示软件安装过程中的详细信息
● --force:强制安装某个软件包
● --nodeps:在安装或升级、卸载一个软件包时,不检查与其他软件包的依赖关系
● -e 软件名称:卸载软件包

4.实操rpm安装QQ

①在centos里面打开火狐浏览器进入QQ官网,选择linux版本的QQ
在这里插入图片描述

②选择x64架构下的rpm版本下载并保存
在这里插入图片描述在这里插入图片描述

③打开下载的文件并在此处打开终端
在这里插入图片描述

④切换root权限安装QQ
在这里插入图片描述

⑤安装成功
在这里插入图片描述

二:YUM软件包管理

1.YUM管理软件包

yum简介

rpm软件包虽然方便,但是需要手动解决软件包的依赖关系的问题。YUM(yellowdog updater Modified)是RPM的前端程序,主要设计用来解决RPM依赖关系问题。特点如下:
● 自动解决依赖关系
● 对RPM进行分组,并基于组进行安装操作
● 引入仓库概念,支持多个仓库
● 配置简单
yum引入仓库(repo)的概念,仓库用来存放所有现有的rpm软件包,当使用yum安装一个rpm软件时,如果存在依赖关系,会自动在仓库中查找依赖关系并安装。仓库可以使本地的,也可以通过HTTP、FTP或NFS形式使用集中的、统一的网络仓库。仓库的配置文件保存在/etc/yum.repos.d/目录下,格式如下:
[LinuxRPM](节点名称)
name=RPM(仓库的描述)
baseurl=(本地file、HTTP、FTP、NFS)仓库文件的路径
enabled=1(启用仓库)
gpgcheck=1(启用签名校验)(生产环境中一般需要打开)

更新yum库

yum makecache

软件安装

yum provides *bin/软件 查找软件的包名
yum -y install 包名 安装软件,-y是参数自动确定
yum -y reinstall 包名 重新安装
yum -y update 包名 升级一个软件
yum -y update 更新所有软件

查询

yum list 包名 查看安装包的位置

卸载

yum -y remove 包名 卸载软件

2.配置本地YUM源

++

3.配置网络YUM源

++

三:磁盘文件管理

++磁盘文件格式
++实战添加硬盘划分区

四:用户及权限管理

1.创建、修改和删除用户与组

1.1用户信息可以通过查询/etc/passwd文件,每一行代表一个用户信息

在这里插入图片描述

每个冒号分隔一部分,整行总共分为7个部分
①用户名
②用户密码,早期版本的账号密码是直接存在这里,为了兼容所以也保留下了这部分,用X代替
③UID:所属的用户ID,每个文件的前面都有该文件所属的用户和组,其实存的是UID只不过是通过UID再去etc/passwd、/etc/shadow中找到对应的UID和GID的名称。
超级用户的uid=0
系统用户(1-499):其中1-99是系统创建的,100-499是用户创建的系统账户,系统用户不能登入但是可以执行系统的一些命令,这个跟最后指定的shell有关;有一个特殊的shell是/sbin/nologin
普通用户(500-65535)
④GID:账号所属的用户组的ID,和/etc/group组文件有关联
⑤用户描述
⑥用户的家目录:常见用户的家目录默认是在/home/用户/,在创建用户的时候可以指定用户的家目录,系统用户的家目录比较特殊,比如root用户的家目录是/root
⑦shell:shell是终端和kernel(内核)沟通的桥梁、内核再和低层的硬件交互(包括CPU、主板、硬盘、显卡、光驱等),linux默认的shell是/bin/bash

1.2密码信息可以通过查询/etc/shadow文件,总共分为九个部分

在这里插入图片描述

①用户名:对应/etc/password文件中的用户信息
②密码:密码存的是密文
③最近更改密码的日期:linux将1970年1月1日作为1,所以上面的16862是累加的,具体就不去算了
④密码不可被更改的天数:0代表密码随时可以被更改,通常可以用来设置某个用户在多少天密码不能被更改
⑤密码需要重新更改的天数:99999为273年,改时间是在第3部分的基础上再相加的。
⑥密码需要修改前的警告天数:改天数是在第5的基础上计算的,这里默认是7天也就是密码在需要更改前的第7天开始就发出警告。
⑦密码过期后账号宽限的天数:当密码超过了需要更改的天数后,如果用户依然没有更改密码,那么该密码就过期了,在过期的这几天里密码依旧可以登入当用户在宽限的时间内登入系统系统会强制用户修改密码,如果用户在宽限的天内还未修改密码那么密码就永久过期无法再登入,只有账户超出了密码过期的天数之后账户才失效,所以一个账户总的有效时间是3+6+7。
⑧用户失效的日期:改日期同第3部分一样都是从1970年1月1日开始计算出来的数字,超过这个日期之后无论用户密码是否过期用户都失效不能再使用,改日期通常会用在规定一个用户在规定的日期之后就用户就不能使用的收费系统中。
⑨保留部分
计算当前日期通过1970年换算过来的数字
在这里插入图片描述

计算指定日期通过1970年换算过来的数字
在这里插入图片描述

1.3创建用户

明白了上面的概念之后就可以来创建用户了,创建用户的命令是useradd,接下来看几个主要的参数。
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-m\M] [-c 说明] [-d 家目录绝对路径] [-s shell] 账号名
-c, --comment COMMENT 用户说明
-d, --home-dir HOME_DIR 用户的家目录
-D, --defaults 默认的用户配置
-e, --expiredate EXPIRE_DATE 用户的失效日期,这里需要指定的是从1970年1月1日开始计算出来的数字,比如16925代表2016年5月4日过期,对应密码文件的第8部分
-f, --inactive INACTIVE 指定密码过期的时间,这里指定的是数字,比如10代表密码在过期的10天内还可以登入但是登入后需要强制修改密码, 对应密码文件的第7部分
-g, --gid GROUP 用户的GID
-G, --groups GROUPS 列出用户还能加人的组、次要组
-h, --help 帮助信息
-k, --skel SKEL_DIR use this alternative skeleton directory
-K, --key KEY=VALUE override /etc/login.defs defaults
-l, --no-log-init do not add the user to the lastlog and faillog databases
-m, --create-home 强制需要创建家目录
-M, --no-create-home 强制不创建家目录
-N, --no-user-group 不创建用户的组名和用户名一样
-o, --non-unique 允许创建的用户uid相同,默认情况下用户的UID是唯一的,加上-o参数可以创建相同UID的不用用户
-p, --password PASSWORD 指定创建用户的密码,这里的密码存储的是密文,所以还需要知道密文对应的明文密码是多少
-r, --system 创建一个系统用户
-s, --shell SHELL 指定用户的shell
-u, --uid UID 指定用户的uid
-U, --user-group 创建的用户组名同用户名,这是默认的
-Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user mapping

1.3.1创建test用户

创建用户不加参数默认会创建一个同名的用户组、密码为空,用户的UID和GID都是500之后在现有的UID和GID的基础上往后自动添加、默认会创建一个同名的家目录家目录的默认权限是普通用户
在这里插入图片描述

1.3.2创建用户new备注用户为test,指定用户uid为600,用户的组初始组为test,用户次要组为yuchen,指定用户的失效日期(注意这里的失效日期也是需要通过1970年1月1日进行换算)、指定用户的过期天数

在这里插入图片描述

1.3.3创建系统用户old

创建的系统用户虽然在用户文件中有指定家目录,但是实际上在home目录下并不会创建对应用户的目录,且不会创建用户邮件通知目录。
在这里插入图片描述

1.3.4创建不允许登入的用户

在这里插入图片描述

1.3.5指定用户家目录

先创建用户家目录
在这里插入图片描述

创建用户并指定家目录
在这里插入图片描述

注意:这里的家目录是绝对路径,也就是你指定了那个目录家目录就是哪个目录不会在你指定的目录下再创建目录,这里会有警告说用户不能拷贝文件到家目录,因为家目录的权限还是之前创建目录用户的权限,这个时候需要给家目录赋予用户拥有者。

在这里插入图片描述

1.4删除用户

userdel [options] LOGIN
-f, --force 强制删除用户,不管该用户是否在使用
-h, --help 帮助信息
-r, --remove 删除用户和组并且删除用户的家目录和邮件通知目录
-Z, --selinux-user 删除SELinux用户

1.4.1不加参数删除用户

userdel testuser
在这里插入图片描述

1.4.2删除用户同时删除用户的家目录和邮件通知目录

userdel -r test
使用-r参数删除用户会同时删除用户的家目录和用户的邮件通知目录,如果用户的用户组是使用其它用户的用户组,其它用户组不会被删除。

1.5用户组

1.5.1创建用户组

groupadd groupname

1.5.2删除用户组

groupdel groupname

1.5.3修改用户组

修改用户组名
groupmod -h newname oldname
修改用户组ID
groupmod -g newgid oldgid

2.文件及文件夹权限管理

①文件的权限

● 文件权限的查看
命令:ls -l
在这里插入图片描述

可以使用ll命令代替ls -l
在这里插入图片描述

● ls -l 所包含的信息
(1)权限信息 (-rw-r–r-- )
一共有10位
a.第一位:表示文件信息
-:表示普通文件
d:表示目录
l:表示软连接(快捷方式)
b:设备
p:管道文件
b.第2-4这三位表示属主的权限 -----------------》字母u代替
-:表示没有权限
r:读取文件的权限
w:修改文件的权限
x:执行文件的权限
c.第5-7这三位表示属组的权限-------------------》字母g代替
-:表示没有权限
r:读取文件的权限
w:修改文件的权限
x:执行文件的权限
d.第8-10这三位表示其他人的权限----------------》字母o代替
-:表示没有权限
r:读取文件的权限
w:修改文件的权限
x:执行文件的权限
(2)安全性
权限信息后紧跟的是一个点,这个是和selinux相关的,表示的是linux的安全性,selinux是一个安全软件。
(3)硬连接数
点之后是数字,表示的是硬连接数。
(4)属主
之后的root表示属主,文件的拥有者。
(5)属组
属主之后的root表示属组。
(6)文件大小
2000表示文件的创建大小。
(7)文件创建时间
之后的时间表示文件的创建时间
(8)文件名称
最后一项表示文件名称
● 修改权限
修改权限命令关键词:chmod(change mod)
a. 修改属主权限:chmod u+x 文件路径(追加权限)或者chmod u=r 文件路径(覆盖权限)
在这里插入图片描述

b. 修改属组权限:与属主权限的修改类似,可以使用(‘+’,‘-’)号进行权限的修改,也可以使用赋值的方式。
chmod g+rw 文件路径
chmod g=— 文件路径 (此处也可以用一个‘-’表示)
在这里插入图片描述

c. 修改其他人的权限:同以上修改权限的方法相同
chmod o=rwx 文件路径
chnod o-x 文件路径
在这里插入图片描述

d. 写文件的权限
vim编辑器用于打开文件并进行编辑,vim 文件路径 ------》a或者i进入编辑模式----------》进行编辑------ -》esc退出编辑模式-------》:(shift+:)-------》wq保存文件
如果存在w的权限则可以进行编辑,如果没有就不可以。
注:如果一个人没有读的权限但有写的权限,当他每次写完后,会把文件中原先的内容覆盖掉。
在这里插入图片描述

e. 执行可执行文件的权限(x)
注:执行命令有以下的方式
./文件路径
sh 文件路径
bash 文件路径
f. 将用户添加到组,从而拥有组权限
在这里插入图片描述

②目录的权限

查看目录的命令:ll -d 文件夹路径
在这里插入图片描述

目录的r权限
可以ls该目录下的文件以及子目录
在这里插入图片描述

目录的w权限
添加文件权限
在这里插入图片描述

删除文件的权限
在这里插入图片描述

重命名文件
在这里插入图片描述

目录的可执行权限
目录的x权限就是cd命令
注:目录中船舰文件必须需要有执行权限,w的权限是不够的,因为需要cd进目录中进行创建
在这里插入图片描述

注:权限不受root以及属主限制,即使修改了权限限制

③属主,属组的更改

更改属主、属组关键字chown(change owner)
属主更改
chown 属主 文件或者目录路径
在这里插入图片描述

属组更改
chown .属组 文件或者目录路径
在这里插入图片描述

属主、属组都进行修改
chown 属主.属组 文件或者目录路径
在这里插入图片描述

④基于数字的权限管理

属主、属组以及其他人的权限更改还可以使用数字进行权限的更改
在这里插入图片描述

3.特殊权限SUID

1:SetUID的功能

只有可以执行的二进制程序才能设定SUID权限。(给其他文件设置没有意义),命令执行者要对该程序拥有x(执行)权限,命令执行者在执行该程序时获得该程序文件所有着的身份(在执行程序的过程中灵魂附体为文件的属主,相当于变身命令),SetUID权限指在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。

passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码
在这里插入图片描述

在所有者的权限里面有s就是SUID权限,在所属组里面有s就是SGID权限,在其他人里面有s就是SBID
cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
在这里插入图片描述

2.设定SetUID的方法

4代表SUID,2表示SGID,1表示SBID 7表示SUID,SGID,SBID都有,chmod 4755 文件名;
在这里插入图片描述
chmod u+s 文件名
在这里插入图片描述

如果使用chmod u+s test
在这里插入图片描述

s是大写的这是因为出错了,因为SetUID的功能说明中强调命令执行者要对该程序有执行权限,所以会报错

3.取消SetUID的方法

使用chmod命令吧文件的权限修改为以前的,或者使用 u-s 文件名来修改
在这里插入图片描述

4.危险的SetUID

最好不要随便修改

最新的 BB1407 openwrt-RG100A_DB120-squashfs-cfe.bin 固件 固件集成了,usb u盘 USB 摄像头uvc se2net:wifi串口 这是固件文件。主要编这个固件是做摄像头监控,集成motion 进行监控拍照保存到挂载的硬盘,挂载位置为/mnt/sda1/post motion。conf 复制到/etc/ 另外可以及在自己安装已个百度云盘同步。 我的是自动监控拍照然后上传置百度云盘上。我装的是Perl精简 测试很成功。值得拥有。我把文件都集成到已个包里自己安装。百度云盘自己安装 Python版已完成,可以支持4G以上的文件,需要的去网盘下载,同时Perl精简版也已完成,部分系统同样不能支持大文件,那个要看语言环境是否支持大文件。 ---------------------------------------------------------------------------------------------------------------------------- 上个月发布了个bash版的同步脚本,虽能与百度网盘之间实现上传、下载和同步,但性能不是很好,稳定性也不是那么完美,此后就想着如何能解决这两个问题,首先想到的是用C语言来写下,但是C语言写的要针对特定的设备进行编译,比较麻烦,后面就想到用Perl或Python来写,百度了一番都说Perl语言运行速度快,我在Open-WRT上看了下Perl的包也挺多,然后就写了个测试脚本,就是压缩同步数据的那段,然后在CentOS上运行测试了下,发现速度比bash快了几乎上百倍,于是毅然决定用Perl写了。Perl是一门语言,很多工作都是内部命令完成,不需要调用外部命令,性能有很大的提高,同时也降低了对内存的占用,我的路由是wndr3700,在同步文件时内存占用在8M上下,cpu占用在20%上下,比bash版降低很多,特别是cpu占用低很多,13000余个文件,做一次同步检查只需要不到3分钟(还是没有开启缓存),原来bash版跑了40分钟还没见完成,没有耐心等待就强制中止了,具体好不好用自己感受吧。发布前我分别在Open-wrt 12.09和CentOS6.5上测试上传和下载了几个G的文件没有任何问题,可稳定运行。下面就开始说主题吧。 首先说下注意事项,主要是针对之前用过bash版的童鞋 1、Perl版的配置文件与bash版的有区别,新增加了一些配置项,也有减少的,也有些配置项了更合适的名称,请按照配置文件里面的说明对应的设置,并把原来配置文件最下面的device_code,refresh_token,access_token,expires_in,refresh_date这5个参数项复制到新的配置文件中; 2、为了提高性能,Perl版的同步信息数据采用的是二进制存储,不兼容bash版的数据,但我提供了一个转换的命令,设置好配置文件后运行如下命令: syncy.pl convert 运行以上命令后就转换至新的数据格式,但是即使转换了,可能部分有中文名的文件同步过了,系统还会认为没有同步,因为Perl语言支持的UTF8中文需要开启标志位,这就导致在获取路径名的md5码与bash版的不同,要是数据量不是很大,重新上传或下载不需要很长时间,就让它重新上传或下载次,要是数据量很大,基本还都是下载的,可以先把同步类型设置为0或1,待同步完成之后再成你想要的同步方式(此种方式能快?俳⒁淹降奈募畔ⅲ? 3、如同步类型为4-sync,且更了远程同步目录(包括更换绑定用户),请删除本地根目录下的“.syncy.info.db”文件,否则在下次同步时将会删除本地的所有文件(系统会认为远程文件不需要被用户删除,也会删除本地的相应文件)。 下面就说下具体的安排配置方法: 1、检查系统环境。要想这个同步脚本正常运行,系统必须安装libcurl,openssl,perl,以及perl包,在openwrt上所需的perl包名称如下: perl perlbase-essential perlbase-digest perlbase-base perlbase-utf8 perlbase-encode perlbase-xsloader perlbase-bytes perl-www-curl perlbase-file perlbase-dynaloader perlbase-config perlbase-autoloader perl-uri perlbase-text perlbase-unicore 安装以上包需要3M多的空闲空间,如空间空间不足,只有通过u盘来扩展了。如是其它系统,请对应的安装相应的包,在cpan.org网站上可通过perlbase-后面的名称来搜索相应的包并下载源码,各个包还可能依赖别的包,如运行报错,提示缺少包,请根据提示安装相应的包。 2、从我的网盘里下载Perl版程序,下载地址:http://syncyhome.duapp.com/index.php/download/(这个是我部署的一个博客,网盘分享有时无缘无故的被禁了),里面有个使用协议,请仔细阅读下哦。有2个文件是本程序必须的,分别是:syncy.pl和syncy.conf,第一个是同步程序,第二个是配置文件。首先把syncy.pl上传到路由上,建议放到/usr/bin目录里(当然也可放在其他地方),并syncy.pl可执行权限(chmod 755 /usr/bin/syncy.pl);然后用editplus或ultraedit 等工具来编辑syncy.conf文件,按照里面的说明来修相应字段值,修完成后,把syncy.conf传到路由上的/etc/config目录下,当然也可以放到别的目录里,如果放在别的目录里请修syncy.pl第29行的$config_file变量值。 (相比较bash版,减少了个unicodetable.txt文件,Perl语言内部有转码的方法,不再需要此文件了,bash版是因为在openwrt上没有转码的命令才加上这个对照表的。) (已绑定的用户可跳过3、4步) 3、下面开始把SyncY与百度帐号绑定了,先运行命令root@Router:/bin# /usr/bin/syncy.pl,系统会提示打开百度授权网址并输入用户码; 用浏览器打开网址:https://openapi.baidu.com/device,如果没有?锹迹胂鹊锹及俣龋缓螅突岢鱿秩媚闶淙肷璞嘎氲囊趁妫焐痔逑允镜纳璞嘎耄? 输入完成设备码后,点“继续”按钮; 之后进入授权确认的页面,右边的多选框都都选上哦,然后点“授权”按钮完成授权,完成授权后,浏览器显示授权成功的信息; 至此授权完成,我们还需要回来路由器上,按回车键继续完成设备绑定工作。 绑定完设备后就会显示“Get device token success"的信息,并开始同步操作了,如果已经设置了同步文件夹的话。 4、绑定完设备后,先来测试下你的设备上是否能支持中文,执行命令(perl版几乎可以跳过此步): root@Router:/bin# /usr/bin/syncy.pltestchinese /tmp 命令执行完后,系统会在/tmp目录下创建个“中文转码测试”的文件,在终端中显示的会是乱码,不用担心,这不是表示系统不支持中文,你可以通过ftp或网上邻居来看看是不是能正常显示。 5、设置了配置文件中的syncperiod和syncinterval后,同步程序启动后就会一直运行,但每次路由启动后需要手动启动,或通过定时任务启动,下面介绍下在openwrt上如何设置自动启动,其它系统不太了解,请看完此段后百度下具体的设置方法。如果实在没别的办法来实现自动运行,可以设置个后台运行的定时任务,程序会检查是否已经有实例正在运行,有的话后启动的进程会自动退出。 Openwrt实现方法是在/etc/init.d目录下创建个syncy文件并授予可执行权限,文件内容如下: #!/bin/sh /etc/rc.common # Copyright (C) 2006-2011 OpenWrt.org START=99 STOP=10 start() { syncy.pl & #如果不在/usr/bin目录下,也不在其他PATH搜索路径中请写全路径 } stop() { killallsyncy.pl } 保存后运行命令 /etc/init.d/syncy enable restart 这样就可以自动启动了,但现在还没有运行,可运行命令/etc/init.d/syncy start 来启动程序,也可以通过命令/etc/init.d/syncy stop来停止程序,有管理界面的也可以在启动项里来启动或停止同步程序。 最后,希望大家在使用中要是发现了程序哪有什么bug,能通过邮件或空间留言反馈给我,以便及时更正,编写此程序也是出于爱好,Perl语言也是我写此程序时才学习的,难免有错误发生。我是个Perl语言的初学者,有些算法可能不是最优的,如觉得有更好的方法能让程序运行的更快速稳定,也希望各位读者不吝赐教,继续优化程序,造福广大有需要的同学。 转载请注明来源,并保留程序及使用协议的完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值