Shell 应用程序

包管理

apt

  • install
  • update
  • remove
  • autoremove
  • clean

rpm

yum

说明

  • yum在不使用yum makecache手动检查源配置文件时,可能 很长时间都不会更新cache,也就无法发现软件仓库的更新 (当然,可能和仓库类型有关,使用ISO镜像作为仓库时如此, 即使不挂载镜像,yum在执行其他操作也不会发现有个仓库无法 连接)

dpkg

zypper

pacman

库、依赖

ldconfig

创建、查看动态链接库缓存

  • 根据/etc/ld.so.conf文件中包含路径,搜索动态链接库文件 ,创建缓存文件/etc/ld.so.cache

  • 默认包含/lib/lib64/usr/lib/usr/lib64, 优先级逐渐降低,且低于/etc/ld.so.conf中路径

参数

  • 生成动态链接库缓存,并打印至标准输出
  • -v/--verbose:详细版
  • -n:仅扫描命令行指定目录
  • -N:不更新缓存
  • -X:不更新文件链接
  • -p:查看当前缓存中库文件
  • -f CONF:指定配置文件,默认/etc/ld.so.conf
  • -C CACHE:指定生成缓存文件
  • -r ROOT:指定执行根目录,默认/(调用chroot实现)
  • -l:专家模式,手动设置
  • -f Format/--format=Format:缓存文件格式
    • ld:老格式
    • new:新格式
    • compat:兼容格式

ldd

查看程序所需共享库的bash脚本

  • 通过设置一系列环境变量,如LD_TRACE_LOADED_OBJECTSLD_WARNLD_BIND_NOWLD_LIBRARY_VERSIONLD_VERBOSE

  • LD_TRACE_LOAD_OBJECTS环境变量不空时,任何可执行程序 运行时只显示模块的依赖,且程序不真正执行

  • 实质上是通过ld-linux.so实现

    1
    2
    3
    $ /lib/ld-linux.so* --list exe
    $ ldd exe
    // 二者等价
    • ld-linux.so*参见cppc/func_lib.md

参数

  • -v:详细模式
  • -u:打印未使用的直接依赖
  • -d:执行重定位,报告任何丢失对象
  • -r:执行数据、函数重定位,报告任何丢失的对象、函数

打印

  • 第1列:程序动态链接库依赖
  • 第2列:系统提供的与程序需要的库所对应的库
  • 第3列:库加载的开始地址
  • 首行、尾行可能是两个由kernel向所有进程都注入的库

strings

查看系统glibc支持的版本

objdump

查看目标文件的动态符号引用表

Shell 系统监控

系统监控

scar

收集、报告、保存系统活动信息

iostat

报告CUP统计数据,设备、分区输入/输出信息

iotop

I/O监控

mpstat

报告CPU相关统计数据

vmstat

报告虚拟内存统计

tload

加载显示系统平均负载、指定tty终端平均负载

time

显示资源资源使用时间

uptime

显示系统已运行时间

ipcs

提供IPC设施信息

ipcrm

删除消息队列、信号量集、共享内存ID

lslk

列出本地锁

Linux 进程调度命令

进程管理

ps

查看当前进程瞬时快照

top

显示当前正在运行进程(动态更新)

  • 按照使用内存大小排序,可以用于查找内存使用情况

pgrep

按名称、属性查找进程

pidof

根据进程名查找正在运行的进程进程号

kill

终止进程

killall

按名称终止进程

pkill

按名称、属性终止进程

timeout

在指定时间后仍然运行则终止进程

wait

等待指定进程

fuser

显示使用指定文件、socket的进程

pmap

报告进程的内存映射

lsof

列出打开的文件

chkconfig

为系统服务更新、查询运行级别信息

作业

&

放在命令之后,命令后台执行

1
2
3
$ ./pso > pso.file 2>&1 &
# 将`pso`放在后台运行,把终端输出(包括标准错误)
# 重定向的到文件中

nohup

不挂起job,即使shell退出

1
2
3
4
$ nohup ./pso > pso.file 2>&1 &
# 不挂起任务,输出重定向到文件
$ nohup -p PID
# 不挂起某个进程

jobs

列出活动的作业

-l:返回任务编号、进程号

bg

恢复在后台暂停工作的作业

1
2
$ bg %n
# 将编号为`n`的任务转后台运行

fg

将程序、命令放在前台执行

1
2
$ fg %n
# 将编号为`n`的任务转前台运行

setsid

在一个新的会话中运行程序

1
2
3
4
$ setsid ./test.sh &`
# 新会话中非中断执行程序,此时当前shell退出不会终止job
$ (./test.sh &)
# 同`setsid`,用`()`括起,进程在subshell中执行

`disown

1
2
3
$ disown -h %job_id
# *放逐*已经在后台运行的job,
# 则即使当前shell退出,job也不会结束

screen

