Linux常见命令的使用
ssk-wh Lv4

基本涵盖了Linux下开发常用的命令,适合刚接触Linux的小伙伴。

fish

安装

sudo apt install fish

概述

命令提示&补全工具

用法fish

image

Tips:可以使用方向键→键,直接补全提示的命令

Q&A

使用/usr/bin/fish替换现有/bin/bash(默认)方法:

chsh -s /usr/bin/fish

想改回 /bin/bash :

chsh -s /bin/bash

Tips:修改后需要注销才生效

qdbus

概述

基于qt的应用程序通信接口工具,常用于调用 dbus 方法、属性

用法

qdbus --session // 查看当前session所有的service信息

qdbus 等同于 qdbus --session

qdbus --system // 查看系统级别的所有的service信息

场景

想通过 dbus 把剪贴板打开,但记不清服务名了,依稀记得有个 Clipboard 字段

方法一:安装 d-feet ,查看服务列表,通过 d-feet 进行方法的调用

方法二(推荐):

qdbus --session | grep Clipboard // 匹配出剪贴板的服务名

image
根据印象找到对应的服务应该为 com.deepin.dde.Clipboard

qdbus com.deepin.dde.Clipboard /

利用 qdbus 命令提供的自动补全机制(按 tab 键)得到对应的 path 列表

image
qdbus com.deepin.dde.Clipboard /com/deepin/dde/Clipboard

继续利用 tab 进行命令的补全

image
得到完整的命令

image
Q&A:
image
image

dbus-monitor

概述

监听dbus服务接口被调用

用法

//监听服务情况,可得知消息触发源,但监听不到属性被调用
dbus-monitor --session interface=org.freedesktop.Notifications

监听信号变化
dbus-monitor --session "type='signal',interface='org.freedesktop.DBus.Properties',path='/com/deepin/dde/daemon/Dock'"

gsettings

概述

操作dconf的一套高级API,用于管理 dconf 配置

用法

标准用法:gsettings get/set/reset [schemas]

image

pmap

概述

查询进程的内存映射信息,常用于查看进程运行时链接了哪些动态库

用法

pmap -p [pid]

image

coredumpctl

安装

sudo apt install systemd-coredump

概述

进程崩溃或卡死时的调试神器

介绍

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
coredumpctl [OPTIONS...]

List or retrieve coredumps from the journal.

Flags:
-h --help Show this help
--version Print version string
--no-pager Do not pipe output into a pager
--no-legend Do not print the column headers
--debugger=DEBUGGER Use the given debugger
-1 Show information about most recent entry only
-S --since=DATE Only print coredumps since the date
-U --until=DATE Only print coredumps until the date
-r --reverse Show the newest entries first
-F --field=FIELD List all values a certain field takes
-o --output=FILE Write output to FILE
-D --directory=DIR Use journal files from directory

-q --quiet Do not show info messages and privilege warning
Commands:
list [MATCHES...] List available coredumps (default)
info [MATCHES...] Show detailed information about one or more coredumps
dump [MATCHES...] Print first matching coredump to stdout
debug [MATCHES...] Start a debugger for the first matching coredump

See the coredumpctl(1) man page for details.

用法

常用命令组合:

1
2
3
coredumpctl list                          // 查看崩溃的进程列表
coredumpctl debug [pid] // 调试崩溃进程
coredumpctl info [pid] // 查看崩溃进程的堆栈信息

查看崩溃进程列表

coredumpctl list

image

查看崩溃进程的堆栈信息

coredumpctl debug 26625

image

查看线程1的崩溃堆栈

image

如果你仔细点,应该会看到有一部分的堆栈并没有显示详细的信息,那是因为我们安装调试进程对应的符号包,执行以下命令并重新使用coredumpctl命令进行调试

sudo apt install dde-launcher-dbgsym

你会发现线程1的第3帧发现了我们熟知的函数,此时我们就可以到代码中进行排查了

image
Tips:也不一定就是我们代码的问题,理论上每一处都可能出问题,不过一般开发库出问题的概率较低,我们优先从自己的代码进行排查

查看所有的线程状态

info threads

image

会发现大部分的线程都处在 futex_wait_cancelable 的状态,一般就是阻塞了

切换到线程2,并查看堆栈

thread 2

bt
image

gdb

概述

调试神器,强大地有点过分,开发必备

安装

