centos6 | centos7 | |
---|---|---|
启动服务 | service <服务名> start | systemctl start <服务名> |
关闭服务 | service <服务名> stop | systemctl stop <服务名> |
开机启动服务 | chkconfig <服务名> on | systemctl enable <服务名> |
开机不启动服务 | chkconfig <服务名> off | systemctl disable <服务名> |
重启服务 | service <服务名> restart | systemctl restart <服务名> |
首先打开配置文件/etc/pam.d/system-auth
,我们会发现这个文件大致分成四列四部分内容。
[root@master ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
其中第一列包括 auth、account、password、session四个模块。
参数 | 释义 |
---|---|
auth | 用来识别用户身份,比如提示用户输入密码,判断用户是否为root等 |
account | 检测账户是否允许访问。比如是否允许登录,是否达到最大用户数,root用户是否允许在这个终端登录等 |
password | 进行用户信息更新,一般指修改用户密码 |
session | 用来配置和管理用户会话,定义用户登陆前与退出后的操作 |
第二列包含 required requisite suffifient optinal 四个参数。
参数 | 释义 |
---|---|
required | 该模块失败后,也会执行完其余的模块,最后才会返回错误信息 |
requisite | 该模块必须success才能使认证继续进行,失败后直接返回错误信息,不执行后面的模块 |
sufficient | 如果失败则忽略;如果成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块 |
optional | 忽略结果,不管成功或者失败 |
include | 与处理结果无关,直接引用其他PAM模块的配置参数 |
具体使用的类以及参数设置。
1)密码过期,要求强制修改密码,且必须满足密码的复杂度。
此处使用 pam_cracklib.so
这个类。
password required pam_cracklib.so enforce_for_root retry=a ...
下面是我们常用的参数以及含义解释。
参数 | 含义 |
---|---|
enforce_for_root | 即使是root用户,也必须符合复杂度条件 |
retry=a | 提示a次用户密码错误输入 |
minlen=b | 密码长度不小于b个字符 |
ucredit=c | 至少有c个大写字母 |
lcredit=d | 至少有d个大写字母 |
dcredit=e | 至少有e个数字 |
ocredit=f | 至少有f个其他特殊字符 |
difok=g | 新密码中至少有g个字符和旧密码不同 |
上面的cdef数字是小于0的数字时,表示要求最少需要几个。
当cdef数字是大于0的数字时,表示要求最多有几个。
比如lcredit=-3
,表示最少要有3个小写字母。
比如dcredit=2
,表示最多只能有2个数字。
下面是其他一些常用的类以及对应的模块。
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_unix.so | auth | 提示用户输入密码,并与/etc/shadow对比,匹配则返回0 |
pam_unix.so | account | 检查用户账号信息,账号可用,返回0 |
pam_unix.so | password | 修改用户的密码,并将其更新到/etc/shadow文件中 |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_shells.so | auth | 如果用户想登陆系统,它的shell必须是 /etc/shells文件中的shell |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_deny.so | auth | 用于拒绝访问 |
pam_deny.so | account | 用于拒绝访问 |
pam_deny.so | password | 用于拒绝访问 |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_permit.so | auth | 模块任何时候都返回成功 |
pam_permit.so | account | 模块任何时候都返回成功 |
pam_permit.so | password | 模块任何时候都返回成功 |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_securetty.so | auth | 当用户以root登录时,登陆的tty 必须在 /etc/securetty 中 |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_listfile.so | auth | 访问应用程序的控制开关 |
pam_listfile.so | account | 访问应用程序的控制开关 |
pam_listfile.so | password | 访问应用程序的控制开关 |
pam_listfile.so | session | 访问应用程序的控制开关 |
类 | 类可用的模块 | 含义说明 |
---|---|---|
pam_limits.so | session | 定义使用系统资源的上限,包括root用户。可以通过 /etc/security/limits.conf 设置 |
文件 | 作用 |
---|---|
/etc/passwd | 存放用户信息 |
/etc/shadow | 存放用户密码 |
/etc/group | 存放用户组信息 |
/etc/gshadow | 存放/etc/group的加密信息 |
首先解释 /etc/passwd 文件下的各列信息含义
[oldboy@master ~]$ sudo tail -5 /etc/passwd
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
列数 | 名称 | 含义 |
---|---|---|
1 | username | UID到名称的一种映射 |
2 | password | 以前是存放密码的位置,现在存放在/etc/shadow |
3 | UID | 用户ID,最基本的级别标识用户的编号 |
4 | GID | 用户主要组的ID编号 |
5 | GECOS | 任意文本,一般是用户的姓名 |
6 | /home/dir | 用户个人数据和配置文件的存放目录 |
7 | shell | 用户登录时运行的程序,一般提供命令提示符 |
其次是 /etc/shadow 文件中各列信息的含义。
[oldboy@master ~]$ sudo tail -5 /etc/shadow
[sudo] password for oldboy:
avahi:!!:19323::::::
postfix:!!:19323::::::
ntp:!!:19323::::::
tcpdump:!!:19323::::::
oldboy:$6$pO.iG1Bl3a8RS/k5$DSHXmE7Klnsnn4ys7KVWolPAlCrgJi1rM/sAigFA.e4JurEdfpp65k6gsuyxMIj/aDXlUsmXcphCRAbeOUCqo0:19323:0:99999:7:::
列数 | 名称 | 含义 |
---|---|---|
1 | name | 系统的有效账户名 |
2 | password | 已加密的密码;如果是感叹号,表示密码已经被锁定 |
3 | lastchange | 最近一次更改密码的日期,表示为距离1970年1月1日的天数 |
4 | minage | 可以更改密码前的最短天数,0则表示“无最短期限要求” |
5 | maxage | 必须更改密码前的最多天数 |
6 | warning | 密码即将到期的警告期 |
7 | inactive | 账户在密码到期后保持活跃的天数,此时账户仍可登录和修改密码;天数过后,账户锁定 |
8 | expire | 账户到期日期,表示为距离1970年1月1日的天数 |
9 | blank | 空白字段,供未来使用 |
passwd 用户名
使用chage
命令设置密码过期策略。
首先创建一个用户tom
[root@master ~]# useradd tom
[root@master ~]# id tom
uid=1001(tom) gid=1001(tom) groups=1001(tom)
然后给用户添加密码为123456
[root@master ~]# passwd tom
Changing password for user tom.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
此时查看tom的密码过期策略
[root@master ~]# chage -l tom
Last password change : Dec 12, 2022
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
首先设置tom在下一次登陆时,强制修改密码
[root@master ~]# chage -d 0 tom
接着设置用户将在180天后过期
[root@master ~]# date -d "+180 days"
Sat Jun 10 14:50:18 CST 2023
[root@master ~]# chage -E 2023-06-10 tom
再设置,包括tom在内的所有用户必须最多30天,要修改一次密码
[root@master ~]# cat /etc/login.defs|grep '^PASS_MAX'
PASS_MAX_DAYS 30
最后,突然反悔,希望仅设置tom用户最迟每10天修改一次密码
并将对tom用户的密码策略修改内容进行打印。
[root@master ~]# chage -M 10 tom
[root@master ~]# chage -l tom
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : Jun 10, 2023
Minimum number of days between password change : 0
Maximum number of days between password change : 10
Number of days of warning before password expires : 7
主机名master:10.0.0.10 文件传输方
主机名node1: 10.0.0.11 文件接收方
说明:
scp与sftp作为运行SSH服务的远程系统来回传输文件的安全方式,是将远程文件进行复制到另一个系统。在使用scp与sftp之前,需要能够完成ssh远程连接。
rsync命令则用来同步不同系统的文件。它与scp的区别在于,如果两个系统的文件或目录有差异,rsync只复制差异部分,而scp则复制全部内容。
可以直接查看sshd的端口22是否被监听
[root@master .ssh]# netstat -lntup|grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6940/sshd
tcp6 0 0 :::22 :::* LISTEN 6940/sshd
也可以使用systemctl
命令检查sshd服务的启动状态
[root@master .ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-12-10 00:03:13 CST; 3 days ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 6940 (sshd)
Tasks: 1
CGroup: /system.slice/sshd.service
└─6940 /usr/sbin/sshd -D
使用scp 本地文件 远程主机IP:文件路径
格式来将本地文件复制到远端。
输入命令后,要求提供远程主机root账号的密码,正确输入密码后文件传输成功。
[root@master .ssh]# scp /etc/hosts 10.0.0.11:/tmp
The authenticity of host '10.0.0.11 (10.0.0.11)' can't be established.
ECDSA key fingerprint is SHA256:XcbgLkoJin+3R2uL/9R8sxuELxjYJOQOABBFodvwug0.
ECDSA key fingerprint is MD5:ee:69:ca:49:b0:6a:78:68:ea:15:3a:7d:d9:a3:a1:1f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.11' (ECDSA) to the list of known hosts.
[email protected]'s password:
hosts
此时我们检查10.0.0.11的主机,可以发现 /tmp 目录下的 /etc/hosts 文件。
[root@node1 ~]# ll /tmp/hosts
-rw-r--r-- 1 root root 214 Dec 13 09:45 /tmp/hosts
除了可以将本地文件复制到远端,也可以将远端的目录下面的文件拉取到本地。
这里涉及了两个常用的参数。
-r 递归的形式复制目录下的文件
-p 复制远程系统的文件时,不改变其文件属性
将远端的/server/scripts
下的脚本拉取复制到本地/tmp
目录下
首先清理不需要的文件。
[root@master ~]# cd /tmp/
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
其次,复制远端的脚本。
[root@master tmp]# scp -rp 10.0.0.11:/server/scripts/ /tmp/
[email protected]'s password:
ping.sh 100% 1 0.5KB/s 00:00
vim.sh 100% 448 146.4KB/s 00:00
输入密码后,会显示复制过来的文件。
然后进行检查确认。
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# tree
.
└── scripts
├── ping.sh
└── vim.sh
1 directory, 2 files
由此可见,将远端的目录与目录下的文件一起复制了。
使用该命令,我们可以将远端文件下载到本地,也可以将本地文件上传到远端。
命令后跟上远端的IP,就可以进入交互式界面。
进入到远端的tmp目录下,将本地刚刚获取的脚本放到远端的tmp目录下。
使用put
,将本地文件复制到远端。
[root@master tmp]# sftp 10.0.0.11
[email protected]'s password:
Connected to 10.0.0.11.
sftp> cd /tmp/
sftp> put /tmp/scripts/ping.sh
Uploading /tmp/scripts/ping.sh to /tmp/ping.sh
/tmp/scripts/ping.sh 100% 1 0.1KB/s 00:00
首先清理一下我们刚才获得的tmp目录下的脚本。
[root@master ~]# cd /tmp/
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
然后进入交互式界面,进入远端的/server/scripts
目录,获取脚本
[root@master tmp]# sftp 10.0.0.11
[email protected]'s password:
Connected to 10.0.0.11.
sftp> cd /server/scripts/
sftp> get vim.sh
Fetching /server/scripts/vim.sh to vim.sh
/server/scripts/vim.sh 100% 448 316.0KB/s 00:00
sftp> ^D
[root@master tmp]# ll
total 4
-rw-r--r-- 1 root root 448 Dec 13 10:20 vim.sh
需要注意的是,上传和下载最后存放文件的位置,默认是我们交互式命令开始前,所在的目录下。因此想要上传文件,需要先进入某目录,然后put
该文件;想要下载文件至某目录,必须先进入那个目录,然后开启交互式命令,再在远端get
该文件。
首先清理之前的环境,确保文件可以完整的传输。
# 10.0.0.10
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0
# 10.0.0.11
[root@node1 .ssh]# cd /tmp/
[root@node1 tmp]# ll
total 8
-rw-r--r-- 1 root root 214 Dec 13 09:45 hosts
-rw-r--r-- 1 root root 1 Dec 13 10:16 ping.sh
drwx------ 3 root root 17 Dec 13 2022 systemd-private-6e8f91e32c7e42eb98a65c2931c4842d-cups.service-eVdmK7
drwx------ 2 root root 6 Dec 9 23:04 vmware-root_6590-692621205
drwx------ 2 root root 6 Dec 9 17:06 vmware-root_6592-961069012
drwx------ 2 root root 6 Dec 13 2022 vmware-root_6631-1991582773
[root@node1 tmp]# rm -rf *
[root@node1 tmp]# ll
total 0
首先检查本地系统是否有该命令的软件包,能否使用命令。
[root@master tmp]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64
# 如果没有rsync命令,则yum安装
[root@master tmp]# yum install -y rsync
命令格式与scp类似,rsync 参数 本地目录或文件 远端IP:绝对路径
[root@master tmp]# rsync -avz /etc/hosts 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
hosts
sent 172 bytes received 35 bytes 59.14 bytes/sec
total size is 214 speedup is 1.03
文件准确传输。
[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
[root@node1 tmp]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.10 master
10.0.0.11 node1
10.0.0.12 node2
首先准备环境。
在/tmp
目录下创建两个文件。
[root@master tmp]# touch master1.sh master2.sh
[root@master tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh
然后先传输文件。
[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
./
master1.sh
master2.sh
sent 305 bytes received 62 bytes 104.86 bytes/sec
total size is 0 speedup is 0.00
检查发现,远端收到了两个普通文件。
[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
./
master1.sh
master2.sh
sent 305 bytes received 62 bytes 104.86 bytes/sec
total size is 0 speedup is 0.00
然后再传输目录。
[root@master tmp]# rsync -avz /tmp 10.0.0.11:/tmp
[email protected]'s password:
sending incremental file list
tmp/
tmp/master1.sh
tmp/master2.sh
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/
sent 329 bytes received 78 bytes 116.29 bytes/sec
total size is 0 speedup is 0.00
这次输出的信息好像有点多,然后检查一下远端10.0.0.11的结果。
[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh
drwxrwxrwt 7 root root 129 Dec 13 10:33 tmp
不难发现,这次准确的将目录以及下面的文件都同步了过来。
所以,需要注意的是,如果源目录(被传输的目录)后面有 /
,例如/tmp/
,那么将只传输目录/tmp
下面的文件;如果源目录(被传输的目录)后面没有 /
,例如/tmp
,那么将传输整个目录/tmp
及下面的文件。
参数-a
是一个存档参数,包括下面参数的功能之和。
参数 | 作用 |
---|---|
-r | 以递归方式同步整个目录树 |
-l | 同步软连接 |
-p | 保留权限 |
-t | 保留时间戳 |
-g | 保留属组权限 |
-o | 保留文件所有者 |
-D | 同步设备文件 |
参数-v
,在文件同步时会输出详细的添加信息。
参数-z
,在文件传输时进行压缩提高效率。
此处需要注意的是,参数-a
不会同步高级文件的权限。
要开启ACL同步,需要再添加-A
参数;
要将源文件的SELINUX同步到目标文件,需要添加-X
参数。
此外,上文的举例说明是将本地文件同步到远端,也可以将远端文件同步到本地,只需要参数位置换即可。
状态码是客户端向服务器发送请求的时候,描述返回的请求结果的参数,借助 Http 状态码,可以让用户知道这次请求是正常处理,还是出现了错误。
不同状态码一般出错的原因可以由以下方式进行划分。
1xx 接收的请求正在处理
2xx 请求正常,处理完毕
3xx 重定向,要附加操作
4xx 客户端出错
5xx 服务端出错
状态码 | 作用 |
---|---|
200 | 成功返回网页 |
301 | 永久重定向,请求的网页永久跳转到新的位置 |
302 | 临时重定向,旧资源仍然可以访问 |
403 | 服务端理解客户端的请求,但拒绝其访问,一般是权限不足 |
404 | 服务端在指定位置找不到客户端请求的资源 |
500 | 内部服务器错误,服务器设置或内部程序问题 |
501 | 服务器不具备完成请求的功能 |
502 | 坏的网关,代理向后端请求,后端不可用或没有完成请求,一般是代理的节点出现问题 |
503 | 服务当前不可用,服务器超载或停机维护 |
504 | 网关超时,代理请求后端,后端没有按时处理完请求,一般是服务器过载 |
505 | 服务器不支持请求中所用的HTTP协议版本 |
参数 | 作用 |
---|---|
-r | 识别扩展正则符号 |
-n | 取消默认输出,只将进行操作修改的行的内容输出到屏幕 |
-i | 对文件内容进行真正的修改、删除等操作 |
-e | 根据命令的顺序多重编辑 |
[root@db01 scripts]# cat id.txt
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
根据行号
,显示某(几)行信息
##某单行信息
[root@db01 scripts]# sed -n '3p' id.txt
203,Cindy,ACCA
##连续多行信息
[root@db01 scripts]# sed -n '3,5p' id.txt
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
##不连续的多行信息
[root@db01 scripts]# sed -n '3p;5p' id.txt
203,Cindy,ACCA
205,Eric,HCIE
根据内容
,显示某(几)行信息
[root@db01 scripts]# sed -n '/Ci/p' id.txt
203,Cindy,ACCA
[root@db01 scripts]# sed -n '/Ci/,/ri/p' id.txt
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
[root@db01 scripts]# sed -n '/Ci/p;/ri/p' id.txt
203,Cindy,ACCA
205,Eric,HCIE
不修改文件,只在屏幕输出结果。
## 在第1行的上一行插入新数据
[root@db01 scripts]# sed '1i200,Kate,OFI' id.txt
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
##在最后一行的下一行添加新数据
[root@db01 scripts]# sed '$a206,Frank,CEO' id.txt
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO
##也可以把上述2条命令合二为一,按照前后顺序,同时执行
[root@db01 scripts]# sed -e '1i200,Kate,OFI' -e '$a206,Frank,CEO' id.txt
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO
所以得出规律:
在第x
行前面插入(insert),即为 xi
在第y
行后面加入(add),即为 ya
1可以表示为第一行
$可以表示为最后一行
连续进行一次性多个操作用-e
参数
将3.1
中的所有p换成d,即可做到相同的(输出)删除操作
p
-----print
打印,输出
d
-----delete
删除
取消空行的显示(排除空行)
命令一:sed -n '/./p' id.txt
命令二:sed -n '/^$/d' id.txt
命令三:sed -n '/^$/!p' id.txt
不修改文件,只在屏幕输出结果。
格式:sed 's#原有内容#修改后内容#g' 文件名
,此处的#
可以替换成/
等特殊字符
后项引用前项格式:sed 's#(.*)#\1#g' 文件名
。在这里,(.*)
所匹配的就是\1
的内容。
将3.2
、3.3
、3.4
中所有的写入操作中加上-i
参数,如下图所示。
sed -i 's#old#new#g' /tmp/test.txt
此时的添加内容、删除内容、修改内容就会在文件中真实执行,并且在屏幕将结果输出显示。
一般而言,对于重要文件的修改都会进行提前备份,在-i
参数后面加上.bak
即可同时将源文件进行先备份一份test.txt.bak
,再对test.txt
进行修改。
sed -i.bak 's#old#new#g' /tmp/test.txt
此外,一般在shell脚本中使用sed批量修改配置文件中,我们可能需要进行整行内容替换。
例如,某一行内容是这样的:
cat /etc/login.defs
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 30
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
此处需要将PASS_MAX_DAYS
后面的数字换成50。
在替换过程中需要注意的是,PASS_MAX_DAYS
在全文出现了两次,第一次出现在注释中,我们不能去改动,需要改的是第二个参数以及后面的内容。
经过观察可以发现,第二个参数是顶头出现的,我们要替换参数以及后面的东西,于是PASS_MAX_DAYS.*$
就是s###g
格式的第一个位置的内容,表示要替换参数以及后面的所有内容。
完整修改:sed -i.bak s#PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs
但如果是这样的:
auth PASS_MAX_DAYS 30 password
此处的参数前后都有内容,被夹在中间,则可以这么匹配。^.*PASS_MAX_DAYS.*$
完整修改:sed -i.bak s#^.*PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs
-n
参数是在查看文件内容时使用,-i
参数在真正修改文件时使用。
一般情况下,两个参数不会同时使用,也不能同时使用。
如果同时使用这两个参数,可能会使文件内容清空,是一个危险操作,请勿用错。
大部分情况下,计算机需要运行的进程数超过了计算机拥有CPU的核心数。
通过执行Linux内核的进程调度程序,使用时间片技术,操作系统在单个核心的不同进程之间快速切换,从而给用户一种多个进程并发处理的感受。
采用SCHED_NORMAL
策略指定相对优先级,这个优先级称为进程的nice值。
这些nice值的区间范围是[-20,19]
,数值越小,优先级别越高。
项目 | 描述 |
---|---|
高nice级别 | 容易将CPU资源让给其他进程 |
低nice级别 | 尝试不让出所使用的CPU资源 |
root用户 | 可重新调整其他用户进程的nice值 |
普通用户 | 只能分配非负的nice值,且只能往大调 |
其中NI表示实际的nice值,区间范围:[-20,19]
。
PR 将nice值映射到更大的优先级队列,区间范围:[0.39]
。
映射关系是:NI + 20 = PR
在使用该命令时,我们会添加axo
参数,指定pid、名称、nice值,并降序排列。
ps axo pid,comm,nice --sort=-nice
命令效果如下图:
某些进程的nice值可能为 -
,可能是不同的调度策略所致。
通过ps
命令请求cls
字段,可以显示不同的程序调动策略。
ps axo cls
如下图所示:
字段TS
表示采用SCHED_NORMAL
策略,其他内容则是用了不同的程序调动策略。
启动进程时,它一般继承父进程的nice值。
所以从命令行启动进程时,它将和启动的shell进程具有相同的nice值。
大多数情况下,新进程启动时的nice值为0。
使用nice命令启动进程,不加其他选项,默认nice级别为10.
nice <命令>
如果想选择nice级别,可以加上-n
参数。
要启动nice级别为13的查看文件命令进程。
nice -n 13 cat /etc/hosts
在这里需要注意的是,非特权用户只能把nice值设置为非负的,即[0,19]
。
只有root用户可以把nice值设置为[-20,-1]
。
更改现有进程的nice值,使用renice
命令。
例如,监听服务sshd
的端口,将这个命令的nice级别更改为15.
renice -n 15 $(netstat -lntup|grep sshd)