创建断开模式的虚拟终端

1
2
3
4
5
6
$ screen -dmS screen_test
# 创建断开(守护进程)模式的虚拟终端screen_test
$ screen -list
# 列出虚拟终端
$ screen -r screen_test
# 重新连接screen_test,此时执行的任何命令都能达到nohup

快捷键

  • <c-z>:挂起当前任务
  • <c-c>:结束当前任务

Linux 归档、压缩

归档、压缩

tar

多个文件保存进行归档、压缩

gzip

压缩、解压缩gzip文件

gunzip

解压缩gzip文件

zcmp

调用diff比较gzip压缩文件

unzip

解压缩zip文件

zip

压缩zip文件

zcat

查看zip压缩文件

zless

查看zip压缩文件

zipinfo

列出zip文件相关详细信息

zipsplit

拆分zip文件

zipgrep

在zip压缩文件中搜索指定字符串、模式

zmore

查看gzip/zip/compress压缩文件

rpm2cpio

将rpm包转变为cpio格式文件,然后可以用cpio解压

1
$ rpm2cpio rpm_pkg | cpio -div

Linux 网络接口命令

网络

ping

向被测试目的主机地址发送ICMP报文并收取回应报文

  • -c:要求回应的次数
  • -i:发送ICMP报文时间间隔
  • -R:记录路由过程
  • -s:数据包大小
  • -t:存活数值(路由跳数限制)

ifconfig

显示、设置网络

  • netmask:设置网卡子网掩码
  • up:启动指定网卡
  • down:关闭指定网络设备
  • ip:指定网卡ip地址

netstat

显示与网络相关的状态信息:查看网络连接状态、接口配置信息、 检查路由表、取得统计信息

  • -a:显示网络所有连接中的scoket
  • -c:持续列出网络状态
  • -i:显示网络界面信息表单
  • -n:直接使用IP地址而不是主机名称
  • -N:显示网络硬件外围设备号连接名称
  • -s:显示网络工作信息统计表
  • -t:显示TCP传输协议连接状况

route

查看、配置Linux系统上的路由信息

traceroute

跟踪UDP路由数据报

  • -g:设置来源来路由网关
  • -n:直接使用IP地址而不是主机名称
  • -p:设置UDP传输协议的通信端口
  • -s:设置本地主机送出数据包的IP地址
  • -w:超时秒数(等待远程主机回报时间)

Grub

Grub

/etc/sysconfig/grub

GRUB配置文件,实际上是/etc/default/grub的软连接

系统日志

/var/log

  • bootstrap.log:系统引导相关信息
  • cron:系统调度执行信息
  • dmesg:内核启动时信息,包括硬件、文件系统
  • maillog:邮件服务器信息
  • message:系统运行过程相关信息,包括IO、网络
  • secure:系统安全信息

Linux 远程工具

远程连接服务器

ssh

ssh:ssh登陆服务器

1
2
ssh <user_name>@<host> [-p <port>] [-i <private_key>]
[-F <config_file>]
  • 参数
    • -F:指定配置文件,简化命令,缺省~/.ssh/config
      • 有时会覆盖其余配置,可以指定-F /dev/null避免
    • -p:指定端口
    • -i:指定使用的私钥
    • -T:测试连接

ssh-keygen

ssh-keygen:生成ssh密钥

1
2
3
4
 # 生成位长为4096的RSA密钥
$ ssh-keygen -t rsa -b 4096 -C "xyy15926@163.com"
# 更改现有私钥密钥
$ ssh-keygen -p [-f keyfile] [-m format] [-N new_pwd] [-p old_pwd]
  • 参数

    • -t [dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk|ras]: 生成密钥类型
    • -f <output_keyfile>:密钥保存文件
    • -b <bits>:密钥位数
    • -C <comment>
    • -p:修改现有密钥密码
  • 在生成密钥时可以设置密钥,避免计算机访问权限被获取后密钥 被用于访问其他系统

    • 设置有密钥的私钥每次使用都需要输入密码
    • ssh-agent可以用于管理私钥密码,将私钥添加给 ssh-agent无需每次输入密码

ssh-add

ssh-add:管理ssh-agent代理密钥

1
2
 # 缺省将`$HOME/.ssh/id_rsa`私钥添加至`ssh-agent`
$ ssh-add <keyfile>
  • 参数
    • -l:查看代理中私钥
    • -L:查看代理中私钥对应公钥
    • -d <keyfile>:移除指定私钥
    • -D:移除所有私钥
    • -x/-X:锁定/解锁ssh-agent(需要设置密码)
    • -t <seconds>:密钥时限

ssh-agent