sudo apt install gdb

用法

// 调试正在运行的进程

sudo gdb -p [pid]

sudo gdb -p pidof dde-dock``

image
// 如果此时应用卡住了(可以理解为应用执行到了某一行代码/堆栈就停住了)

在gdb页面输入bt查看堆栈信息

image
这里一般只会显示一个线程的信息,有时候我们不确定是哪个线程卡死了

可以用info threads查看线程信息,并使用thread [index]切换到对应线程,再执行 bt 查看当前线程堆栈(可以用当前系统中实际运行的进程验证)。

(已经在 coredumpctl 章节介绍过 gdb 的部分命令了,其余的自行了解。我们不应该假定客户的电脑允许我们安装 qtcreator 或 vscode ,甚至可能不被允许重启异常的进程)

用真实的卡死进程进行展示:

新建test.c文件,内容如下:

#include “stdio.h”
int main () {
for (int i = 0; i < 10; ++i) {
if (i == 5) {
while(1);
}
printf(“%d\n”, i);
}
}

静态编译代码,保留代码信息:

g++ -g test.c -o test

image

执行当前进程,运行后进程卡死

./test

调试卡死进程,寻找卡死位置

sudo gdb -p pidof test``

image

dmesg

概述

查看内核日志,显示开机信息

用法

显示和内存、硬盘、USB、TTY相关的信息

sudo dmesg | grep -E "memory|dma|usb|tty"

image

实时查看内核日志,方便查看系统异常进程

sudo dmesg -w

Tips:当系统碰到一些硬件或者驱动相关的问题,可以使用dmesg命令辅助定位问题

top

概述

查看内存占用、进程id等信息

用法

普通的用法就是在终端中直接执行 top 命令,将会按照某种顺序列出系统中所有的进程信息

image

top -p [PID]

top 是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止

image

image

htop

安装

sudo apt install htop

用法

使用 htop 查看进程占用的资源信息,按 F4 进如筛选模式,可输入想查看的进程名进行匹配,如: dde-dock

image

pidof

概述

查看进程的PID

用法

比较简单,直接看下图:

image
场景

pkill dde-lock

将尝试杀死 dde-lock 开头的所有进程,这里系统中存在一个 root 进程 dde-lockservice ,因此会被误杀(不过因为权限不足,会提示不允许)

image

我们换一种方式,指定杀死对应的进程

kill -9 `pidof dde-lock`

image

tail

概述

默认将指定文件的最后10行打印到标准输出

用法

使用 -f 参数可实时查看日志文件内容的变化

image

也可指定实时输出最后20行:

sudo tail -f -n 20 /var/log/auth.log

image

如果不加 -f 参数,则不具有实时效果

概述

tail 是尾巴,head 是头,我想这个命令的作用大家应该猜出来了

用法

image

less

用法

使用 less 打开文件,支持高亮搜索内容

sudo less /var/log/auth.log

image

按/键进入搜索模式,输入”error”

image

v : 进入编辑模式,使用配置的编辑器编辑当前文件

F:进入 tail -f 模式

n : 向前查找下一个匹配的文本

N : 向后查找前一个匹配的文本

(是不是发现和 vim 命令类似了)

more

概述

按页显示,了解 less 其实就够用了,可以不看。

vim

概述

编辑工具,但我们也经常用来查看日志,尤其是在远程定位问题的时候

用法

我们用 cat 也可以查看文件,但当文件内容太多的时候,不方便定位某一处的文件内容

sudo vim /var/log/auth.log

image

内容太多,我只想在其中找到”error”相关的日志

1、先按 esc ,进入命令交互模式

2、输入”/“ + “error”

3、回车确认所搜结果

image

按 n 显示下一处匹配的内容

shift+n 显示上一处

image

Tips:在命令交互区域输入:set number可以显示文件行号

cat

概述

查看文件内容

用法

查看文件内容

cat 1.txt

还可以用于文件内容的合并

cat 1.txt 2.txt >> 3.txt

watch

概述

定时执行命令

场景

使用 rfkill 命令对无线设备上锁或解锁时,其锁定状态保存在内核文件中。

例如蓝牙的 soft block 的状态保存在 /sys/class/rfkill/rfkill0/soft 文件中,当我们用 unblock 解锁的时候,理论上可以看到这个文件变为0

image

crontab

概述

系统定时服务

安装

sudo apt install cron

