Linux 特殊权限

本贴最后更新于 182 天前,其中的信息可能已经时移世异

01 Linux 特殊权限

[TOC]

  • **此前我们已经学习过 **<span class="ne-text">r、w、 x</span> 这三种权限,但在査询系统文件时会发现有一些其他权限的字母;

    • 比如:<span class="ne-text">/usr/bin/passwd</span> 文件,属主应该是 <span class="ne-text">x</span> 的权限位出现了 <span class="ne-text">s</span>
    • 比如:<span class="ne-text">/usr/bin/write</span> 文件,属组应该是 <span class="ne-text">x</span> 的权限位出现了 <span class="ne-text">s</span>
    • 比如:<span class="ne-text">/tmp</span> 目录,其他人应该是 <span class="ne-text">x</span> 的权限位出现了 <span class="ne-text">t</span>
  • 我们把这种称为特殊权限,那么特殊权限有什么作用? 或者说能干啥?

1、特殊权限 SUID

1.1 SUID 产生背景

**在 **<span class="ne-text">Linux</span> 系统中,每个普通用户都可以更改自己的密码,这是合理的设置;但是用户的密码信息存储在 <span class="ne-text">/etc/shadow</span> 文件中,也就是说,普通用户在更改自己密码时会更新 <span class="ne-text">/etc/shadow</span> 文件的内容。
<span class="ne-text">/etc/shadow</span> 文件不允许任何人修改?那为什么普通用户可以修改自己的权限呢?

[root@web ~]# ll /etc/shadow
---------- 1 root root 11409 Apr 13 03:26 /etc/shadow

**其实,普通用户可以修改自己的密码在于 **<span class="ne-text">passwd</span> 命令本身,该命令拥有特殊权限 <span class="ne-text">SetUID</span> 也就是在属主的权限位的执行权限上是 <span class="ne-text">s</span> 那如何理解特殊权限 <span class="ne-text">SetUID</span>:当一个执行文件设置 <span class="ne-text">SetUID</span> 后,用户在执行这个文件时将以文件所有者的身份来执行。

**当我们使用普通用户 **<span class="ne-text">oldxu</span> 执行 <span class="ne-text">passwd</span> 命令会发生什么变化?

  • **1、由于 **<span class="ne-text">passwd</span> 命令拥有 <span class="ne-text">suid</span> 特殊权限;(在命令属主权限位有一个 s)
  • **2、所以 **<span class="ne-text">passwd</span> 命令在执行的过程中,会以命令的属主身份运行该命令;(也是 root 身份)

总结:<span class="ne-text">oldxu</span> --> <span class="ne-text">passwd</span>--> 转换为命令属主身份 <span class="ne-text">root</span> 执行 --> 操作 <span class="ne-text">/etc/shadow</span> 信息变更;

1.2 SUID 配置语法

[root@web ~]# chmod u+s /usr/bin/cat
[root@web ~]# chmod 4755 /usr/bin/cat

1.3 SUID 作用总结

  • 1、让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限;
  • **2、如果设置的二进制文件没有执行权限,那么 **<span class="ne-text">suid</span> 的权限显示就是大 <span class="ne-text">S</span>
  • **3、特殊权限 **<span class="ne-text">suid</span> 仅对二进制可执行程序有效,其他文件或目录则无效;
  • **注意: **<span class="ne-text">suid</span> 相对危险,不建议对 <span class="ne-text">vim</span><span class="ne-text">rm</span> 进行 <span class="ne-text">suid</span> 设定操作;

2、特殊权限 SGID

2.1 什么是 SGID

SGID 有两种工能:

  • <span class="ne-text">SGID</span> 设置二进制可执行文件,命令在执行的过程中,会以命令的属组身份运行该命令(效果不大)
  • <span class="ne-text">SGID</span> 设置在目录上**,那么在该目录下新建的文件/目录自动继承父目录的属组**

2.2 SGID 配置语法

[root@web ~]# chmod g+s /dir
[root@web ~]# chmod 2755 /dir

2.3 SGID 场景说明

**需求描述:系统有两个用户,分别为 **<span class="ne-text">ex1</span><span class="ne-text">ex2</span>,这两个用户都拥有 <span class="ne-text">example</span> 附加组;

  • **1、这两个用户需要共同拥有 **<span class="ne-text">/data/code</span> 目录的开发权(读写执行权限);
  • 2、互相之间能修改彼此的文件,但该目录不允许其他人进入查阅;