ssh-agent:控制和保存公钥验证所使用的私钥程序

  • 参数

    • -k:关闭当前ssh-agent进程
  • 启动方式

    1
    2
    3
    4
    5
    # 创建默认子shell,在子shell中运行`ssh-agent`
    # 会自动进入子shell中,退出子shell则`ssh-agent`关闭
    $ ssh-agent $SHELL
    # 启动后台`ssh-agent`进程,需手动关闭`ssh-agent`进程
    $ eval `ssh-agent`
  • 说明

    • ssh-agent添加私钥需要输入私钥密码 (无密码私钥无管理必要)
    • ssh-agent不会默认启动,应是每次需要大量使用私钥 前启动、添加私钥,然后关闭

/etc/init.d/sshd

sshd:ssh连接的服务器守护程序(进程)

1
2
3
4
$ sudo systemctl start sshd
# 使用`systemctl`启动
$ /etc/init.d/sshd restart
# 直接启动进程

scp

scp:secure cp,安全传输(cp)文件

  • 本机到远程

    1
    $ scp /path/to/file user_name@host:/path/to/dest
  • 远程到本机

    1
    $ scp user_name@host:/path/to/file /path/to/dest
    • 这个命令应该在本机上使用,不是ssh环境下
    • ssh环境下使用命令表示在远程主机上操作
    • 而本机host一般是未知的(不是localhost)
  • 远程到远程

rsync

实现本地主机、远程主机的文本双向同步

同步两种模式

同步过程由两部分模式组成

  • 决定哪些文件需要同步的检查模式

    • 默认情况下,rsync使用quick check算法快速检查 源文件、目标文件大小、mtime是否一致,不一致则 需要传输
    • 也可以通过指定选项改变检查模式
  • 文件同步时的同步模式:文件确定被同步后,在同步发生 之前需要做哪些额外工作

    • 是否删除目标主机上比源主机多的文件
    • 是否要先备份已经存在的目标文件
    • 是否追踪链接文件

工作方式

  • 本地文件系统同步:本质是管道通信

    1
    $ rsync [option..] src... [dest]
  • 本地主机使用远程shell和远程主机通信

    1
    2
    $ rsync [option...] [user@]host:src... [dest]
    $ rsync [option...] src... [user@]host:dest
    • 本质上是管道通信
  • 本地主机通过socket连接远程主机的rsync

    1
    2
    3
    4
    $ rsync [option...] rsync://[user@]host[:port]/src... dest
    $ rsync [option...] [user@]host::src... [dest]
    $ rsync [option...] src... rsync://[user@]host[:port]/dest
    $ rsync [option...] src... [user@]host::dest
    • 需要远主机运行rsync服务监听端口,等待客户端连接
  • 通过远程shell临时派生rsync daemon,仅用于临时读取daemon 配置文件,同步完成后守护进程结束

    • 语法同shell远程主机通信,指定--rsh/-e选项

参数说明

  • 可以有多个源文件路径,最后一个是目标文件路径
  • 如果只有一个路径参数,则类似于ls -l列出目录
  • 注意:如果原路径是目录
    • /结尾表示目录中文件,不包括目录本身
    • 不以/结尾包括目录本身

常用选项

同步模式选项
  • v/-vvvv:显示详细/更详细信息
  • p/--partial --progress:显示进度
  • -n/--dry-run:测传传输
  • -a/--archive:归档模式,递归传输并保持文件属性
  • -r/--recursive:递归至目录
  • -t/--times:保持mtime属性
    • 建议任何时候都使用,否则目标文件mtime设置为系统时间
  • -o/--owner:保持属主
  • -g/--group:保持group
  • -p/--perms:保持权限(不包括特殊权限)
  • -D/--device --specials:拷贝设备文件、特殊文件
  • -l/--links:如果目标是软链接文,拷贝链接而不是文件
  • z:传输时压缩

  • w/--whole-file:使用全量传输

    • 网络带宽高于磁盘带宽时,此选项更高效
  • R/--relative:使用相对路径,即在目标中创建源中指定 的相对路径

    1
    2
    3
    $ rsync -R -r /var/./log/anaconda /tmp
    # 将会在目标创建`/tmp/log/anaconda`
    # `.`是将绝对路径转换为相对路径,其后的路径才会创建
  • --delete:以源为主,对DEST进行同步,多删、少补

  • -b/--backup:对目标上已经存在文件做备份的
    • 备份文件名使用~做后缀
  • --backup-dir:指定备份文件保存路径,不指定为同一目录
  • --remove-source-file:删除源中已成功传输文件
连接
  • --port:连接daemon时端口号,默认873
  • --password-file:daemon模式时的密码文件
    • 可以从中读取密码文件实现非交互式
    • 是rsync模块认证密码,不是shell认证密码
  • -e:指定所需要的远程shell程序,默认ssh
    1
    $ rsync -e "ssh -p 22 -o StrictHostKeyChecking=no" /etc/fstab
  • --rsh:使用rsync deamon进行同步