用法

可以用来帮助实现一些定时操作,比如每周一到周五的下午6点让电脑爆炸(对应命令为let it boom)

1
2
3
4
5
6
7
8
9
10
[uos@uos-PC 17:29:14 ~]$crontab -h
crontab: 不适用的选项 -- h
crontab: usage error: unrecognized option
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)

编辑模式:
crontab -e
第一次进入会让你选择编辑器,挑自己熟悉的来即可

image

查看模式
crontab -l
让我们来实现爆炸的定时功能
进入编辑模式
在文件的最后添加如下内容,保存退出即可
0 17 * * 1 "let it boom"

(解释下上面的字段:
0:表示分钟为0的时候
17:下午5点
*:一个月的任意一天,你也可以写131的任意一个数字
*:任意一个月,你可以写1
12的任意一个数字
1-5:一周的1-5天,即周一到周五,也可直接写1,表示周一
“let it boom”: 上述时间条件满足后,要触发的命令 。要注意的是,这里的命令要写绝对路径,比如写”/usr/bin/echo 123”而不是写”echo 123”)

image

保存后使用 crontab -l 查看

image

查看 crontab 服务运行情况和任务的执行情况:

image

Tips: 如果服务状态为 inactive,我想你应该先看下 systemctl 命令的介绍

rsync

概述

通过快速差分算法,能够高效进行文件传输的程序

用法

将dir1文件夹中的内容复制到dir2中
rsync -av dir1/ dir2/

image

当dir1中新增一些文件中,如果我们想同步到dir2中,如果使用 cp -r 命令,会将之前已经同步的文件再复制一次,效率比较低。
此时可以再次执行 rsync -av dir1/ dir2/,只会进行增量拷贝,速度较快,当文件夹体积过大时,这种对比尤为明显。

rsync同样支持机器之间内容的转移,用法和ssh类似

讲远程机器桌面上的source.txt文件拷贝到当前目录

rsync -av uos@10.20.43.195:~/Desktop/source.txt ./

感兴趣的可以私下研究下下面两个练习题:
1、使用rsync + crond实现定时备份
2、使用rsync+inotify实现自动备份

Tips:
1、传统的 cp,scp 工具拷贝每次均为完整拷贝,而 rsync 除了完整拷贝,还具备增量拷贝的功能,因此从此性能及效率上更胜一筹。
2、man 手册里有大量的使用示例

scp

概述

用于 Linux 之间复制文件和目录

用法

复制文件命令格式

scp local_file remote_username@remote_ip:remote_folder

scp local_file remote_username@remote_ip:remote_file

复制目录命令格式

scp -r local_folder remote_username@remote_ip:remote_folder

scp -r local_folder remote_ip:remote_folder

记得先打开ssh服务

systemctl enable ssh.service --now

第一次使用 scp 传输内容,需要输入对应用户的密码

image

scp uos@10.20.6.139:~/Desktop/1.txt ./1.txt

image

apt-file

概述

从apt仓库中搜索存在指定文件的的package

安装

sudo apt install apt-file

用法

更新 source 中的缓存信息:

sudo apt-file update

查看哪些包中的文件(或文件的安装路径)包含了 dde-dock 字段

apt-file search dde-dock

image

locate

概述

定位电脑上某个文件所在位置,优点是比较快

安装

sudo apt install locate

用法

locate 与 find 不同, find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。locate 的速度比 find 快,它并不是真的查找,而是查数据库,一般文件数据库在 /var/lib/slocate/slocate.db 中,所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库 ,命令为:

updatedb

默认情况下 updatedb 每天执行一次。

locate dde-dock.log

image
find . -name dde-dock.log

image

find

概述

从指定路径查看文件

用法

1
2
[16:13:49] uos :: uos-PC  ➜  ~ » find /usr/bin -name "dde-dock"
/usr/bin/dde-dock

dpkg

概述

Debian包管理器

用法

查询系统中某个文件所属的包

dpkg -S /usr/lib/dde-dock/plugins/system-trays/libsound.so

image
dpkg -L 查看已安装的某个包中包含的文件列表

dpkg -L d-feet

image
dpkg-deb -c dde-session-shell_5.5.93_arm64.deb // 查看 deb 文件中包含的文件

解压指定deb文件到当前目录下的tmp文件夹

dpkg -X dde-session-shell_5.5.93_arm64.deb ./tmp