[root@web ~]# groupadd example
[root@web ~]# useradd ex1 -G example
[root@web ~]# useradd ex2 -G example

[root@web ~]# mkdir /data/code
[root@web ~]# chgrp example /data/code/
[root@web ~]# chmod 770 /data/code/
[root@web ~]# chmod 2770 /data/code/

需要给创建的文件添加664权限:
或者
umask 0002

3、特殊权限 SBIT

3.1 什么是 SBIT

**一旦目录被赋予了粘滞位 **<span class="ne-text">Sticky(SI TI KI)</span> 除了 <span class="ne-text">root</span> 可以删除目录中的所有文件,普通用户对该目录就算拥有 <span class="ne-text">w</span> 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。

3.2 SBIT 配置示例

**需求:默认情况下 **<span class="ne-text">/mnt</span> 不是粘滞位,如何将此目录设置为粘滞位;

[root@web ~]# chmod 1755  /tmp
[root@web ~]# chmod o+t /tmp

3.3 SBIT 使用场景

**当我们初始化 **<span class="ne-text">MySQL</span> 服务时,服务会创建一些临时文件存储至 <span class="ne-text">/tmp</span> 目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么初始化 <span class="ne-text">MySQL</span> 就会报错)

案例:通过 <span class="ne-text">Shell</span> 脚本模拟对应的场景

  • **1、模拟 **<span class="ne-text">MySQL</span> 初始化创建文件至 <span class="ne-text">/tmp</span> 目录;
  • **2、模拟普通用户登陆系统删除 **<span class="ne-text">MySQL</span> 的初始化文件;
  • **3、如果普通用户删除成功,则初始化失败 (因为 **<span class="ne-text">MySQL</span> 服务创建的文件,需要自行销毁)
  • **4、如果普通用户删除失败,则 **<span class="ne-text">MySQL</span> 服务尝试删除,删除成功,则初始化成功;

<span class="ne-text">Shell</span> 脚本如下

# 脚本如下
[root@web ~]# cat myql_init.sh
#!/urs/bin/bash

mysql_tmp_file=/tmp/mysql.init
User=oldxu

# 1.初始化MySQL服务
touch ${mysql_tmp_file}

# 2.模拟用户删除文件
useradd oldxu
su - ${User} -c "rm -f ${mysql_tmp_file} &>/dev/null"

# 3.检查是否删除成功
if [ $? -eq 0 ];then
	echo "${mysql_tmp_file} 文件被 ${User} 用户删除成功, 该目录不是sbit,mysql初始化失败"
else
	echo "${mysql_tmp_file} 文件被 ${User} 用户删除失败, 该目录是sbit,mysql初始化成功"
fi

结果测试与验证

# 默认粘滞位测试
[root@web ~]# sh myql_init.sh
/tmp/mysql.init 文件被 oldxu 用户删除失败, 该目录是sbit,mysql初始化成功

# 修改为普通目录测试
[root@web ~]# chmod 777 /tmp/
[root@web ~]# sh myql_init.sh
/tmp/mysql.init 文件被 oldxu 用户删除成功, 该目录不是sbit,mysql初始化失败

3.4 SBIT 作用总结

  • 1、让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删自己的文件;
  • **2、粘滞位目录表现在 **<span class="ne-text">others</span><span class="ne-text">x</span> 位,用 <span class="ne-text">t</span> 表示,如果没有执行权限则显示为 <span class="ne-text">T</span>
  • **3、粘滞位目录的属主以及 **<span class="ne-text">root</span> 用户有权限删除目录中的内容,其他用户无权限删除;

4、文件特殊属性

4.1 什么是特殊属性

**这类文件属性凌驾于 **<span class="ne-text">rwx</span> 基础权限之上,是一种高级属性。

4.2 特殊属性的作用

  • **1、创建一个文件,不允许被修改、移动、删除,包括 **<span class="ne-text">root</span> 也不行。适合 <span class="ne-text">/etc/passwd</span>
  • **2、创建一个文件,仅允许往文件里面追加数据,不允许修改、移动、删除。适合 **<span class="ne-text">sudo</span> 审计日志;

5.3 特殊属性如何配置