检查模式选项
  • --size-only:只检查文件大小,忽略mtime
  • -u/--update:进源mtime比已存在文件mtime新才拷贝
  • -d/--dirs:以不递归方式拷贝目录本身(不目录中内容)
  • --max-size:传输最大文件大小,可以使用单位后缀
  • --min-size:传输的最小文件大小
  • --exclude:指定派出规则排除不需要传输的文件
  • --existing:只更新目标端已存在文件,不存在不传输
  • --ignore-existing:只更新在目标段不存在文件

SSH

/etc/ssh/sshd_config

全局系统ssh配置

1
2
3
4
5
6
7
8
RSAAuthentication
# 去掉注释启用RSA认证
PubkeyAuthentication yes
# 启用公私钥配对认证方式
AuthorizedKeyFile .ssh/authorized_keys
# 设置被认证的公钥存放文件
# 默认为`~/.ssh/authorized_keys`中
# 将其他主机公钥写入其中,即可从其使用密钥认证免密访问

~/.ssh

authorized_keys

/etc/.ssh/sshd_config中默认的存储其他主机公钥的文件,

  • 使用在其中的公钥可以使用公钥登陆,无需密码
  • 必须设置只有root用户有更改权限有效,否则报错
1
---pubkey---
id_rsa.pub

生成公钥

config

ssh访问远程主机配置

  • 每条配置对应一个ssh连接,配置后可以使用link_name直接 连接
1
2
3
4
5
6
7
Host <link_name>
HostName <host>
User <user_name>
Port <port>
IdentityFile <private_key>
IdentitiesOnly yes
PreferredAuthentications publickey
  • 默认私钥文件为:~/.ssh/id_rsa,可以指定特定私钥
  • 此文件中配置是ssh协议参数封装,适合任何可以使用ssh协议 场合:sshgitscp

Shell 任务

定时任务

atq

列出用户等待执行的作业

atrm

删除用户等待执行的作业

watch

定期执行程序

at

设置在某个时间执行任务

1
2
3
4
5
6
7
at now+2minutes/ now+5hours
# 从现在开始计时
at 5:30pm/ 17:30 [today]
# 当前时间
at 17:30 7.11.2018/ 17:30 11/7/2018/ 17:30 Nov 7
# 指定日期时间
# 输入命令之后,`<c-d>`退出编辑,任务保存

crontab

针对用户维护的/var/spool/cron/crontabs/user_name文件,其中 保存了cron调度的内容(根据用户名标识)

  • -e:编辑
  • -l:显示
  • -r:删除

任务计划格式见文件部分

任务、作业

Crontab文件

/var/spool/cron/crontabs/user_name

使用用户名标识的每个用户的定时任务计划文件,文件中每行为一个 cron调度内容(也可以使用crontab -e直接编辑)

  • 共6个字段,前5个字段为执行调度时间分配

    • 分钟、小时(24)、日期(31)、月份(12)、星期
    • *表示每个当前时间
    • -时间区间
    • ,时间分隔
    • [range]/[n]:范围内每隔多久执行一次,范围为*可省
  • 最后字段为调度内容

  • 1
    2
    3
    4
    3,15 8-11 */2 * * command
    # 每隔两天的8-11点第3、15分执行
    3,15 8-11 * * 1 command
    # 每个星期一的上午8-11点的第3、15分钟执行

/etc/crontabs

系统级crontab文件,类似于用户crontab文件,只是多一个用户名 字段位于第6个

服务

系统服务

  • 服务systemctl脚本目录优先级从低到高

    • [/usr]/lib/systemd/system:系统、应用默认存放位置 ,随系统、应用更新会改变

    • /etc/systemd/system推荐在此自定义配置,避免 被更新覆盖

      1
      2
      .include /lib/systemd/system/<service_name>.service
      # customized changes
    • /run/systemd/system:进程运行时创动态创建服务文件 目录,仅修改程序运行时参数才会修改

  • 自定义系统服务方法

    • 创建<service_name>.service文件,其中写入配置
    • 创建<service_name>.service.d目录,其中新建.conf 文件写入配置
  • 系统服务控制命令systemctl参见linux/shell/cmd_sysctl

.service

<some_name>.service:服务配置unit文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[Unit]					# 包含对服务的说明
Description= # 服务简单描述
Documentation= # 服务文档
Requires= # 依赖unit,未启动则当前unit启动失败
Wants= # 配合unit,不影响当前unit启动
BindsTo= # 类似`Requires`,若其退出则当前unit
# 退出
Before= # 若该字段指定unit要启动,则必须在
# 当前unit之后启动
After= # 若该字段指定unit要启动,则必须在
# 当前unit之前启动
Conflicts= # 冲突unit
Condition= # 条件,否则无法启动
Assert= # 必须条件,否则启动失败


[Service] # 服务具体运行参数设置,仅
# *service unit*有该字段
Type= # 服务启动类型
PIDFile= # 存放PID文件路径
RemainAfterExit= # 进程退出后是否认为服务仍处于激活