1
2
3
4
5
6
7
8
[16:23:51] uos :: uos-PC  ➜  ~/Desktop » dpkg -X dde-session-shell_5.5.93_arm64.deb ./tmp
./
./etc/
./etc/deepin/
./etc/deepin/greeters.d/
./etc/deepin/greeters.d/00-xrandr
./etc/deepin/greeters.d/10-cursor-theme
....

安装软件包

dpkg -i dde-session-shell_5.5.93_arm64.deb

安装软件包,忽略依赖关系(及时依赖不满足仍然会安装)

dpkg --force-depends -i debpackage

卸载软件包

dpkg -r debpackage

彻底卸载软件包

dpkg -p debpackage

查询系统中软件包的安装情况

dpkg -l |grep dde-session-shell

查看平台的架构类型

dpkg --print-architecture

apt

概述

相比 dpkg ,更侧重于用户的交互

用法

下载软件包的源码

apt source dde-dock

查看软件包的信息

apt-cache show dde-dock

下载软件包

apt download dde-dock

strings

概述

打印文件中可打印字符串

用法

strings 命令是二进制工具集 GNU Binutils 的一员,用于打印文件中可打印字符串, strings 命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。strings 命令对识别随机对象文件很有用。

cat /proc/self/environ | strings

image

grep

概述

查找文件里符合条件的字符串

越常见的命令越是隐藏着更多的功能,这里也只介绍常用功能,具体的见 man 手册

用法

cat .cache/deepin/dde-launcher/dde-launcher.log | grep "gsettings"

image

查找当前文件夹下中所有文件哪个文件中出现了 “dde-dock” 的字符串

grep -rn "dde-dock" .cache/

image

找是找到了,就是辣鸡信息太多,把这部分过滤掉,用到了 grep 的 -v 参数,继续往下看

grep -rn "dde-dock" .cache/ | grep -v "匹配"

image

常用于检索日志中某些关键字,如:grep "CPU" *.log -rn 遍历当前文件下文件名后缀为 .log 的文件,其中包含 “CPU” 关键字的行,并输出关键字所在的行号。见下面示例:

image

grep -i 忽略大小写进行匹配

grep -E [pattern] 使用正则表达式进行匹配

sudo cat /var/log/auth.log | grep -i deepin_AUTH | grep -E "验证|人脸"

ps -eo lstart,etime,cmd | grep -E 'dde-dock|startdde'

image

Tips:fish的一个好处就是可以高亮匹配上的关键字

awk

概述

文本处理工具

用法

输出 dde-session-daemon 进程的 pid

ps aux | grep dde-session-daemon | grep -v grep | awk '{print $2}'

image

Tips:这个命令的命名比较有意思,感兴趣的可以查阅下,为啥叫 awk

alias

概述

给命令设置一个别名

用法

精简打包命令:

1、编辑 ~/.bashrc 文件,在文件最后新增一行:

alias db="dpkg-buildpackage -us -uc -nc -j8"

2、退出并保存

3、source ~/.bashrc 使文件内容生效

4、以后再打包,直接输入 db 即可

image

更新shell默认的提示信息:

其实就是一个终端相关的环境变量,在 ~/.bashrc 文件中新增如下行即可

export PS1="\[\e[37;10m\][\[\e[32;10m\]\u\[\e[37;10m\]@\h \t \[\e[36;10m\]\w\[\e[0m\]]\$"

image

journalctl

概述

查询 systemd-journald 服务收集到的日志

用法

查询网络日志

image

查询内核日志

image

查看 startdde 的日志(一般用来分析 startdde 启动后按照什么顺序启动 dde-kwin,dde-session-daemon 和 dde-dock 的)

journalctl -b /usr/bin/startdde

image

查询指定进程的日志

image

systemctl

概述

查询或管理systemd服务的状态

用法

查询 systemd 管理的几种单元类型

systemctl --type=help

image

对应单元的列表

systemctl --type=service

image

列出所有单元及其状态

image

筛选 ssh 服务

systemctl --type=service | grep ssh

image

查询 ssh 服务的状态

systemctl status ssh.service

image

关闭 ssh 服务

systemctl stop ssh.service

开启 ssh 服务

systemctl start ssh.service

Tips:

系统级别单元文件路径: /etc/systemd/system//usr/lib/systemd/system