<span class="ne-text">Linux</span> 系统通过 <span class="ne-text">chattr</span> 来实现特殊属性的配置
命令格式:<span class="ne-text">chattr [+-=] [选项] 文件或目录名</span>

  • <span class="ne-text">a</span>:可对文件进行追加内容;
  • <span class="ne-text">i</span>:锁定文件,不允许其他操作;

**1、配置 **<span class="ne-text">/etc/passwd</span> 文件,不能改,不能追加,不能删除。

#1.赋予i权限
[root@web ~]# chattr  +i /etc/passwd

#2.验证权限
[root@web ~]# rm -f /etc/passwd
rm: cannot remove '/etc/passwd': Operation not permitted

**2、配置 **<span class="ne-text">/var/log/secure</span> 文件,只能追加写入日志,不允许手动修改,也不允许删除。

#1.赋予 a 权限
[root@web ~]# chattr +a /var/log/secure
[root@web ~]# lsattr /var/log/secure
-----a---------- /var/log/secure

#2.测试追加数据
[root@web ~]# echo "test" >> /var/log/secure
[root@web ~]# echo "test" >> /var/log/secure

#3.不能删除,不能修改
[root@oldboy tmp]# rm -f /var/log/secure
rm: cannot remove '/var/log/secure': Operation not permitted

**3、取消特殊属性,需要使用 **<span class="ne-text">root</span> 身份。

[root@web ~]# chattr -i /etc/passwd
[root@web ~]# chattr -a /var/log/secure

5.4 特殊属性场景示例

**模拟病毒串改站点,然后使用 **<span class="ne-text">chattr</span> 锁住文件,让病毒程序无法串改,然后追踪并杀死病毒程序;

  • 1、安装并启动 http 服务;
  • 2、模拟病毒脚本篡改网页内容;
  • 3、锁定篡改文件,然后找出病毒,将其杀死;

**1、安装 **<span class="ne-text">http</span> 服务,然后启动对外

[root@web ~]# setenforce 0
[root@web ~]# systemctl stop firewalld
[root@web ~]# systemctl disable firewalld
[root@web ~]# yum install httpd -y
[root@web ~]# systemctl start httpd

2、编写病毒脚本,尝试篡改网页内容

[root@web ~]# cat /usr/bin/virus
#!/usr/bin/bash
web_site=/var/www/html/index.html


while true
do
  # 1.模拟入侵
	echo "我是病毒的Code" > ${web_site}
	sleep 10

	# 2.将这个脚本放入定时任务中
	echo "*/1 * * * * /bin/bash -x /usr/bin/virus  &>/tmp/virus.log" > /var/spool/cron/root

	# 3.将脚本锁住
	chattr +i /usr/bin/virus
done

3、锁定篡改文件,然后杀死病毒

[root@web ~]# > /var/spool/cron/root
[root@web ~]# chatttr +i /var/spool/cron/root
[root@web ~]# echo "Hello Web Server" /var/www/html/index.html
[root@web ~]# chatttr +i /var/www/html/index.html
[root@web ~]# kill $(ps -ef | grep virus | grep -v grep | awk '{print $2}')

5、文件默认权限

5.1 什么是默认权限

默认权限:指用户在创建文件或目录时,默认分配给文件或目录的访问权限;

5.2 默认权限的由来

  • 背景

    • 1.用户创建一个文件的默认访问权限为:<span class="ne-text">rw-rw-rw-</span> (八进制值 666)
    • 2.用户创建一个目录的默认访问权限为:<span class="ne-text">rwxrwxrwx</span> (八进制值 777)
    • **3.但最终创建出来的文件权限是 **<span class="ne-text">644</span> 目录是 <span class="ne-text">755</span>,为什么目录不是 <span class="ne-text">777</span>,文件不是 <span class="ne-text">666</span>?
  • **分析: **

    • **1.因为系统创建文件或目录受 **<span class="ne-text">UMASK</span> 控制,比如 <span class="ne-text">UMASK</span> 设置为:<span class="ne-text">022</span>
    • **2.那么创建出来的文件权限是 **<span class="ne-text">644</span>,目录是 <span class="ne-text">755</span>
    • 3.目录:<span class="ne-text">777 - 022 = 755</span> 最终创建出来的目录权限;
    • 4.文件:<span class="ne-text">666 - 022 = 644</span> 最终创建出来的文件权限;
  • **结论: **

    • <span class="ne-text">UMASK</span> 表示要减掉的权限;