ExecStartPre= # 服务启动前执行的命令
ExecStartPost= # 服务启动后执行的命令
ExecStart= # 服务具体执行、重启、停止命令
ExecReload=
ExecStop=

Restart= # 重启当前服务的情况
RestartSec= # 自动重启当前服务间隔秒数
TimeoutSec= # 停止当前服务之前等待秒数

PrivateTmp= # 是否给服务分配临时空间
KillSignal=SIGTERM
KillMode=mixed

Environmen= # 指定环境变量

[Install]
WantedBy= # unit所属的target,`enable`至相应
# target
RequiredBy= # unit被需求的target
Alias= # unit启动别名
Also= # `enable`当前unit时,同时被`enable`
# 的unit
  • Type:服务启动类型

    • simple:默认,执行ExecStart启动主进程

      • Systemd认为服务立即启动
      • 适合服务在前台持续运行
      • 服务进程不会fork
      • 若服务要启动其他服务,不应应该使用此类型启动,
    • forking:以fork方式从父进程创建子进程,然后父进程 立刻退出

      • 父进程退出后Systemd才认为服务启动成功
      • 适合常规守护进程(服务在后台运行)
      • 启动同时需要指定PIDFile=,以便systemd能跟踪 服务主进程
    • oneshot:一次性进程

      • Systemd等待当前服务退出才继续执行
      • 适合只执行一项任务、随后立即退出的服务
      • 可能需要同时设置RemainAfterExit=yes,使得 systemd在服务进程推出后仍然认为服务处于激活状态
    • notify:同simple

      • 但服务就绪后向Systemd发送信号
    • idle:其他任务执行完毕才会开始服务

    • dbus:通过D-Bus启动服务

      • 指定的BusName出现在DBus系统总线上时,Systemd 即认为服务就绪
  • WantedBy:服务安装的用户模式,即希望使用服务的用户

    • multi-user.target:允许多用户使用服务

.target

<some_name>.target:可以理解为系统的“状态点”

  • target通常包含多个unit

    • 即包含需要启动的服务的组
    • 方便启动一组unit
  • 启动target即意味将系统置于某个状态点

  • target可以和传统init启动模式中RunLevel相对应

    • 但RunLevel互斥,不能同时启动

    |RunLevel|Target| |——-|——-| |0|runlevel0.targetpoweroff.target| |1|runlevel1.targetrescue.target| |2|runlevel2.targetmulti-user.target| |3|runlevel3.targetmulti-user.target| |4|runlevel4.targetmulti-user.target| |5|runlevel5.targetgraphical.target| |6|runlevel6.targetreboot.target|

  • enable设置某个服务自启动,就是在服务配置.serviceWantedByRequiredBy指明的target注册

    • WantedBy向target对应目录中 /etc/systemd/system/<target_name>.target.wants 添加符号链接
    • RequiredBy向target对应目录中 /etc/systemd/system/<target_name>.target.required 添加符号链接
    • systemctl disable <unit>就是移除对应symlink

.socket

日志

/etc/systemd/journal.conf

Systemd日志配置文件

Systemd(服务)

  • Systemd作为新系统管理器,替代service更加强大

    • 支持服务并行启动,提高效率
    • 具有日志管理、快照备份和恢复、挂载点管理
    • 包括一组命令
  • Systemd可以管理所有系统资源,不同资源统称为Unit

    • service unit:系统服务
    • target unit:多个unit构成的组
    • devie unit:硬件设备
    • mount unit:文件系统挂载点
    • automount unit:自动挂载点
    • path unit:文件、路径
    • scope unit:不是由Systemd启动外部进程
    • slice unit:进程组
    • snapshot unit:Systemd快照,可以切换某个快照
    • socket unit:进程间通信socket
    • swap unit:swap文件
    • timer unit:定时器
  • unit配置文件状态(无法反映unit是否运行)

    • enabled:已建立启动链接
    • diabled:未建立启动链接
    • static:配置文件没有[Install]部分,只能作为 其他unit配置文件依赖,不能独立注册
    • masked:被禁止建立启动链接
  • systemd进程ID为1,掌管所有进程
  • unit配置文件参见linux/shell/config_files

systemctl

  • systemctl通过d-bus和systemd交流,在docker和wsl中可能 没有systemd-daemon,此命令可能不能使用,使用service 代替

查看服务、系统状态

  • status <unit>:查看系统、unit(服务)状态
    • -H <host>:查看远程主机unit状态
  • show <unit>:查看unit底层参数
    • -p <attr>:查看某个具体属性参数
  • 三个查询状态的简单方法,方便脚本使用
    • is-active <serivce>
    • is-failed <serivce>
    • is-enabled <serivce>
  • reset-failed <unit>:清除错误状态

  • list-units:列出所有已加载unit

  • list-unit-files:列出所有系统中unit配置文件、状态
    • --type=:指定特定类型文件
    • --status=:指定特定状态文件
  • list-dependencies <unit>:查看依赖关系
    • -all:展开target类型