*用户级别单元文件路径:/etc/systemd/user//usr/lib/systemd/user*

ssh

概述

远程登录

用法

远程登录账户

ssh root@192.168.235.22

登录后可像操控自己的本地机器一样操控远端的机器

Q&A

碰到以下情况时,可执行ssh-keygen -Assh-keygen -R 10.20.43.195

1
2
3
ssh-keygen -f "/home/uos/.ssh/known_hosts" -R "10.20.43.11"
ECDSA host key for 10.20.43.11 has changed and you have requested strict checking.
Host key verification failed.

fdisk

概述

修改分区表

用法

列出分区信息
sudo fdisk -l

image

lsblk

概述

列出所有的块设备

用法

image

mount&umount

概述

挂载设备与取消挂载

用法

插上 u 盘试一下
sudo fdisk -l

image

得到u盘对应的设备文件为 /dev/sda ,取消u盘的挂载
umount /dev/sda

image

格式化 u 盘为 ext4 (关联3中还包含了其他格式的格式化命令,用法基本相同)
sudo mkfs.ext4 /dev/sda
等待命令执行完成即可

image

此时再挂载 u 盘到对应的目录(这里是挂载到 /media/uos 目录中)

image

mkfs

概述

格式化文件系统

用法

文件系统的格式众多,对应的格式化命令也很多,我们只需要知道常用的即可,下面的命令大致了解即可

1
2
3
mkfs.bfs       mkfs.exfat     mkfs.ext4      mkfs.msdos     mkfs.reiserfs  
mkfs.btrfs mkfs.ext2 mkfs.fat mkfs.nilfs2 mkfs.vfat
mkfs.cramfs mkfs.ext3 mkfs.minix mkfs.ntfs mkfs.xfs

df

概述

列出文件系统的整体磁盘使用量

用法

df

image

du

概述

查看磁盘使用量

用法

du .

image

pkill & killall

概述

杀死进程

用法

pkill dde-dock
killall dde-dock

pgrep

概述

按照名称返回查找的进程ID

用法
pgrep startdde

image

会输出以startdde开头的进程的pid

image

xprop

概述

显示指定窗口的 X 属性信息

用法

直接在终端中运行该命令,鼠标会变为十字光标,此时点击你要查看的窗口,终端中会输出此窗口的信息。
以任务栏界面为例:

image

问题1:为什么应用最大化时不会不会遮盖住任务栏呢
这里要看下上图中的 _NET_WM_STRUT_PARTIAL 属性,它描述了任务栏所在的区域,窗管会根据任务栏的这个窗口属性,将普通窗口最大化时,让其·避开·此区域。
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 1919
问题2:为什么是任务栏,窗管为什么不根据其他应用的这个属性去管理应用最大化的行为
将上图的内容往下翻:

image

注意这一行:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK

这里其实就表明 dde-dock 的身份,是作为一个 DOCK 类型的窗口 ,观察其他应用,会发现只有 dde-dock 的界面是有这个属性的,从而让窗管得知。(更具体的看下面的链接)

通过 xprop 我们可以获取到窗口的很多信息,比如窗口标题、窗口图标、是否支持最大化等

关联1—窗口属性介绍

篇幅较多,有单独的文档进行介绍,见《Linux窗口属性介绍》

xwininfo

概述

获取和显示指定窗口的信息,用法和功能都类似xprop

rfkill

概述

radio frequency kill的简写,用于管理无线电设备的软件状态(蓝牙、WIFI、GPS等)。可使某个设备处于可被软件重新激活的状态( 软锁定 /soft block )或软件无法重新激活的状态( 硬锁定 /hard block)

硬锁定/硬件锁定/硬锁:这种方式被锁定的设备,是无法通过软件手段开启的,大家对照下笔记本的F1~F12快捷键,一般都会有一个无线网的快捷键,按了之后,无线网就无法使用了(无法通过软件手段开启),除非再按一次,这就是 hard block (有的笔记本支持通过软件方式开启,是因为其实现方式是soft block而非hard block)。

用法

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
[18:37:35] uos :: uos-PC  ➜  ~ » rfkill --help

Usage:
rfkill [options] command [identifier ...]

Tool for enabling and disabling wireless devices.

Options:
-J, --json use JSON output format
-n, --noheadings don't print headings
-o, --output <list> define which output columns to use
--output-all output all columns
-r, --raw use the raw output format