5.3 系统默认权限配置文件

**为什么默认 **<span class="ne-text">root</span> 用户的 <span class="ne-text">UMASK</span><span class="ne-text">022</span>,在系统哪个配置文件有设定呢;

  • **1、当用户登陆系统时,会加载 **<span class="ne-text">/etc/profile</span> 环境变量文件;
  • **2、在该配置文件中有一条 **<span class="ne-text">UMASK</span> 的判断语句;
  • **3、如果用户 **<span class="ne-text">UID</span> 小于 <span class="ne-text">199</span> 那么就将 <span class="ne-text">UMASK</span> 初始化为 <span class="ne-text">022</span>
  • **4、如果用户 **<span class="ne-text">UID</span> 大于 <span class="ne-text">199</span> 并且组名称和用户名称一致,那么就将 <span class="ne-text">UMASK</span> 初始化为 <span class="ne-text">002</span>

CentOS7 系统的 UMASK 判断语句如下:

[root@web ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

Rocky Linux 9 中使用 useradd 命令创建一个用户时,这个用户的默认 umask 通常会被设置为 0022

[root@web ~]# cat /etc/login.defs
UMASK           022

5.4 默认权限的计算公式

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 
7 7 7  -  0 2 2 =  7 5 5


#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1  + 1   = 622
7 7 7  -   0 4 5 = 7 3 2
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为 777 - 044 = 733
# touch f044   文件权限为 666 - 044 = 622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为777 - 023 = 754
# touch f023   文件权限为666 - 023 = 643 + 001 = 644

#umask部分位为奇数时
# umask 032
# mkdir d032   目录权限为777 - 032 = 745
# touch f032   文件权限为666 - 032 = 634 + 010 = 644


#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为777 - 035 = 742
# touch f035   文件权限为666 - 035 = 631 + 011  = 642

6、构建 YUM 仓库实践

6.1 搭建本地 yum 仓库

很多时候刚安装的 linux 系统不能联网,但需要安装相应环境的软件包。这时候我们就可以利用光盘制作一个本地 yum 仓库。

1.挂载镜像

[root@oldxu ~]# mount /dev/cdrom /mnt

2.备份原有仓库

[root@oldxu ~]# gzip /etc/yum.repos.d/*

**3.使用 **<span class="ne-text">yum-config-manager</span> 命令可快速添加一个本地仓库

[root@oldxu ~]# yum install yum-utils -y
[root@oldxu ~]# yum-config-manager --add-repo="file:///mnt/AppStream"
[root@oldxu ~]# yum-config-manager --add-repo="file:///mnt/BaseOS"

**4.当然我们也可以直接去编辑一个 **<span class="ne-text">.repo</span> 文件,将仓库信息存储至该文件

[root@oldxu ~]# vim /etc/yum.repos.d/cdrom.repo  
# 仓库名称
[cdrom-AppStream]
# 仓库描述信息
name=This is local cdrom
# 仓库url地址 ,可以是file:// ftp:// http:// 等协议
baseurl=file:///mnt/AppStream
# 是否使用该YUM源(0代表禁用, 1代表激活)
enabled=1
# 是否验证软件签名(0代表禁用, 1代表激活)
gpgcheck=0


# 仓库名称
[cdrom-BaseOS]
name=This is local cdrom
baseurl=file:///mnt/BaseOS/
enabled=1
gpgcheck=0

**5.生成缓存信息、然后使用 **<span class="ne-text">dnf/yum</span> 安装软件测试

[root@oldxu ~]# yum makecache
[root@oldxu ~]# yum install vsftpd -y

6.2 搭建企业 yum 仓库

**很多时候不仅仅是一台机器无法上网,而是很多机器都无法上网,但都有联网下载软件的需求,这个时候难道每台机器都挂在光盘吗,当然可以,但如果软件出现了更新又该怎么办。所以我们需要构建一个企业级的 **<span class="ne-text">yum</span> 仓库,为多台客户端提供服务。

  • ** 本地光盘提供基础软件包: **<span class="ne-text">Base</span>
  • ** yum 缓存提供常用软件包: **<span class="ne-text">nginx、zabbix、docker</span>

6.2.1 环境准备

系统 IP 角色
RockyLinux9 10.0.0.100 yum 仓库服务端
RockyLinux9 10.0.0.99 yum 仓库客户端

6.2.2 服务端操作

**1.关闭 **<span class="ne-text">iptables</span> 防火墙、与 <span class="ne-text">selinux</span>

[root@yum_server ~]# systemctl stop firewalld
[root@yum_server ~]# setenforce 0

**2.安装 **<span class="ne-text">ftp</span> 服务,配置允许匿名用户访问,而后启动服务。

[root@yum_server ~]# yum -y install vsftpd
[root@yum_server ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES		# 允许匿名用户登录

[root@yum_server ~]# systemctl start vsftpd

**3.首先提供基础 **<span class="ne-text">base</span> 软件包

[root@yum_server ~]# mount /dev/cdrom /mnt

[root@yum_server ~]# mkdir -p /var/ftp/rockylinux9
[root@yum_server ~]# cp -rp /mnt/AppStream/Packages/* /var/ftp/rockylinux9/
[root@yum_server ~]# cp -rp /mnt/BaseOS/Packages/* /var/ftp/rockylinux9/

**4.提供第三方源的 **<span class="ne-text">rpm</span> 软件包,通过脚本下载方式实现;

[root@yum_server ~]#  cat wget_rpm_scripts.sh
#!/usr/bin/bash

get_zabbix_rpm_url=https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/9/x86_64/
rpm_name=$(curl -s ${get_zabbix_rpm_url} | grep "rpm" | awk -F '"' '{print $4}')
rpm_dir=/var/ftp/zabbix

for name in ${rpm_name}
do
	if [ ! -d ${rpm_dir} ];then
		mkdir -p ${rpm_dir}
	fi
	wget -O ${rpm_dir}/${name}  ${get_zabbix_rpm_url}${name}
done

**5.提供第三方源的 **<span class="ne-text">rpm</span> 软件包,采用 <span class="ne-text">Rsync</span> 同步科大源方式实现,后期结合定时任务,定点同步互联网最新软件包;

# 同步jenkins
[root@yum_server ~]# mkdir -p /var/ftp/jenkins
[root@yum_server ~]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/jenkins/redhat/ /var/ftp/jenkins

#同步nginx
[root@yum_server ~]# mkdir -p /var/ftp/nginx
[root@yum_server ~]# rsync -avz  rsync://rsync.mirrors.ustc.edu.cn/nginx/ /var/ftp/nginx

# 仅同步nginx目录中,rhel/9/x86_64/RPMS/的所有文件
[root@yum_server ~]# rsync -avz  rsync://rsync.mirrors.ustc.edu.cn/nginx/rhel/9/x86_64/RPMS/ /var/ftp/nginx/

6.将软件包目录创建为 <span class="ne-text">yum</span> 仓库,需要使用 <span class="ne-text">createrepo</span> 或者是 <span class="ne-text">createrepo_c(更快,占用内存更少)</span>

[root@yum_server ~]# yum -y install createrepo
[root@yum_server ~]# createrepo_c /var/ftp/rockylinux9
[root@yum_server ~]# createrepo_c /var/ftp/jenkins
[root@yum_server ~]# createrepo_c /var/ftp/nginx

#PS: 如果此仓库每次新增软件则需要重新生成一次

6.2.3 客户端操作

**所有客户端仅需将 **<span class="ne-text">yum</span> 源指向本地服务端,即可使用本地服务器提供的软件包。

**1.客户端配置并使用 **<span class="ne-text">base</span> 基础源

[root@yum_client ~]# gzip /etc/yum.repos.d/*
[root@yum_client ~]# vim /etc/yum.repos.d/system.repo
[Rockylinux]
name=local ftpserver
baseurl=ftp://10.0.0.100/rockylinux9
gpgcheck=0

**2.客户端配置并使用 **<span class="ne-text">nginx、jenkins、zabbix</span> 等源

[root@yum_client ~]# vim /etc/yum.repos.d/ops.repo 
[nginx]
name=local ftpserver
baseurl=ftp://10.0.0.100/nginx
gpgcheck=0

[zabbix]
name=local ftpserver
baseurl=ftp://10.0.0.100/zabbix
gpgcheck=0

[jenkins]
name=local ftpserver
baseurl=ftp://10.0.0.100/jenkins
gpgcheck=0

6.2.4 修改协议为 http

1、安装一个 nginx

[root@node01 ~]# yum install nginx -y

2、配置站点,将网站的路径指向到 <span class="ne-text">/var/ftp</span>,同时开启目录索引功能

[root@node01 ~]# vim /etc/nginx/nginx.conf
    server {
        listen       80;
        server_name  mirror.oldxu.net;
        root         /var/ftp;

        location / {
                autoindex on;
                autoindex_exact_size off;
        }
    }

3、启动服务(确保 80 端口没有被占用)

[root@node01 ~]# nginx -t
[root@node01 ~]# systemctl start nginx


[root@node01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      691/sshd: /usr/sbin 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      24976/nginx: master

4、修改客户端的协议,将 ftp 协议修改为 http 协议

[root@node02 ~]# cat /etc/yum.repos.d/ftp.repo 
[http-nginx]
name = "http-nginx"
baseurl = http://10.0.0.99/nginx
enabled = 1
gpgcheck = 0

[http-zabbix]
name = "http-zabbix"
baseurl = http://10.0.0.99/zabbix
enabled = 1
gpgcheck = 0

[http-jenkins]
name = "http-jenkins"
baseurl = http://10.0.0.99/jenkins
enabled = 1
gpgcheck = 0

[http-rockylinux]
name = "http-rockylinux"
baseurl = http://10.0.0.99/rockylinux9
enabled = 1
gpgcheck = 0


[root@node02 ~]# yum clean all
[root@node02 ~]# yum makecache

5、客户端测试

[root@node02 ~]# yum install mysql

7、源码包管理实践

7.1 什么是源码包

源码包指的是开发编写好的程序源代码,但并没有将其编译为一个能正常使用的二进制工具。

7.2 为何需要源码包

  • ** 1.部分软件官网仅提供源码包,需要自行编译并安装。 **
  • ** 2.部分软件在新版本有一些特性还没来得及制作成 **<span class="ne-text">rpm</span> 包时,可以自行编译软件使用其新特性。

7.3 源码包的优缺点

  • ** 优点: **

    • 1、可以自行修改源代码,需要会 C
    • **2、可以定制需要的相关功能 **<span class="ne-text">vim ./src/core/nginx.h</span>
    • 3、新版软件优先更新源码
  • ** 缺点: **

    • **1、相对 **<span class="ne-text">rpm</span> 安装软件的方式会复杂很多。
    • 2、标准化实施困难,自动化就无法落地。

7.4 源码包如何获取

  • ** 常见的软件包都可以在官网获取源码包,比如 **<span class="ne-text">apache、nginx、mysql</span>
    • <span class="ne-text">nginx</span> 源码包地址:<span class="ne-text">http://nginx.org/en/download.html</span>
    • <span class="ne-text">httpd</span> 源码包地址:<span class="ne-text">http://httpd.apache.org/download.cgi</span>
    • <span class="ne-text">zabbix</span> 源码包地址:<span class="ne-text">https://www.zabbix.com/cn/download</span>

7.5 源码包如何安装

将源码包编译为二进制可执行文件的主要步骤,有如下三步:

  • **步骤 0:tar 解包,解压并释放源代码至指定的目录 **
  • 步骤 1:./configure 配置,设置安装目录、安装模块等选项、生成 Makefile 清单文件
  • 步骤 2:make 编译,按照 makefile 清单文件,编译为可执行的二进制文件
  • 步骤 3:make install,将编译后的二进制文件拷贝至对应的安装目录下

PS: 此方法不是百分百通用于所有源码包,建议拿到源码包解压后,进入到目录找相关的 README 帮助文档

7.6 Nginx 源码包编译

**下面通过编译 **<span class="ne-text">Nginx</span> 软件来深入了解下源码包编译的过程。

1.基础环境准备

[root@Server ~]# yum install -y gcc make wget

**2.下载 **<span class="ne-text">nginx</span> 源码包

[root@Server ~]# wget https://nginx.org/download/nginx-1.25.4.tar.gz

**3.解压 **<span class="ne-text">nginx</span> 源码包,并进入相应目录

[root@Server ~]# tar xf nginx-1.25.4.tar.gz
[root@Server ~]# cd nginx-11.25.4

**4.配置相关的选项,并生成 **<span class="ne-text">Makefile</span>

[root@Server nginx-1.25.4]# ./configure --prefix=/opt/nginx-1.25.4

**5.根据 **<span class="ne-text">Makefile</span> 文件,将软件编译为可执行的二进制程序

[root@Server nginx-1.25.4]# make

6.将编译好的二进制文件拷贝至对应的目录

[root@Server nginx-1.25.4]# make install

源码编译报错信息处理

checking for C compiler ... not found ./configure: error: C compiler cc is not found 
# yum -y install gcc gcc-c++ make


./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
# yum install -y pcre-devel


./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-
http_gzip_module option, or install the zlib library into the
system, or build the zlib library statically from the source with
nginx by using --with-zlib=<path> option. 
# yum -y install zlib-devel


./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL 
library into the system, or build the OpenSSL library statically
from the source with nginx by using --with-openssl=<path> option.
# yum -y install openssl-devel

8.扩展

一个用户最大可用打开多少文件夹参考

在Linux系统中,/etc/security/limits.conf是一个配置文件,用于定义系统中用户或组的资源限制。这个文件允许管理员设置各种限制,包括但不限于:

进程数量:限制用户可以拥有的进程数量。
文件大小:限制单个文件的最大大小。
内存使用:限制用户可以使用的内存量。
CPU时间:限制用户可以使用的CPU时间。
这个文件通常包含以下格式的行:

<domain>        <type>  <item>  <value>
<domain> 可以是 *(代表所有用户和组)、用户名、%组名(代表组中的所有用户)。
<type> 可以是 soft 或 hard,分别表示软限制和硬限制。软限制是默认的,可以被用户自行提高,而硬限制则需要管理员权限才能提高。
<item> 是具体的资源,如 nofile(文件描述符数量)、nproc(进程数量)、as(地址空间大小,通常以KB为单位)等。
<value> 是分配给该资源的限制值。
例如,以下行表示为所有用户设置文件描述符数量的软限制为1024:

*               soft    nofile  1024
执行cat /etc/security/limits.conf命令会显示这个文件的内容,从而可以查看或编辑系统中的资源限制。这些限制对于系统的性能和安全性非常重要,因为它们可以防止单个用户或进程占用过多资源,从而影响系统的稳定运行和其他用户的使用。
[root@web01 ~]# grep "nofile" -A 5 /etc/security/limits.conf
#        - nofile - max number of open file descriptors
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
--
* - nofile 65535
*       soft    nofile  100000
*       hard    nofile  100000
系统级的最大限制:
  cat /proc/sys/fs/file-max

用户级的最大限制
  ulimit -n(默认是1024,向阿里云华为云这种云主机一般是65535)

如果要切割文件比如数据库文件应该怎么切割

确定分割大小:首先,你需要确定每个小文件的大小。例如,如果你有一个10GB的数据库文件,你想将其分割成10个等大的文件,那么每个文件的大小将是1GB。

使用split命令:使用split命令并指定-b选项来设定每个分割文件的大小。假设每个小文件的大小为1GB(1G),可以这样操作:

split -b 1G largefile.db smallfile.db
这条命令会生成smallfile.dbaa, smallfile.dbab, ... 等以smallfile.db为前缀的一系列文件。

使用数字后缀:如果你希望文件名后缀是数字而不是默认的字母,可以使用-d选项。
split -b 1G -d largefile.db smallfile.db
这将生成smallfile.db0, smallfile.db1, ... 等文件。

指定后缀长度:使用-a选项可以指定后缀的长度。例如,如果你想要3位数字的后缀,可以这样做:
split -b 1G -d -a 3 largefile.db smallfile.db
这将生成smallfile.db000, smallfile.db001, ... 等文件。

一次性分割:如果你在压缩数据库文件的同时就想分割它,可以将tar命令和split命令结合起来使用管道:
tar -czvf - largefile.db | split -b 1G -d -a 3 smallfile.db
这个命令会先将largefile.db压缩,然后分割压缩后的文件。

解压分割后的文件:当你需要将分割后的文件重新组合时,可以使用以下命令:
cat smallfile.db* | tar -xzvf -
请注意,分割数据库文件可能会对数据库的完整性造成影响,因为数据库文件通常包含连续的数据结构。如果数据库文件被分割,可能需要特殊的处理才能正确地合并它们。确保在分割前备份原始文件,并了解你的数据库系统是否支持这种操作。

数据库字符编码

数据库中的字符编码是指数据库存储和处理文本数据时使用的字符集和编码规则。选择合适的字符编码对于确保数据的准确性、一致性和可移植性至关重要。以下是一些常用的数据库字符编码:

UTF-8:这是一种变长的字符编码,能够表示Unicode标准中的任何字符。UTF-8因其广泛的兼容性和对西欧字符的高效存储而成为互联网和许多数据库系统的首选编码。

Latin1 (ISO 8859-1):这是西欧语言的8位字符编码,包括英语、法语、德语、西班牙语等。它曾经在MySQL等数据库系统中非常流行,但随着国际化的需求增加,UTF-8逐渐取代了它的地位。

GBK:这是中国的汉字编码标准,兼容GB2312,并扩展了更多汉字和符号。GBK使用双字节来表示字符,常用于中文Windows操作系统和一些数据库系统中。

Big5:这是台湾和香港使用的繁体中文字符编码标准,同样使用双字节表示字符。

Shift_JIS:这是日本的字符编码标准,用于表示日文字符。

EUC-KR:这是韩国的字符编码标准,用于表示韩文字符。

TIS-620:这是泰国的字符编码标准。

Windows-1252:这是Windows系统中使用的西欧语言字符集,是ISO 8859-1的一个超集。

ASCII:这是最基本的字符编码标准,仅包含128个字符,主要包含英文字符和一些控制字符。

数据库系统如MySQL、PostgreSQL、Oracle和SQL Server等都允许用户选择字符集和编码。在创建数据库或表时,可以指定默认的字符集和编码。对于国际化的应用程序,推荐使用UTF-8编码,因为它支持全世界大多数语言的字符,有助于避免编码转换的问题。

在选择字符编码时,还需要考虑排序规则(collation),它定义了字符如何比较和排序。不同的字符编码可能对应有不同的排序规则,这在进行字符串比较和排序操作时非常重要。

在实际应用中,应根据应用程序的语言需求和国际化程度来选择最合适的字符编码。

nohup 和&的区别和用法

nohup 和 & 都是用于在 Unix 和类 Unix 系统中让程序在后台运行的命令,但它们之间有一些关键的区别:

定义和用途:

nohup 是一个命令行工具,它允许用户运行一个命令,即使用户注销或关闭终端,该命令也会继续运行。nohup 的名称来源于 "no hang up"(不挂起)。
& 是 shell 的一个内置功能,它将命令放在后台执行,但默认情况下,如果用户注销或关闭终端,后台运行的命令会收到 SIGHUP(挂起信号)并终止。
信号处理:

使用 nohup 运行的命令会忽略 SIGINT(中断信号)和 SIGTERM(终止信号),但默认情况下会响应 SIGHUP(挂起信号)。然而,nohup 可以防止命令因用户注销而收到 SIGHUP。
使用 & 运行的命令,如果用户注销,会收到 SIGHUP 并默认终止。如果想要避免这种情况,需要结合 nohup 使用。
输出重定向:

nohup 默认情况下会将命令的标准输出和标准错误重定向到一个名为 nohup.out 的文件中,如果 nohup.out 文件已存在,输出会被追加到该文件中。
使用 & 运行的命令,如果不手动重定向输出,那么输出会直接显示在终端上,如果终端关闭,输出也就丢失了。
使用示例:

使用 nohup:
nohup command > output.log 2>&1 &
这个命令会忽略挂起信号,并将命令的标准输出和标准错误重定向到 output.log 文件中。
使用 &:
command > output.log 2>&1 &
这个命令将命令放在后台执行,并将标准输出和标准错误重定向到 output.log 文件中。但是,如果用户注销,命令可能会终止。
结合使用:
有时候,为了确保命令在后台稳定运行,并且不因用户注销而终止,会将两者结合使用:

nohup command > output.log 2>&1 &
这样,即使用户注销,命令也会继续运行,并且输出会被重定向到文件中。

总结来说,nohup 提供了一种让命令忽略挂起信号并在后台稳定运行的方法,而 & 只是简单地将命令放到后台运行。在需要确保命令持续运行且不丢失输出的情况下,通常会选择使用 nohup 或将两者结合使用。
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...