状态点/启动级别

  • get-default:查看默认target
  • set-default <target>:设置默认target
  • isolate <target>:切换target,其他target的unit将 被停止

设置服务、系统

  • start <service>:启动服务
  • stop <service>:关闭服务
  • enable <service>:开机自启动服务

    • 行为参见linux/shell/config_files
  • disable <service>:关闭开机自启动服务

    • enable启动后的服务仅仅disable不会立刻停止服务
  • kill <service>:杀死服务的所有子进程
  • mask <service>:禁用服务
    • 无法通过startrestart启动服务
    • 可以防止服务被其他服务间接启动
  • umask <service>:启用已禁用服务
  • daemon-reload:重新读取所有服务项
    • 修改、删除、添加服务项后执行该命令
  • poweroff:关机
  • reboot:重启
  • rescue:进入rescue模式

配置文件

  • cat <service_name>.service:查看Unit定义文件
  • edit <service_name>.service:编辑Unit定义文件
  • reload <service_name>.service:重新加载Unit定义文件

journalctl

journalctl:统一管理所有日志:内核日志、应用日志

  • -k:仅内核日志
  • --since:指定日志时间
  • -n:指定查看日志行数
  • -f:最新日志
  • _PID=:进程日志
  • _UID=:用户日志
  • -u:unit日志
  • -p:日志有限集
    • emerg:0
    • alert:1
    • crit:2
    • err:3
    • warning:4
    • notice:5
    • info:6
    • debug:7
  • --nopager:非分页输出
  • -o:日志输出格式
    • json
    • json-pretty
  • --disk-usage:日志占用空间
  • --vacuum-size=:指定日志占用最大空间
  • --vacuum-time=:指定日志保持时间

systemd-analyze

systemd-analyze:查看系统启动耗时

  • blame:查看各项服务启动耗时
  • critical-chain:瀑布状启动过程流

hostnamectl

hostnamectl:查看主机当前信息

  • set-hostname <hostname>:设置主机名称

localectl

localctl:查看本地化设置

  • set-locale LANG=en_GB.utf8
  • set-keymap en_GB

timedatectl

timedatectl:查看当前时区设置

  • list-timezones:显示所有可用时区
  • set-timezone America/New_York
  • set-time YYYY-MM-DD
  • set-time HH:MM:SS

loginctl

loginctl:查看当前登陆用户

  • list-sessions:列出当前session
  • list-users:列出当前登陆用户
  • show-user <user>:显示用户信息

service

控制系统服务

Shell 用户配置

用户、组

用户信息

/etc/passwd

用户属性

  • 用户名
  • 口令:在/etc/passwd文件中以x显示
  • user-id:UID,用户标识
    • linux事实上不直接处理用户名,只识别UID
    • UID对用户是唯一的
  • group-id:GID,用户的默认组标识
    • 用户可以隶属多个不同的组,但是只有一个默认组,即用户 创建文件默认隶属的组
  • 描述:用户描述
  • 用户主目录:用户登陆目录
  • 登陆shell:用户登陆系统使用的shell
    • 缺省为空,可能是/bin/sh

/etc/shadow

用户口令属性

  • 用户名
  • 加密的密码
  • 自1/1/1970起,密码被修改的天数
  • 密码将被允许修改之前的天数(0为在任何时候可修改)
  • 系统强制用户修改为新密码之前的天数(1永远不能修改)
  • 提前警告用户密码过期前天数(-1无警告)
  • 禁用用户账户在密码过期后天数(-1永不禁用)
  • 用户被禁用天数(-1被启用)

/etc/group

群组账号信息文件

  • 群组名
  • 密码:以x显示
  • 群组ID(GID)
    • 系统群组:安装Linux以及部分服务型程序时自动设置的 群组,GID<500
    • 私人组群:由root新建的群组,默认GID>500
  • 附加用户列表

/etc/gshadow

群组口令信息文件

/etc/sudoers

sudo配置文件

  • 根据配置文件说明取消注释即可赋予用户、组sudo权限

用户配置文件

  • login-shell:用户登陆(创建session)时的shell模式,该 模式下shell会自动执行profile文件
  • subshell:用户登陆后载入的shell的模式,该模式下shell会 自动执行rc文件

profile