-h, --help display this help
-V, --version display version

Available output columns:
DEVICE kernel device name
ID device identifier value
TYPE device type name that can be used as identifier
TYPE-DESC device type description
SOFT status of software block
HARD status of hardware block

Commands:
help
event
list [identifier]
block identifier
unblock identifier

For more details see rfkill(8)

常用命令就是上面列表的后三个

使用命令 rfkill list 获得设备列表,每个都包含与之关联的索引号 ,从 0 开始

rfkill list

image

这里可以看出蓝牙的索引为0,无线网卡的索引为1

如果我们对蓝牙设备开启软锁定,可以使用如下命令

rfkill block 0

image

这个时候打开你熟悉的控制中心,会发现蓝牙打不开了

如果要解锁,就执行

rfkill unblock 0

image

其他设备同理,只是需要你更换一下设备对应的索引号(注意,索引号并不是一成不变的,可以会随设备的变化而变化,只不过每次都是从0开始)

也可以用 all 代代替索引,表示所有的设备

rfkill block/unblock all

image

监听 rfkill 事件
rfkill event

image

Tips:
1、uos的飞行模式就通过 rfkill 来实现的哦
2、rfkill 的状态保存在对应的内核文件中,位于 /sys/class/rfkill/ 目录

xdg-open

概述

使用默认程序打开文件

用法

在终端中输入xdg-open ‘就可以使用文管打开当前的文件夹了

终端输入xdg-open a.txt就会在文本编辑器中打开 a.txt ,对于音频、视频以及各类文档都有效。

Tips:是不是可以用来验证默认程序设置是否生效呀。

ldd

概述

打印程序或者库文件所依赖的共享库列表

用法

ldd 不是一个可执行程序,而只是一个 shell 脚本。

image

ldd能够显示可执行模块的 dependency ,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:

export LD_TRACE_LOADED_OBJECTS=1

再执行任何的程序,如 ls 等,看看程序的运行结果。

ldd 显示可执行模块的 dependency 的工作原理,其实质是通过 ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so 模块会先于 executable 模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so 选择了显示可执行模块的 dependency 。

实际上可以直接执行 ld-linux.so 模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program

pstree

概述
Linux pstree(英文全称:display a tree of processes)) 命令将所有进程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 ( root ),如

果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。

用法

使用权限:所有使用者。

1
2
3
4
5
6
7
8
语法
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]

pstree -V
**参数说明**:

- -a 显示该进程的完整指令及参数, 如果是被记忆体置换出去的进程则会加上括号
- -c 如果有重覆的进程名, 则分开列出(预设值是会在前面加上 *)
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
[15:28:43] uos :: uos-PC  ➜  ~ » pstree                
systemd─┬─ECAgent───3*[{ECAgent}]
├─EasyMonitor
├─LocalPropertyRe───7*[{LocalPropertyRe}]
....
├─ipwatchd
├─lightdm─┬─Xorg───57*[{Xorg}]
│ ├─lightdm─┬─startdde─┬─DeepinAIAssista───12*[{DeepinAIAssista}]
│ │ │ ├─Typora─┬─Typora───Typora───44*[{Typora}]
│ │ │ │ ├─Typora───4*[{Typora}]
│ │ │ │ ├─Typora───28*[{Typora}]
│ │ │ │ ├─chrome-sandbox───Typora───Typora
│ │ │ │ └─31*[{Typora}]
....
│ │ │ ├─dde-clipboard───24*[{dde-clipboard}]
│ │ │ ├─dde-desktop───47*[{dde-desktop}]
│ │ │ ├─dde-launcher───41*[{dde-launcher}]
│ │ │ ├─dde-lock───26*[{dde-lock}]
│ │ │ ├─dde-osd───40*[{dde-osd}]
│ │ │ ├─dde-polkit-agen───5*[{dde-polkit-agen}]
│ │ │ ├─dde-printer-hel───9*[{dde-printer-hel}]
│ │ └─2*[{lightdm}]
│ └─2*[{lightdm}]
├─nmbd
....

chmod

概述

用于修改文件或目录的访问权限。它可以更改文件或目录的读、写、执行权限,以及文件或目录的所有权

image

用法

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式)/符号模式指定文件的权限

image

使用权限 : 所有使用者
语法
chmod [-cfvR] [--help] [--version] mode file...
参数说明
mode : 权限设定字串,格式如下 :

