基本涵盖了Linux下开发常用的命令,适合刚接触Linux的小伙伴。
fish
安装
sudo apt install fish
概述
命令提示&补全工具
用法fish
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
// 匹配出剪贴板的服务名
根据印象找到对应的服务应该为 com.deepin.dde.Clipboard
qdbus com.deepin.dde.Clipboard /
利用 qdbus 命令提供的自动补全机制(按 tab 键)得到对应的 path 列表
qdbus com.deepin.dde.Clipboard /com/deepin/dde/Clipboard
继续利用 tab 进行命令的补全
得到完整的命令
Q&A:
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]
pmap
概述
查询进程的内存映射信息,常用于查看进程运行时链接了哪些动态库
用法
pmap -p [pid]
coredumpctl
安装
sudo apt install systemd-coredump
概述
进程崩溃或卡死时的调试神器
介绍
1 | coredumpctl [OPTIONS...] |
用法
常用命令组合:
1 | coredumpctl list // 查看崩溃的进程列表 |
查看崩溃进程列表
coredumpctl list
查看崩溃进程的堆栈信息
coredumpctl debug 26625
查看线程1的崩溃堆栈
如果你仔细点,应该会看到有一部分的堆栈并没有显示详细的信息,那是因为我们安装调试进程对应的符号包,执行以下命令并重新使用coredumpctl命令进行调试
sudo apt install dde-launcher-dbgsym
你会发现线程1的第3帧发现了我们熟知的函数,此时我们就可以到代码中进行排查了
Tips:也不一定就是我们代码的问题,理论上每一处都可能出问题,不过一般开发库出问题的概率较低,我们优先从自己的代码进行排查
查看所有的线程状态
info threads
会发现大部分的线程都处在 futex_wait_cancelable 的状态,一般就是阻塞了
切换到线程2,并查看堆栈
thread 2
bt
gdb
概述
调试神器,强大地有点过分,开发必备
安装
sudo apt install gdb
用法
// 调试正在运行的进程
sudo gdb -p [pid]
sudo gdb -p
pidof dde-dock``
// 如果此时应用卡住了(可以理解为应用执行到了某一行代码/堆栈就停住了)
在gdb页面输入bt查看堆栈信息
这里一般只会显示一个线程的信息,有时候我们不确定是哪个线程卡死了
可以用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
执行当前进程,运行后进程卡死
./test
调试卡死进程,寻找卡死位置
sudo gdb -p
pidof test``
dmesg
概述
查看内核日志,显示开机信息
用法
显示和内存、硬盘、USB、TTY相关的信息
sudo dmesg | grep -E "memory|dma|usb|tty"
实时查看内核日志,方便查看系统异常进程
sudo dmesg -w
Tips:当系统碰到一些硬件或者驱动相关的问题,可以使用dmesg命令辅助定位问题
top
概述
查看内存占用、进程id等信息
用法
普通的用法就是在终端中直接执行 top 命令,将会按照某种顺序列出系统中所有的进程信息
top -p [PID]
top 是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止
htop
安装
sudo apt install htop
用法
使用 htop 查看进程占用的资源信息,按 F4 进如筛选模式,可输入想查看的进程名进行匹配,如: dde-dock
pidof
概述
查看进程的PID
用法
比较简单,直接看下图:
场景
pkill dde-lock
将尝试杀死 dde-lock 开头的所有进程,这里系统中存在一个 root 进程 dde-lockservice ,因此会被误杀(不过因为权限不足,会提示不允许)
我们换一种方式,指定杀死对应的进程
kill -9 `pidof dde-lock`
tail
概述
默认将指定文件的最后10行打印到标准输出
用法
使用 -f 参数可实时查看日志文件内容的变化
也可指定实时输出最后20行:
sudo tail -f -n 20 /var/log/auth.log
如果不加 -f 参数,则不具有实时效果
head
概述
tail 是尾巴,head 是头,我想这个命令的作用大家应该猜出来了
用法
less
用法
使用 less 打开文件,支持高亮搜索内容
sudo less /var/log/auth.log
按/键进入搜索模式,输入”error”
v : 进入编辑模式,使用配置的编辑器编辑当前文件
F:进入 tail -f 模式
n : 向前查找下一个匹配的文本
N : 向后查找前一个匹配的文本
(是不是发现和 vim 命令类似了)
more
概述
按页显示,了解 less 其实就够用了,可以不看。
vim
概述
编辑工具,但我们也经常用来查看日志,尤其是在远程定位问题的时候
用法
我们用 cat 也可以查看文件,但当文件内容太多的时候,不方便定位某一处的文件内容
sudo vim /var/log/auth.log
内容太多,我只想在其中找到”error”相关的日志
1、先按 esc ,进入命令交互模式
2、输入”/“ + “error”
3、回车确认所搜结果
按 n 显示下一处匹配的内容
shift+n 显示上一处
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
crontab
概述
系统定时服务
安装
sudo apt install cron
用法
可以用来帮助实现一些定时操作,比如每周一到周五的下午6点让电脑爆炸(对应命令为let it boom)
1 | [uos@uos-PC 17:29:14 ~]$crontab -h |
编辑模式:crontab -e
第一次进入会让你选择编辑器,挑自己熟悉的来即可
查看模式crontab -l
让我们来实现爆炸的定时功能
进入编辑模式
在文件的最后添加如下内容,保存退出即可0 17 * * 1 "let it boom"
(解释下上面的字段:
0:表示分钟为0的时候
17:下午5点
*:一个月的任意一天,你也可以写131的任意一个数字12的任意一个数字
*:任意一个月,你可以写1
1-5:一周的1-5天,即周一到周五,也可直接写1,表示周一
“let it boom”: 上述时间条件满足后,要触发的命令 。要注意的是,这里的命令要写绝对路径,比如写”/usr/bin/echo 123”而不是写”echo 123”)
保存后使用 crontab -l
查看
查看 crontab 服务运行情况和任务的执行情况:
Tips: 如果服务状态为 inactive,我想你应该先看下 systemctl 命令的介绍
rsync
概述
通过快速差分算法,能够高效进行文件传输的程序
用法
将dir1文件夹中的内容复制到dir2中rsync -av dir1/ dir2/
当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 传输内容,需要输入对应用户的密码
scp uos@10.20.6.139:~/Desktop/1.txt ./1.txt
apt-file
概述
从apt仓库中搜索存在指定文件的的package
安装
sudo apt install apt-file
用法
更新 source 中的缓存信息:
sudo apt-file update
查看哪些包中的文件(或文件的安装路径)包含了 dde-dock 字段
apt-file search dde-dock
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
find . -name dde-dock.log
find
概述
从指定路径查看文件
用法
1 | [16:13:49] uos :: uos-PC ➜ ~ » find /usr/bin -name "dde-dock" |
dpkg
概述
Debian包管理器
用法
查询系统中某个文件所属的包
dpkg -S /usr/lib/dde-dock/plugins/system-trays/libsound.so
dpkg -L
查看已安装的某个包中包含的文件列表
dpkg -L d-feet
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 | [16:23:51] uos :: uos-PC ➜ ~/Desktop » dpkg -X dde-session-shell_5.5.93_arm64.deb ./tmp |
安装软件包
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
grep
概述
查找文件里符合条件的字符串
越常见的命令越是隐藏着更多的功能,这里也只介绍常用功能,具体的见 man 手册
用法
cat .cache/deepin/dde-launcher/dde-launcher.log | grep "gsettings"
查找当前文件夹下中所有文件哪个文件中出现了 “dde-dock” 的字符串
grep -rn "dde-dock" .cache/
找是找到了,就是辣鸡信息太多,把这部分过滤掉,用到了 grep 的 -v 参数,继续往下看
grep -rn "dde-dock" .cache/ | grep -v "匹配"
常用于检索日志中某些关键字,如:grep "CPU" *.log -rn
遍历当前文件下文件名后缀为 .log 的文件,其中包含 “CPU” 关键字的行,并输出关键字所在的行号。见下面示例:
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'
Tips:fish的一个好处就是可以高亮匹配上的关键字
awk
概述
文本处理工具
用法
输出 dde-session-daemon 进程的 pid
ps aux | grep dde-session-daemon | grep -v grep | awk '{print $2}'
Tips:这个命令的命名比较有意思,感兴趣的可以查阅下,为啥叫 awk
alias
概述
给命令设置一个别名
用法
精简打包命令:
1、编辑 ~/.bashrc 文件,在文件最后新增一行:
alias db="dpkg-buildpackage -us -uc -nc -j8"
2、退出并保存
3、source ~/.bashrc
使文件内容生效
4、以后再打包,直接输入 db 即可
更新shell默认的提示信息:
其实就是一个终端相关的环境变量,在 ~/.bashrc 文件中新增如下行即可
export PS1="\[\e[37;10m\][\[\e[32;10m\]\u\[\e[37;10m\]@\h \t \[\e[36;10m\]\w\[\e[0m\]]\$"
journalctl
概述
查询 systemd-journald 服务收集到的日志
用法
查询网络日志
查询内核日志
查看 startdde 的日志(一般用来分析 startdde 启动后按照什么顺序启动 dde-kwin,dde-session-daemon 和 dde-dock 的)
journalctl -b /usr/bin/startdde
查询指定进程的日志
systemctl
概述
查询或管理systemd服务的状态
用法
查询 systemd 管理的几种单元类型
systemctl --type=help
对应单元的列表
systemctl --type=service
列出所有单元及其状态
筛选 ssh 服务
systemctl --type=service | grep ssh
查询 ssh 服务的状态
systemctl status ssh.service
关闭 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 -A
或ssh-keygen -R 10.20.43.195
1 | ssh-keygen -f "/home/uos/.ssh/known_hosts" -R "10.20.43.11" |
fdisk
概述
修改分区表
用法
列出分区信息sudo fdisk -l
lsblk
概述
列出所有的块设备
用法
mount&umount
概述
挂载设备与取消挂载
用法
插上 u 盘试一下sudo fdisk -l
得到u盘对应的设备文件为 /dev/sda ,取消u盘的挂载umount /dev/sda
格式化 u 盘为 ext4 (关联3中还包含了其他格式的格式化命令,用法基本相同)sudo mkfs.ext4 /dev/sda
等待命令执行完成即可
此时再挂载 u 盘到对应的目录(这里是挂载到 /media/uos 目录中)
mkfs
概述
格式化文件系统
用法
文件系统的格式众多,对应的格式化命令也很多,我们只需要知道常用的即可,下面的命令大致了解即可
1 | mkfs.bfs mkfs.exfat mkfs.ext4 mkfs.msdos mkfs.reiserfs |
df
概述
列出文件系统的整体磁盘使用量
用法
df
du
概述
查看磁盘使用量
用法
du .
pkill & killall
概述
杀死进程
用法
pkill dde-dock
killall dde-dock
pgrep
概述
按照名称返回查找的进程ID
用法pgrep startdde
会输出以startdde开头的进程的pid
xprop
概述
显示指定窗口的 X 属性信息
用法
直接在终端中运行该命令,鼠标会变为十字光标,此时点击你要查看的窗口,终端中会输出此窗口的信息。
以任务栏界面为例:
问题1:为什么应用最大化时不会不会遮盖住任务栏呢
这里要看下上图中的 _NET_WM_STRUT_PARTIAL 属性,它描述了任务栏所在的区域,窗管会根据任务栏的这个窗口属性,将普通窗口最大化时,让其·避开·此区域。_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 1919
问题2:为什么是任务栏,窗管为什么不根据其他应用的这个属性去管理应用最大化的行为
将上图的内容往下翻:
注意这一行:_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 | [18:37:35] uos :: uos-PC ➜ ~ » rfkill --help |
常用命令就是上面列表的后三个
使用命令 rfkill list
获得设备列表,每个都包含与之关联的索引号 ,从 0 开始
rfkill list
这里可以看出蓝牙的索引为0,无线网卡的索引为1
如果我们对蓝牙设备开启软锁定,可以使用如下命令
rfkill block 0
这个时候打开你熟悉的控制中心,会发现蓝牙打不开了
如果要解锁,就执行
rfkill unblock 0
其他设备同理,只是需要你更换一下设备对应的索引号(注意,索引号并不是一成不变的,可以会随设备的变化而变化,只不过每次都是从0开始)
也可以用 all 代代替索引,表示所有的设备
rfkill block/unblock all
监听 rfkill 事件rfkill event
Tips:
1、uos的飞行模式就通过 rfkill 来实现的哦
2、rfkill 的状态保存在对应的内核文件中,位于 /sys/class/rfkill/ 目录
xdg-open
概述
使用默认程序打开文件
用法
在终端中输入xdg-open
‘就可以使用文管打开当前的文件夹了
终端输入xdg-open a.txt
就会在文本编辑器中打开 a.txt ,对于音频、视频以及各类文档都有效。
Tips:是不是可以用来验证默认程序设置是否生效呀。
ldd
概述
打印程序或者库文件所依赖的共享库列表
用法
ldd 不是一个可执行程序,而只是一个 shell 脚本。
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 | 语法 |
1 | [15:28:43] uos :: uos-PC ➜ ~ » pstree |
chmod
概述
用于修改文件或目录的访问权限。它可以更改文件或目录的读、写、执行权限,以及文件或目录的所有权
用法
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式)/符号模式指定文件的权限
使用权限 : 所有使用者
语法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
附录
本文资料为以下链接的总结,可能大量借鉴其中内容,仅做分享交流之用,如有侵权,告知必删。