-一般在login-shell模式会执行一次,从名称看起来更像是 用户配置

  • 全局、被所有用户默认执行的文件在/etc目录下,用户个人 profile在用户目录

  • ^profile$是所有类型shell(bash、zsh、ash、csh)都会 执行

  • 不同类型的shell可能有其特定的profile文件,如: /etc/bash_profile~/.bash_profile,不过不常见 (可以理解,毕竟是用户配置

  • 有的发行版本(ubuntu)还有有/etc/profile.d文件夹,在 /etc/profile中会设置执行其中的配置文件

rc

rc应该是run command的简称,在每次subshell模式会执行,从 名称看起来更像是shell配置(很多应用配置文件rc结尾)

  • 全局、被所有用户执行的文件在/etc目录下,用户个人rc 则在用户目录

  • 应该是因为rc本来就是对shell的配置文件,所以是不存在 通用的^rc$配置的,最常用的bash对应就是~/.bashrc~/bash.bashrc

总结

  • 其实rc也会在用户登陆时执行

    • login-shell会立刻载入subshell?
    • profile里设置了立刻调用?
  • 应该写在profile里的配置

    • shell关系不大、更像是用户配置,如:特定应用环境变量
    • 不需要、不能重复执行,因为rc在用户登录时已经执行 过一次,launch subshell时会重复执行,如: export PATH=$PATH:xxxx/bin/
  • 应该写在rc里的配置

    • 和shell关系紧密的shell配值,如:alias
    • 在用户登陆后会该边,需要在每次launch subshell时执行 的配置
  • 配置文件执行顺序

    • 没有一个确定顺序,不同的linux发行版本有不同的设置, 有的还会在脚本中显式写明相互调用,如:/etc/profile 中调用/etc/bashrc~/.bashrc调用/etc/bashrc
    • 但是可以确认的是/etc/profile一般是第一个被调用, ~/.xxxxrc/etc/xxxxxrc中的一个最后调用
  • 还有一些其他配置文件

    • ~/.bash_logout:退出bash shell时执行
  • 对于wsl,可能是因为将用户登陆windows视为create session, ~/.profile好像是不会执行的

/etc/environment

系统在登陆时读取第一个文件

  • 用于所有为所有进程设置环境变量
  • 不是执行此文件中的命令,而是根据KEY=VALUE模式的 代码,如:PATH=$PATH:/path/to/bin

用户命令

用户类型

  • 超级用户:root用户
  • 系统用户:与系统服务相关的用户,安装软件包时创建
  • 普通用户:root用户创建,权限有限

显示登陆用户

w

详细查询已登录当前计算机用户

who

显示已登录当前计算机用户简单信息

logname

显示当前用户登陆名称

users

用单独一行显示当前登陆用户

last

显示近期用户登陆情况

lasttb

列出登陆系统失败用户信息

lastlog

查看用户上次登陆信息

用户、用户组

newusers

更新、批量创建新用户

lnewusers

从标准输入中读取数据创建用户

userdel

删除用户账户

groupdel

删除用户组

passwd

设置、修改用户密码

chpassws

成批修改用户口令

change

更改用户密码到期信息

chsh

更改用户账户shell类型

pwck

校验/etc/passwd/etc/shadow文件是否合法、完整

grpck

验证用户组文件/etc/grous//etc/gshadow完整性

newgrp

将用户账户以另一个组群身份进行登陆

finger

用户信息查找

groups

显示指定用户的组群成员身份

id

显示用户uid及用户所属组群gid

su

切换值其他用户账户登陆

sudo

以superuser用户执行命令

  • Archlinux中需要自行安装
  • 配置文件为/etc/sudoers

useradd/adduser

创建用户账户(adduseruseradd命令的符号链接)

  • -c:用户描述
  • -m:创建用户目录
  • -d:用户起始目录
  • -g:指定用户所属组
  • -n:取消建立以用户为名称的群组
  • -u:指定用户ID
  • -s:指定用户登录shell
    • 缺省为空,默认值应该是/bin/sh,很多发行版会设置 其为/bin/bash
    • 查看$SHELL环境变量查看当前shell
    • 文件/etc/shells包含支持shell类型

usermod

修改用户

  • -e:账户有效期限
  • -f:用户密码过期后关闭账号天数
  • -g:用户所属组
  • -G:用户所属附加组
  • -l:用户账号名称
  • -L:锁定用户账号密码
  • -U:解除密码锁定

groupadd

新建群组

  • -g:强制把某个ID分配给已经存在的用户组,必须唯一、非负
  • -p:用户组密码
  • -r:创建系统用户组

groupmod

  • -g:设置GID
  • -o:允许多个用户组使用同一个GID
  • -n:设置用户组名

Linux 网络接口配置

网络配置

HOST

/etc/hostname

设置主机名称,直接填写字符串即可

1
PC-NAME

/etc/hosts

ipd地址-主机名称映射

  • 理论上说,这里主机名称应该是本机称呼,不要求其他主机 /etc/hostname与这里的主机名一致
1
2
3
127.0.0.1 localhost
xxx.xxx.xxx.xxx name
xxx.xxx.xxx.xxx domain.name

DNS Resolver

相关问题

  • Temporary failure in name resolution
    • 问题:可能是DNS服务器配置缺失、错误
    • 场景:$ ping
    • 解决:设置nameserver配置DNS服务器地址

/etc/resolv.conf

域名解析器(resolver)(DNS客户机)配置文件

  • 设置DNS服务器IP地址、DNS域名
  • 包含主机域名搜索顺序
1
2
3
4
nameserver		114.114.114.114		# DNS服务器IP地址
domain localhost # 本地域名
search search_list # 域名搜索列表
sortlist # 允许将得到域名结果进行排序

说明

  • nameserver:可以有多,每行一个ip地址,查询时按照 顺序依次查找
  • domain:声明主机域名
    • 查询无域名主机时需要使用
    • 邮件系统需要使用
    • 未配置则使用主机名
  • search:其参数指明域名查询顺序
    • 查询无域名主机时,将在其参数声明域中分别查找
    • domainsearch不共存,同时存在时,后者覆盖前者
  • sortlist:对得到的域名结果进行特定排序
    • 参数未网络/掩码对时,允许任意排列顺序

系统设置/etc/sysconfig

/etc/sysconfig/network[-scripts]

文件夹包含网卡配置文件

一般linux

  • ifcfg-ethXX:linux默认ethernet网卡配置文件名称
  • ifcfg-wlanXX:无线局域网网卡配置文件名称

CentOS7网卡名称

  • 前两个字符

    • en:Enthernet以太网
    • wl:WLAN无线局域网
    • ww:WWAN无线广域网
  • 第3个字符

    • o<index>:on-board device index number,
    • s<slot>:hotplug slot index number
    • x<MAC>:MAC address
    • p<bus>s<slot>:PCI geographical location/USB port number chain
  • 命名优先级

    • 板载设备:固件、BIOS提供的索引号信息可读:eno1
    • 固件、BIOS提供的PCI-E热拔插索引号可读:ens33
    • 硬件接口物理位置:enp2s0
    • linux传统方案:eth0
    • 接口MAC地址:enxXXXXXXXXXXXXXXXXX,默认不使用, 除非用户指定使用
  • 示例

    • enoXX:主板bios内置网卡
    • ensXX:主板bios内置PCI-E网卡
    • enpXXs0:PCI-E独立网卡
恢复传统命名方式

编辑grub文件,然后使用grub2-mkconfig重新生成 /boot/grub2/grub.cfg,这样系统就会根据传统linux网卡文件 命名方式查找配置文件

1
2
3
	# `/etc/sysconfig/grub`
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# 为`GRUB_CMDLINE_LINUX`增加2个参数

CentOS7配置格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DEVICE=ens33				# 网络连接名称(实际显示的网络名称)
NAME=ens33 # 网卡物理设备名称
TYPE = Ethernet # 网卡类型:以太网
ONBOOT=yes # 开机启动:是
DEFROUTE=yes # 是否设置此网卡为默认路由:是
NM_CONTROLLED=yes # 是否可由Network Manager托管:是

BOOTPROTO=dhcp # 网卡引导协议
# `none`:禁止DHCP
# `static`:启用静态IP地址
# `dhcp`:开启完整DHCP服务
IPADDR=xxx.xxx.xxx.xxx # IP地址
IPV4_FAILURE_FATAL=no # IPV4致命错误检测(失败禁用设备):否
IPV6INIT=yes # IPV6自动初始化:是
IPV6_AUTOCONF=yes # IPV6自动配置:是
IPV6_DEFROUTE=yes # IPV6是否可为默认路由:是
IPV6_FAILURE_FATAL=no # IPV6致命错误检测(失败禁用设备):否
IPV6_ADDR_GEN_MODE=stable-privacy
# IPV6地地址生成模型:stable-privacy

DNS1=xxx.xxx.xxx.xxx # DNS服务器地址1
DNS2=xxx.xxx.xxx.xxx # DNS服务器地址2
PEERDNS=no # 是否允许DHCP获得DNS覆盖本地DNS:否
GATEWAY=xxx.xxx.xxx.xxx # 网关
PREFIX=24 # 子网掩码使用24位
NETMASK=255.255.255.0 # 子网掩码
# 两个参数应该只需要使用一个即可
BROADCAST=

HWADDR=xxxxxxxxxx # 接口MAC地址
# 配置文件都会被执行,`HWADDR`
# 能匹配上硬件,配置才会生效,
# 否则硬件使用默认配置
# 若多个配置文件配置相同`HWADDR`
# 则操作network服务时报错
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 通用唯一识别码:不能相同(注意虚拟机)

PROXY_METHOD=none # 代理方式:无
BROWSER_ONLY=no # 仅浏览器:否

USERCTL=no # 是否允许非root用户控制此设备:否
MASTER= # 主设备名称?
SLAVE= # 从社会名称?
NETWORK= # 网络地址