[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • +表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

符号模式

使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:

who 用户类型 说明
u user 文件所有者
g group 文件所有者所在组
o others 所有其他用户
a all 所用用户, 相当于 ugo

operator 的符号模式表:

Operator 说明
+ 为指定的用户类型增加权限
- 去除指定用户类型的权限
= 设置指定用户权限的设置,即将用户类型的所有权限重新设置

permission 的符号模式表:

模式 名字 说明
r 设置为可读权限
w 设置为可写权限
x 执行权限 设置为可执行权限
X 特殊执行权限 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
s setuid/gid 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
t 粘贴位 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

八进制语法

chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。

# 权限 rwx 二进制
7 读 + 写 + 执行 rwx 111
6 读 + 写 rw- 110
5 读 + 执行 r-x 101
4 只读 r– 100
3 写 + 执行 -wx 011
2 只写 -w- 010
1 只执行 –x 001
0 000

例如, 765 将这样解释:

  • 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
  • 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
  • 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。

场景
将文件 file1.txt 设为所有人皆可读取 :

chmod ugo+r file1.txt

将文件 file1.txt 设为所有人皆可读取 :

chmod a+r file1.txt

将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

chmod ug+w,o-w file1.txt file2.txt

为 ex1.py 文件拥有者增加可执行权限:

chmod u+x ex1.py

将目前目录下的所有文件与子目录皆设为任何人可读取 :

chmod -R a+r *

此外chmod也可以用数字来表示权限如 :

chmod 777 file

语法为:

chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

  • 若要 rwx 属性则 4+2+1=7;
  • 若要 rw- 属性则 4+2=6;
  • 若要 r-x 属性则 4+1=5。

chmod a=rwx file 和 chmod 777 file 效果相同

chmod ug=rwx,o=x file 和 chmod 771 file 效果相同

若用 chmod 4755 filename 可使此程序具有 root 的权限。

更多说明

命令 说明
chmod a+r file 给file的所有用户增加读权限
chmod a-x file 删除file的所有用户的执行权限
chmod a+rw file 给file的所有用户增加读写权限
chmod +rwx file 给file的所有用户增加读写执行权限
chmod u=rw,go= file 对file的所有者设置读写权限,清空该用户组和其他用户对file的所有权限(空格代表无权限)
chmod -R u+r,go-r docs 对目录docs和其子目录层次结构中的所有文件给用户增加读权限,而对用户组和其他用户删除读权限
chmod 664 file 对file的所有者和用户组设置读写权限, 为其其他用户设置读权限
chmod 0755 file 相当于u=rwx (4+2+1),go=rx (4+1 & 4+1)。0 没有特殊模式。
chmod 4755 file 4设置了设置用户ID位,剩下的相当于 u=rwx (4+2+1),go=rx (4+1 & 4+1)。
find path/ -type d -exec chmod a-x {} \; 删除可执行权限对path/以及其所有的目录(不包括文件)的所有用户,使用’-type f’匹配文件
find path/ -type d -exec chmod a+x {} \; 允许所有用户浏览或通过目录path/

chown

概述

英文全拼:change owner,命令用于设置文件所有者和文件关联组的命令。

Linux/Unix 是多人多工操作系统,所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户 ID,组可以是组名或者组 ID,文件是以空格分开的要改变权限的文件列表,支持通配符。 。

chown 需要超级用户 root 的权限才能执行此命令。

只有超级用户和属于组的文件所有者才能变更文件关联组。非超级用户如需要设置关联组可能需要使用 chgrp 命令。

使用权限 : root

用法
chown [-cfhvR] [–help] [–version] user[:group] file…

参数 :

  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • –help : 显示辅助说明
  • –version : 显示版本

场景
把 /var/run/httpd.pid 的所有者设置 root:

chown root /var/run/httpd.pid

将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup :

chown runoob:runoobgroup file1.txt

将当前前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:

chown -R runoob:runoobgroup *

把 /home/runoob 的关联组设置为 512 (关联组ID),不改变所有者:

chown :512 /home/runoob

附录

本文资料为以下链接的总结,可能大量借鉴其中内容,仅做分享交流之用,如有侵权,告知必删。

https://www.runoob.com/linux/linux-comm-chmod.html

https://www.runoob.com/linux/linux-comm-chown.html

 Comments