Linux基础指令:从Shell原理到权限

保姆级教程:用Python spatialdata框架搞定10x Xenium空间转录组数据(从下机到高级分析) 本教程详细介绍了如何使用Python spatialdata框架处理10x Xenium空间转录组数据,从数据获取到高级分析的全流程。涵盖环境配置、数据读取、质量控制、降维聚类、细胞注释及空间共定位分析等关键步骤,特别适合生物信息学研究者快速掌握Xenium数据分析技术。 阅读详情

你打开终端,敲下 ls,回车。屏幕上跳出一串文件名。

这一来一回花掉的时间不到一秒,但中间至少穿过了三层东西:Shell 把你的输入拆成命令和参数,内核替你执行真正的系统调用,驱动再去问磁盘要数据。你看到的每一个字符,都是这条链路往返一趟的结果。

命令行难以上手,往往是因为中间这层结构不可见。下面把 Linux 最基础的那批指令过一遍,同时说明它们为什么是这样设计的;从系统本身的由来开始,一直到讲到权限模型。

1. Linux 的由来

要讲 Linux,得先讲 UNIX。Linux 的大量设计都继承自它:一切皆文件、目录树、用一堆小工具拼出复杂功能。知道这些从哪儿来,后面的行为才讲得通。

1.1 从 Multics 到 UNIX

1968 年,通用电气、贝尔实验室和麻省理工学院的研究人员合作开发了一个叫 Multics 的操作系统。它在多任务文件管理和用户连接上综合了很多新概念,但工程上过于庞大。

1969 到 1970 年,AT&T 贝尔实验室的 Ken Thompson 和 Dennis Ritchie 在借鉴 Multics 诸多特点的基础上,开发出了 UNIX。它跑在小型机上,满足了科研环境对系统的要求。从一开始,UNIX 就是一个高效的、多用户多任务的操作系统。

1972 年,贝尔实验室开始发放商业版本。使用者之一是加州大学伯克莱分校的计算机系,伯克莱给系统加了许多新特性,这些特性后来成了标准。1975 年,伯克莱由其下属部门 BSD 发行了自己的 UNIX 版本,成为 AT&T 版本的主要竞争者。

1.2 分裂与标准化

版本一多,麻烦就来了:软件开发商不知道自己的程序该跑在哪个版本上合适。到 80 年代中期,出现了两个互相竞争的标准——AT&T 的 System V 和 BSD。

AT&T 为此成立了 UNIX 系统实验室,专门综合不同版本、集中开发标准系统。1991 年,该实验室综合 System V Release 3、SUN OS 和 Xenix 的特点,发行了 System V Release 4。IBM 和惠普等公司则组成了 Open Software Foundation(OSF)与之抗衡,于是市场上并存两个标准商业版本。

1993 年,AT&T 把 UNIX 转卖给 Novell,UNIX 系统实验室成为 Novell 的一部分。SUN 公司把 System V Release 4 融进了自己的 SUN OS,发行了 Solaris。原本互相竞争的两种图形界面(Motif 和 Openlook)也合并成了通用平台环境(CDE)。

1.3 Linux 的出现

1991 年 10 月 5 日,赫尔辛基大学的研究生 Linus Benedict Torvalds 在一个 Usenet 新闻组里宣布,他写出了一个类 UNIX 的小操作系统,取名 Linux。它受到另一个小型 UNIX 系统 Minix 的启发,而 Minix 出自 Andrew S. Tanenbaum 之手。

有个细节常被记错:Torvalds 当天发布的并不是 0.01 版,而是 0.02 版。真正的 0.01 从未公开发布过,因为它不实用,Torvalds 只在第一个 FTP 站点上提供过它的源代码。0.02 版已经能跑 GNU bash 和 gcc,以及为数不多的其他语言。

此后版本从 0.02 到 0.03,又跳到 0.10,随着世界各地程序员陆续加入,很快到了 0.95。正式的 1.0 版本在 1994 年公布。

1.4 严格来说,Linux 只是内核

这里要分清一件事:Linux 本身只是操作系统内核。加上用户空间的应用程序之后,才构成一个完整的 Linux 操作系统。

这正好解释了准确的说法:讲内核的时候说「Linux 内核」,讲完整系统的时候才说「Linux」。

GNU 通用公共许可协议(GNU General Public License,GPL)在这里起了关键作用。它最初由 Richard Stallman 为 GNU 计划撰写,赋予了计算机程序「自由软件」的定义:任何基于 GPL 软件开发衍生的产品,发布时必须采用 GPL 许可证,且必须公开源代码。

正因如此,任何个人和机构都可以自由使用、修改和再发布 Linux 的底层源代码。Linux 也由此成为开源软件最有名的代表。

1.5 发行版:内核之外的整套打包

既然内核加应用才是完整系统,那么「谁来打包」就成了分歧点。常见的发行版大致这样分:

发行版血统与定位
Debian极其稳定,适合服务器;对新手不算友好,更适合系统管理员和高级用户
UbuntuDebian 的衍生版,最受欢迎的免费系统之一;新手友好,服务器和云计算上都常见
RHEL第一款面向商业市场的发行版,支持 x86 与 x86_64 等多种架构
CentOS用 RHEL 的免费源代码重新构建,去掉了商标;用 YUM 管理软件包
Fedora红帽的测试平台,产品成为企业级发行版之前在这里开发测试
Kali LinuxDebian 衍生版,面向渗透测试,随带大量现成安全工具,用 APT 管理软件包

今天 Linux 的势力范围早已不限于服务器。移动端的 Android 就构建在 Linux 内核之上;路由器、电视、电子游戏机里也大量运行着定制版 Linux。

2. Shell:用户与内核之间的翻译层

严格说,Linux 指的是那个叫「内核(kernel)」的核心。但普通用户不能直接操作内核,中间隔着一层「外壳」程序,也就是 Shell。

Shell 最简单的定义是命令行解释器(command interpreter),它只做两件事:

  • 把用户的命令翻译给内核处理
  • 把内核的处理结果翻译回给用户

在这里插入图片描述

参照 Windows 更容易理解。操作 Windows 时同样不直接接触内核,而是通过图形界面:双击盘符、点开一个程序。Shell 在 Linux 中占据的就是图形界面那个位置,区别在于它接收的是文字,不是鼠标点击。

桌面界面如此直观,实际工作中却几乎都在使用命令行,原因在于图形界面把每一步操作都固定成了一个人工动作,而命令行可以写进脚本、可以互相拼接、可以顺着网络传输。一行 ps aux | grep nginx 表达的意思,点开若干个窗口也未必凑得出来,凑出来了也没法自动重复。远程运维时的区别更明显:SSH 传的是一行文本,不是像素。

2.1 远程登录

通常的开发方式是用终端软件连到远程 Linux 主机。流程就三步:

# 1. 在 Linux 主机上查自己的 IP
ifconfig

# 2. 在本地终端里连过去(ip 换成上一步看到的结果)
ssh 192.168.1.100

# 3. 提示输入用户名密码,输入即可登录

2.2 命令的通用形式

几乎所有 Linux 命令都是这个形式:

命令 [选项] [参数]

选项以 - 开头,可以合并写(ls -a -l 等价于 ls -al),参数则是命令作用的对象。这个结构不必刻意记忆,但掌握了它,查阅 man 手册时就知道该往哪里找。

另外三个热键值得提前熟悉,可以减少大量重复输入:

按键作用
Tab命令补全和文件名补全。按一下没反应就按两下,会列出所有候选
Ctrl+C让当前正在跑的程序停下来
Ctrl+D表示键盘输入结束(EOF),也可以用来退出当前 Shell

3. 路径:为什么每个文件都有唯一的名字

Linux 把磁盘上的文件和目录组织成一棵目录树,根是 /。这棵树有两个特点:

  • 普通文件一定是叶子节点
  • 目录可能是叶子(空目录),也可能是中间的路径节点

还有一条更重要的性质:任何一个节点都只有一个父节点。从根出发定位某个文件,路径因此是唯一的。树状组织存在的理由就在这里:要能快速、唯一地定位到指定文件。
由此引出两种写法:

  • 绝对路径:从 / 开始,不依赖当前所在位置
  • 相对路径:相对于当前所处目录来定位

两者的适用场景不同。绝对路径不会因为用户位置的改变而丧失唯一性,所以配置文件里经常用绝对路径;相对路径写起来短,命令行里用得多。

在这里插入图片描述

写路径时有两个符号需要记住:. 表示当前目录,.. 表示上一级目录。~ 则代表当前用户的家目录。

4. 定位与移动:pwd、ls、cd

4.1 pwd:我在哪

$ pwd
/home/jys/test

功能只有一个,但它是所有破坏性操作前成本最低的检查。执行 rm、mv 之前先运行 pwd,可以避免相当一部分误操作。

4.2 ls:观察目录

ls                 # 列出当前目录
ls -a              # 包括以 . 开头的隐藏文件
ls -l              # 长格式:权限、链接数、所有者、组、大小、时间
ls -d              # 把目录本身当文件显示,而不是列出它的内容
ls -i              # 显示 inode 索引号
ls -F              # 在文件名后加类型标记:* 可执行,/ 目录,@ 符号链接
ls -r              # 反向排序
ls -t              # 按修改时间排序
ls -R              # 递归列出所有子目录
ls -1              # 一行只输出一个文件

-F 会加上类型标记,可以直接看出条目类型:

标记含义
*可执行的普通文件
/目录
@符号链接
|FIFO(命名管道)
=套接字(socket)

-a 和 -l 组合起来是最常用的:

$ ls -al
total 12
drwxrwxr-x  3 jys jys 4096 Jan 11 15:01 .
drwx------ 22 jys jys 4096 Jan 11 14:21 ..
drwxrwxr-x  2 jys jys 4096 Jan 11 14:22 dir
-rw-rw-r--  1 jys jys    0 Jan 11 14:22 file.txt

4.3 读懂 ls -l 的输出

这一行的信息密度很高,值得逐段拆开。后面讲权限时会一直用到它:

-rwxr-xr--  1  owner  group  4096  Sep 16 15:30  index.html
│           │    │      │      │        │             │
│           │    │      │      │        │             └── 文件名
│           │    │      │      │        └── 最后修改时间
│           │    │      │      └── 文件大小(字节)
│           │    │      └── 所属组
│           │    └── 所有者
│           └── 硬链接数
│
└── 文件类型 + 权限
    │
    ├─ -        文件类型:普通文件
    │
    └─ rwxr-xr--
       ├─ rwx    所有者 (owner):读 ✓  写 ✓  执行 ✓
       ├─ r-x    所属组 (group):读 ✓  写 ✗  执行 ✓
       └─ r--    其他人 (others):读 ✓  写 ✗  执行 ✗

从左到右依次是:文件类型与权限位、硬链接数、所有者、所属组、大小(字节)、最后修改时间、文件名。开头那十个字符里,第一个是文件类型,剩下九个分三组,分别是所有者、组、其他人的权限。

4.4 cd:改变工作目录

$ cd ..                  # 回到上一级
$ cd /home/jys/test      # 绝对路径
$ cd ../temp/            # 相对路径
$ cd ~                   # 直接回家目录
$ cd -                   # 回到最近一次待过的目录

cd - 用于在两个目录之间来回切换:

$ pwd
/home/jys
$ cd /
$ cd -                   # 回到 /home/jys
$ cd -                   # 又回到 /

顺带一个容易忽略的约定:每新建一个用户,系统会在 /home 下创建以用户名命名的工作目录;而 root 用户在安装系统时就已经内置了工作目录 /root。

$ ls /home
jys  litao  wangwu

5. 创建与删除:touch、mkdir、rmdir、rm

5.1 touch:创建文件,或拨动时间

touch newFile.txt        # 文件不存在就创建空文件
touch -a newFile.txt     # 只改访问时间
touch -m newFile.txt     # 只改修改时间

touch 看似简单,背后却是文件系统里一个常被忽略的设计:每个文件有三个时间戳。用 stat 可以看得很清楚:

$ stat newFile.txt
  File: 'newFile.txt'
  Size: 0          Blocks: 0      IO Block: 4096  regular empty file
Device: fd01h/64769d  Inode: 1844719   Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1003/     jys)   Gid: ( 1003/     jys)
Access: 2023-01-11 15:06:45.832787572 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:06:45.832787572 +0800
 Birth: -
  • Access(atime):最后一次读取文件内容的时间
  • Modify(mtime):最后一次修改文件内容的时间
  • Change(ctime):最后一次修改文件元数据的时间

这里有一个容易被忽略的地方。执行 touch -a 只修改访问时间,但 Change 也会随之改变:

$ touch -a newFile.txt
$ stat newFile.txt
Access: 2023-01-11 15:07:00.062846804 +0800    # 变了
Modify: 2023-01-11 15:06:45.832787572 +0800    # 没变
Change: 2023-01-11 15:07:00.062846804 +0800    # 也变了

原因在于 Change 记录的是 inode 本身的变更。你修改了 atime,atime 是存在 inode 里的,所以 inode 被改动了,ctime 自然要更新。mtime 和 ctime 不是一回事:前者是内容,后者是元数据,这个区分在排查问题时经常用得上。

5.2 mkdir:创建目录

mkdir mydir                       # 创建单个目录
mkdir -p path1/path2/path3/path4  # 级联创建,父目录不存在会自动建

-p 很实用。没有它,mkdir a/b/c 在 a 不存在时会直接报错;有它,整条路径会被一次性建好。

$ mkdir -p path1/path2/path3/path4
$ tree path1
path1
└── path2
    └── path3
        └── path4

tree 不是系统自带的,需要单独装。root 用户直接 yum install -y tree,普通用户加 sudo 前缀。

5.3 rmdir:只能删空目录

rmdir mydir                    # 删除空目录
rmdir -p path1/path2/path3/path4   # 连同变空的父目录一起删

它的限制很明确:目录非空时无法删除。

$ touch path1/myfile.txt
$ rmdir -p path1/path2/path3/path4
rmdir: failed to remove directory 'path1/path2': Directory not empty

5.4 rm:删除工具

rm file.txt        # 删除文件
rm -i file.txt     # 删除前询问
rm -r dir          # 递归删除目录及其内容
rm -f file.txt     # 强制删除,不询问
rm -rf path1       # 递归强制删除,几乎不问

对比一下 rm 和 rmdir 的行为差异,能看出一致的设计取向:

$ rm dir
rm: cannot remove 'dir': Is a directory      # 不加 -r 删不了目录
$ rm -r dir                                  # 加 -r 才行
$ rm -f path1
rm: cannot remove 'path1': Is a directory    # -f 也不能替代 -r
$ rm -rf path1                               # 两个都需要

-r 和 -f 是两件事:-r 管递归,-f 管是否询问和是否忽略只读属性。它们不能互相替代。

rm -rf 需要单独提醒。它几乎不会给出任何确认机会,而 Linux 下没有回收站,删除后不可恢复。使用之前务必用 pwd 确认位置、用 ls 确认内容,并尽量避免与通配符一起使用。

6. 复制与移动:cp、mv

6.1 cp:复制

cp myfile.txt myfile-backup.txt    # 复制并改名
cp *.txt dir/                      # 通配符匹配多个文件,复制到目录
cp -r source_dir target_dir        # 递归复制目录
cp -i a.txt backup/a.txt           # 覆盖前询问
cp -f a.txt backup/a.txt           # 强制覆盖,不询问

* 是通配符,匹配任意长度的字符;? 匹配单个字符。cp a*.txt dir/ 会把所有以 a 开头的 .txt 文件一起复制过去。

默认行为要注意:如果目标文件已存在,cp 会直接覆盖,不问一声。

$ echo "hello jys" > myfile.txt
$ cp myfile.txt myfile-backup.txt
$ cat myfile-backup.txt
hello jys                       # 原内容被无声覆盖了

要避免这种沉默覆盖,用 -i:

$ cp -i myfile.txt myfile-backup.txt
cp: overwrite 'myfile-backup.txt'? y

6.2 mv:移动或重命名

mv 是 move 的缩写,但它的行为取决于第二个参数是什么:

  • 第二个参数是文件名:完成重命名,源只能有一个
  • 第二个参数是已存在的目录:把源移动进去,源可以有多个
mv myfile.txt yourfile.txt    # 重命名
mv myfile.txt temp/           # 移动到目录
mv temp ../                   # 目录也能移动
mv -i a.txt b.txt             # 目标存在时询问

重命名时同样有个陷阱:如果目标名已存在,改名等于覆盖。

$ touch myfile.txt yourfile.txt
$ mv yourfile.txt myfile.txt    # myfile.txt 的内容被 yourfile.txt 顶掉了

在意的话,同样用 -i 让系统先问一句。

7. 读文件:cat、more、less、head、tail

7.1 cat:一次性输出

cat temp.txt       # 输出全部内容
cat -b temp.txt    # 非空行编号,空行不编号
cat -n temp.txt    # 所有行编号,空行也编号
cat -s temp.txt    # 多行连续空行压缩成一行

-b 和 -n 的区别只在空行上,但差别很直观。假设文件中间有两行空行:

$ cat -b temp.txt
    1  hello jys
    2  hello jys
    3  hello jys
    4  hello jys        # 空行被跳过,不占编号
    5  hello jys

$ cat -n temp.txt
    1  hello jys
    2  hello jys
    3  hello jys
    4                   # 空行照样占一个编号
    5
    6  hello jys
    7  hello jys

-s 则用来收拾混乱的空行:

$ cat -s temp.txt      # 连续五个空行会被压成一个

7.2 more 与 less:分页查看

cat 的问题在于把整个文件一次性输出到终端。用 cat 打开几百 MB 的日志,终端会长时间无响应。

more 能分页,但只能向后翻,无法回看。less 才是 Linux 中通用的查看工具:

less -N app.log        # 显示行号
less -i app.log        # 搜索时忽略大小写

less 的优势在于交互。进入之后:

操作作用
/字符串向下搜索
?字符串向上搜索
n重复上一次搜索
N反向重复上一次搜索
PageUp / PageDown前后翻页
q退出

还有一个工程上的优势:less 在查看之前不会加载整个文件。打开几十 GB 的日志时,这一点决定了它是否可用。

7.3 head 与 tail:取头取尾

head temp.txt          # 默认前 10 行
head -5 temp.txt       # 前 5 行
tail temp.txt          # 默认后 10 行
tail -3 temp.txt       # 后 3 行
tail -f app.log        # 持续跟踪追加内容,Ctrl+C 退出

tail -f 在运维中使用频率极高,它让文件末尾的新内容实时显示在屏幕上,查看日志基本依靠它。

7.4 组合起来解决实际问题

有一个经典问题:如何显示文件的第 180 到 200 行?

单个命令无法完成,但把两个组合起来就可以:

$ head -200 temp.txt | tail -20
hello 180
hello 181
...
hello 199

先取前 200 行,再从这 200 行里取最后 20 行,落下来的正好是第 180 到 200 行。这里的 | 是管道,它把左边命令的输出直接交给右边命令当输入。

每个命令只做一件事,剩下的交给组合。这是 UNIX 留下来的思路,后面 grep、tail -f 用的是同一个方法。

8. 查找与别名

8.1 find:在目录树里找文件

find ~ -name test.c              # 在家目录下按名字找
find . -name '*.c'               # 当前目录及子目录下所有 C 文件
find /var/log -type f -mtime -1  # 一天内修改过的普通文件

find 会实际遍历目录树并访问磁盘,在大文件系统上可能很慢。如果需要在几十 GB 的磁盘上运行,通常会把它放到后台执行。

8.2 which 与 whereis:定位程序

两个命令容易混,区别在于找的范围:

$ which ls
alias ls='ls --color=auto'
       /usr/bin/ls

$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

which 回答「当前 PATH 里会执行哪个程序」,whereis 回答「这个程序相关的文件都散落在哪」——二进制、源码、手册页一起列出来。

8.3 alias:给命令起短名

alias hello='ls -a -l -n'    # 定义别名
alias ll='ls -alF'           # 最常用的一个
which hello                  # 可以看到别名确实生效了
unalias hello                # 取消别名

注意 which 的输出会先显示别名定义、再显示真实路径,这说明 Shell 在查找命令时是先看别名、再看 PATH。

别名默认只在当前 Shell 会话中有效。需要长期生效时,写进 ~/.bashrc,然后执行 source ~/.bashrc 重新加载。

8.4 grep:在文件里找内容

find 找的是文件,grep 找的是文件里的行:

grep "abcd" temp.txt      # 基本查找
grep -i "abcd" temp.txt   # 忽略大小写
grep -n "abcd" temp.txt   # 输出行号
grep -v "abcd" temp.txt   # 反向选择:输出不含该字符串的行

假设文件内容是 abcd / ABCD / hello / jys / 1234 五行,几个选项的效果对比就很清楚了:

$ grep -n "abcd" temp.txt
1:abcd

$ grep -ni "abcd" temp.txt
1:abcd
2:ABCD

$ grep -v "abcd" temp.txt
ABCD
hello
jys
1234

$ grep -vni "abcd" temp.txt
3:hello
4:jys
5:1234

选项可以叠加,-vni 就是「反向 + 显示行号 + 忽略大小写」三合一。

9. 时间与系统信息

9.1 date:格式化时间与时间戳

date                       # Wed Jan 11 18:22:50 CST 2023
date +%Y/%m/%d             # 2023/01/11
date +%Y/%m/%d-%H:%M:%S    # 2023/01/11-18:23:20

常用的格式标记:

标记含义
%Y完整年份(0000…9999)
%m月份(01…12)
%d日(01…31)
%H小时(00…23)
%M分钟(00…59)
%S秒(00…61)
%F等价于 %Y-%m-%d
%X等价于 %H:%M:%S

时间戳是另一块常用功能:

$ date +%s                   # 1673432636
$ date +%Y/%m/%d-%H:%M:%S -d @0
1970/01/01-08:00:00
$ date +%Y/%m/%d-%H:%M:%S -d @1000000000
2001/09/09-09:46:40

Unix 时间戳的定义是:从 1970 年 1 月 1 日 UTC 午夜开始所经过的秒数,不考虑闰秒。上面 @0 显示成 08:00:00 而不是 00:00:00,是因为系统时区是东八区。

date -s 能设置系统时间,但只有 root 有权限,普通用户只能查看。

9.2 cal:日历

cal            # 当前月
cal 1949       # 某一年
cal -3         # 前一个月、当前月、下一个月
cal -y         # 当前整年
cal -j         # 显示一年中的第几天

9.3 系统信息与资源

uname -a           # 内核名称、主机名、版本、硬件名、处理器类型等
lsb_release -a     # 发行版信息
top -d 1 -n 5      # 每隔 1 秒刷新,共刷新 5 次

top 默认会一直刷新,按 q 退出。-d 控制刷新间隔,-n 控制刷新次数。加上这两个参数,它就能被脚本调用了。

浮点运算可以交给 bc:

$ echo 'scale=4; 10 / 3' | bc
3.3333

9.4 关机

shutdown -h now        # 停掉服务后立即关机
shutdown -r now        # 重启
shutdown -t 60         # 60 秒后关机

10. 打包与压缩

这两个概念经常混淆,但它们实际上是两步:

  • 打包:把一堆文件合成一个文件,体积基本不变
  • 压缩:用算法把体积变小

tar 首先是打包工具,再通过选项去调用压缩程序。

10.1 tar 的参数速记

tar -cvf archive.tar dir/        # 只打包,不压缩
tar -zcvf archive.tar.gz dir/    # 打包并用 gzip 压缩
tar -jcvf archive.tar.bz2 dir/   # 打包并用 bzip2 压缩
tar -ztvf archive.tar.gz         # 不解包,直接看内容
tar -zxvf archive.tar.gz -C /tmp # 解压到指定目录

参数含义:

参数作用
-c创建归档(create)
-x解开归档
-t查看归档内的文件列表
-z用 gzip 压缩 / 解压
-j用 bzip2 压缩 / 解压
-v显示处理过程
-f指定归档文件名,后面必须紧跟文件名
-C解压到指定目录

-f 的位置是新手最容易出错的地方:它后面必须立即接文件名,中间不能再插别的参数。

打包时如果用了绝对路径,tar 会打印一句警告:

tar: Removing leading `/' from member names

这是刻意为之:归档里的路径会自动去掉开头的 /,免得解压时覆盖系统原有文件。

10.2 只解压其中一个文件

tar 允许你从归档里挑文件解出来。先用 -t 看清结构:

$ tar -ztvf /tmp/etc.tar.gz
...
etc/passwd
...

然后指定路径解压:

$ tar -zxvf /tmp/etc.tar.gz etc/passwd

注意路径写的是 etc/passwd,不带开头的 /,原因就是上面那条警告。

10.3 zip 与 unzip

跨平台交换文件时,ZIP 格式兼容性更好:

zip -r project.zip project/     # 递归压缩目录
unzip project.zip -d /tmp       # 解压到指定目录

如果需要在 Windows 和 Linux 之间传文件,rzsz 工具能让上传下载变成拖拽操作。

11. 权限:Linux 的安全模型

前面讲了那么多命令,但真正决定「谁能对什么做什么」的,是权限系统。

11.1 两种用户

Linux 下的用户分成两类:

  • 超级用户 root:可以做任何事,不受限制
  • 普通用户:只能做有限的事

提示符直接表明了身份:# 是 root,$ 是普通用户。这个视觉线索很实用,能让你时刻清楚自己当前持有的权限。

su                # 切换到 root(省略用户名)
su litao          # 从 root 切回普通用户

11.2 三种人,三种权限

权限是围绕「人」和「事」两个维度组织的。

先说人。访问者分三类:

符号身份
uUser,文件的所有者
gGroup,所有者所在的组
oOthers,其他用户

再说事。基础权限就三个:

权限权重对文件对目录
r4读取文件内容浏览目录内的信息
w2修改文件内容删除、移动目录内的文件
x1执行文件进入目录(cd)

同样一个 w,落在文件和目录上完全是两件事,最后一列尤其要看清楚。粘滞位就是从这个差别里长出来的。

不具某项权限时,用 - 占位。

11.3 权限的两种写法

九位权限位,每三位一组,每组权重固定是 4、2、1:

在这里插入图片描述

rwxr-xr-- 换算成数字就是:u = 4+2+1 = 7,g = 4+1 = 5,o = 4,合起来 754。

反过来,看到 644 就知道是 rw-r--r--。

11.4 文件类型也在第一位

ls -l 开头那个字符不只表示权限,第一位是文件类型:

字符类型
-普通文件
d目录
l软链接(类似 Windows 快捷方式)
b块设备(硬盘、光驱等)
c字符设备(屏幕等串口设备)
p管道文件
s套接口文件

无法确定文件的类型时,可以交给 file 命令,它按内容判断,不依赖扩展名:

$ file image.bin

11.5 chmod:改权限

有两种写法,对应两种使用习惯。

数字写法适合一次性设定完整权限:

chmod 664 abc.txt     # rw-rw-r--
chmod 640 abc.txt     # rw-r-----
chmod 755 run.sh      # rwxr-xr-x
chmod -R 750 private/ # 递归修改目录及内容

符号写法适合增量修改:

chmod u+w abc.txt     # 给所有者加写权限
chmod o-x abc.txt     # 去掉其他人的执行权限
chmod a=x abc.txt     # 所有人的权限都设为仅执行

符号写法的结构是「用户符号 + 操作符 + 权限字符」:

  • 用户符号:u(所有者)、g(同组)、o(其他人)、a(所有人)
  • 操作符:+ 增加、- 取消、= 直接赋值

一个限制要记住:只有文件的拥有者和 root 才能修改文件权限。

11.6 chown、chgrp、umask

chown user1 f1              # 改所有者
chown -R user1 filegroup1   # 递归改所有者
chgrp users /abc/f2         # 改所属组
chgrp -R users dir/         # 递归改所属组

umask 是最容易被忽略的一个,它决定了新建文件默认拿到什么权限。

新建文件的基础权限是 0666,新建目录是 0777。但实际创建出来往往不是这个值,因为还要被 umask 削一刀:
在这里插入图片描述

规则是:基础权限 & ~umask (取反再按位与)。umask 里为 1 的位,会把对应权限位清零。

umask          # 查看当前掩码
umask 044      # 设置掩码

超级用户默认掩码是 0022,普通用户默认 0002。所以 root 新建的目录通常是 755,文件是 644。

11.7 sudo:按需分配权力

root 权限强大也危险。更好的做法是让普通用户按需借用特定权限,配置文件是 /etc/sudoers:

# 格式:接受权限的用户  登陆的主机 = (执行命令的用户)  命令

配置好之后:

sudo -u root /usr/sbin/useradd u2

这样普通用户就能在授权范围内执行特定命令,而不是拿到完整的 root 权限。

12. 一个反直觉的结论:删除文件取决于目录权限

先看目录的三个权限分别意味着什么:

  • 没有 x:无法 cd 进这个目录
  • 没有 r:无法用 ls 查看目录内容
  • 没有 w:无法在目录里创建文件,也无法删除文件

前三点里,第三点可以推出一个不太合理的结论:只要用户对目录有 w 权限,就能删除目录中的任何文件,无论他对该文件本身是否具有写权限。

自己创建的文件,他人却能删除。这在实践中确实会发生:

$ chmod 0777 /home/
$ ls -ld /home/
drwxrwxrwx. 3 root root 4096 9月 19 15:58 /home/

$ touch /home/root.c          # root 建一个文件
$ su - litao                  # 切成普通用户 litao
$ rm /home/root.c             # litao 把 root 的文件删了

为什么会这样?因为删除文件修改的是它所在的目录,而不是文件本身。所谓删除,就是从目录项中移除一个名字。起决定作用的是目录的 w 权限,与文件自身的权限无关。

这个设计在共享目录里就是灾难。而 Linux 的解法是粘滞位:

$ chmod +t /home/         # 加上粘滞位
$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9月 19 16:00 /home/

权限位末位变成 t。再看效果:

$ su - litao
$ rm /home/root.c
rm: 无法删除"/home/root.c": 不允许的操作

在这里插入图片描述

加上粘滞位之后,目录里的文件只能由三种人删除:

  1. 超级管理员
  2. 该目录的所有者
  3. 该文件的所有者

/tmp 是粘滞位最典型的应用场景:它必须让所有人可写,但又不能让任何人删掉别人的东西。

12.1 权限问题的排查顺序

理解了上面的机制,排查权限问题时就有了固定顺序:

  1. 先看目录,再看文件。目录没有 x 就进不去,此时文件权限再宽松也没用
  2. 区分 r 和 x 对目录的不同含义。只有 r 没有 x,你能看到目录里的文件名,但读不了内容、也进不去
  3. 删除操作看父目录,不看文件本身

第 2 条最容易出错:误以为有读权限就能进入目录。实际上能否在目录下操作,门槛是 x 而不是 r。

13. 常见误区清单

把前面提到的易错点集中列出:

  1. 用 cat 打开大文件。几百 MB 的日志会使终端长时间无响应,应改用 less
  2. 混淆 > 和 >>。前者覆盖,后者追加
  3. 用 rm -f 删除目录。删除目录必须用 -r,-f 不能替代
  4. 以为 rm 有回收站。Linux 下删除后不可恢复,执行 rm -rf 之前先 pwd 和 ls
  5. 复制目录时漏掉 -r。cp 不加 -r 遇到目录会直接报错
  6. 以为 cp 和 mv 会提示覆盖。默认不提示,需要提示时加 -i
  7. tar 中 -f 后面插入了其他参数。-f 必须紧跟文件名
  8. 混淆 mtime 和 ctime。前者记录内容,后者记录元数据
  9. 以为有目录的 r 权限就能进入。真正决定能否进入的是 x
  10. 只看文件权限就判断能否删除。删除由父目录的 w 决定

结语

这批指令不必当作单词表来背。它们串在同一条线索上:目录树给每个文件一个唯一的位置,路径让你能精确定位到它,Shell 把你的意图翻译成内核可以执行的动作,权限决定你能否真正操作。这条线索理清了,命令本身反而容易记,因为每条命令要么在操作这棵树,要么在与这套权限打交道。

Serdes之什么是(CDR)? 光收发器和电收发器使用的是我们所说的串行数据通信。在这种通信方式中,数据位是按顺序一个接一个地传输的。光收发器和电收发器使用的是我们所说的串行数据通信。在这种通信方式中,数据位是按顺序一个接一个地传输的。目前市场上大多数收发器都没有专用的时钟输入,因此时钟恢复和数据重新定时等功能是在收发器外部(即在主板上)进行的。接收端则需要恢复时钟以采样串行线上的数据。为了实现这一点,接收端需要一个与输入数据频率大致相同的时钟。通过使参考时钟与输入数据信号的跳变相位对齐,可以生成一个恢复的时钟。这被称为时钟恢复。 阅读详情

相关推荐

学习十八-UJA107xA简介及移植-0

目录 1、UJA107xA系列手册 1、介绍 2.2.1 BAT引脚功能 2.4.1 V1、V2稳压器 2.5.1 CAN收发器 3.1 Startup Operation 3.2 Normal Operation 5.1 Attached Files 5.2 NXP UJA107xA Example Software 6、main() 1、UJA107xA系列手册 看完手册关于使用还是没有头绪的,只是想SPI发送指令将V2驱动起来,进而驱动起来CAN收...

m0_56344230的博客 1702

Linux 基础指令入门:常用命令、Shell 原理与权限管理

本文系统梳理了Linux命令行核心基础,涵盖路径操作(pwd、ls、cd)、文件管理(touch、mkdir、rm、cp、mv)、内容查看(cat、less、head、tail、grep)、打包压缩(tar、zip)、系统信息(uname、date、top)及权限管理(chmod、chown、umask)。强调在无图形界面的生产环境中掌握命令行是开发、运维必备技能。建议初学者按目录→文件→内容→权限顺序实操,并善用man手册查证,通过反复练习建立熟练度。

chttt11111的博客 233

Cesium+Three.js融合实战:从零构建GIS与BIM一体化大场景

本文详细介绍了Cesium与Three.js融合技术在GIS与BIM一体化大场景中的应用实践。通过坐标系转换、双引擎协同渲染等核心技术,实现宏观地理信息与微观建筑细节的完美结合,为智慧城市、数字孪生等项目提供高效解决方案。文章包含环境配置、性能优化等实战经验,助力开发者快速掌握三维可视化开发技巧。

weixin_42563415的博客 259

【Linux04】 Linux基础指令完结与Linux权限初识(一)

本文总结了Linux基础指令的学习要点,重点讲解了tar打包压缩、SCP远程传输、file文件类型识别等核心命令。通过实战演示和生动比喻,帮助读者掌握Linux权限系统的基本概念,包括Shell外壳原理和用户权限管理。文章还介绍了BC计算器、uname系统信息查看等实用工具,以及提高操作效率的快捷键技巧。最后探讨了Linux服务器持续运行的设计哲学,为后续深入理解操作系统内核与用户权限奠定基础。

huanghaocheng30的博客 1127

混沌系统在图像加密中的应用(随机性测试之FIPS 140-2测试和SP800-22测试)

本节内容我们将学习混沌序列的随机性测试,那么前面讲了,混沌系统产生的随机序列,它的随机性到底好不好,除了看相图、分岔图、指数图以外,还有一个非常重要的指标,那就是FIPS 140-2测试和SP800-22测试。(1)保证密码学模块的安全性:密码学模块在加密和解密敏感信息时使用随机数生成器来增加对手动解密和猜测攻击的抵抗力。通过进行FIPS 140-2测试,可以验证密码学模块是否符合安全标准,确保其实施和设计的安全性,以有效地保护敏感信息。

weixin_42207434的博客 2085

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

【Linux专栏】Linux操作系统初识以及基本指令学习

本文系统介绍了Linux操作系统的基础知识和常用操作。主要内容包括:1. Linux系统代码获取方法;2. 常用基础指令详解,涵盖文件操作、权限管理、系统监控等50余个核心命令;3. Linux权限管理机制,包括用户角色划分、权限属性修改及权限掩码原理;4. 系统架构与操作系统内核解读。文章通过具体命令示例和权限管理案例,帮助读者快速掌握Linux系统的基本操作和权限控制方法,为Linux系统管理打下坚实基础。

2401_88485715的博客 975

【QGIS】利用“创建网格”功能实现区域等距分割与坐标转换实战

本文详细介绍了如何在QGIS中使用“创建网格”工具实现区域等距分割。通过实战演示,将北京市行政区划切割为150米正方形网格,并重点讲解了关键步骤:选择投影坐标系EPSG:3857以确保网格尺寸精确,以及将结果转换为常用的WGS84经纬度坐标。文章还涵盖了进阶技巧与常见问题解决方案,帮助用户高效完成空间网格化分析任务。

weixin_29232507的博客 94

shell原理及Linux权限

1.目录的可执行权限是表示你可否在目录下执行命令。2.如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)3.而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。目录的w权限决定!

暴躁小吕的博客 1万+

深入解析 ReDoc:从零构建高性能 API 文档的终极指南

ReDoc 是一个强大的开源工具,用于将 OpenAPI 规范转换为高质量、响应式的 API 文档。本文详细介绍了如何使用 ReDoc 构建和自定义 API 文档,包括如何编写支持 OpenAPI 的 API 注解、配置 HTML 页面以加载文档,以及如何利用 ReDoc 的高级功能进行定制。通过实例代码,您将学会如何灵活地展示 API 文档,提升用户体验。无论是初学者还是经验丰富的开发者,都能从本文中获得实用的技巧与方案,帮助快速搭建符合需求的 API 文档界面。

楠搏万的博客 4621

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

【Linux基础】指令、shell原理与权限管理详解

文章介绍了Linux系统中的常用指令、权限管理与Shell运行原理。主要内容包括: 打包压缩指令(zip/unzip/tar/scp)实现文件传输与归档; Shell解释器作为用户与内核的桥梁,保护系统并简化操作; 权限体系以角色(拥有者/组/other)和属性(rwx)为核心,通过chmod、chown等命令控制访问; 特殊场景如目录权限(x为进入、r为查看内容)、root用户权限豁免等。 最后强调Linux通过权限机制实现多用户隔离,保障系统安全。(150字) 关键词:Linux指令、She

键盘敲碎了雾霭的博客 2314

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1627

【Linux】Shell运行原理和Linux权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限 所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

m0_68931081的博客 4061

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux——基础指令2 + 权限

打包、压缩:使用特定的算法,文件进行合并或者压缩,减少体积。打包/压缩作为一个整体。原因:1)文件体积减少,节省资源、磁盘空间,减少网络传输成本2)多个文件转一个文件,可以提高文件传输的容错性语法: zip 压缩文件.zip 目录或文件功能: 将目录或文件压缩成zip格式常用选项:-r 递 归处理,将指定目录下的所有文件和子目录一并处理举例:可以得到结果如下:再进行解压操作如下:unzip XX.zip -d 路径 //解压到指定路径中。

2406_83392683的博客 2771

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux——Shell运行原理以及Linux权限

大家发现,我们对dir目录来说是other,我们拥有对其写的权限,那么我在dir目录下创建一个新文件test7.txt,此时大家注意这个文件没有写权限,但是我们还是能将它删除,所以这个现象就比较奇怪了,我不能“写”这个文件,但是却可以直接删除它,为了解决这个不合理的问题,Linux引入了。只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。2)在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。

2302_81486993的博客 6367

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Linux】Linux权限管理————shell运行原理 | Linux权限管理 | 粘滞位 | 权限掩码umask

Linux权限管理详细解析、配有动图以及生动小故事去理解、详细到位的讲解了各种权限的面试题,有需要的可以点进来看看,不后悔

qq_42996461的博客 2292

【Linux】shell运行原理及权限

Linux权限!!!

qq_55119554的博客 1103

<Linux> shell运行原理及Linux权限的理解

Linux严格意义上来说是一个操作系统,我们称之为 “核心 (kernel)”,即Linux内核;但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel? Linux中是如何管理权限的?接下来让我们去学习。

m0_64224788的博客 1544

Linux系统学习【Linux基础指令以及权限问题】

Linux系统知识学习指南 摘要 本文系统介绍了Linux操作系统的发展历程、开源特性、应用场景及主流发行版本。Linux诞生于1991年,以其开源特性成为服务器、嵌入式设备和云计算领域的核心系统。文章详细分析了Linux在企业服务器(75%市场份额)、桌面系统、移动嵌入式(如Android)及大数据领域的重要地位,并对比了Debian、Ubuntu、CentOS等主流发行版的特点。最后针对学习环境搭建,通过表格对比了虚拟机、云服务器等方案的优劣,为开发者提供全面的Linux学习路径。 关键词:Linux、

承于所学,探技术之渊;以代码求政,寻成长之道。 1676

【Linux】Shell命令运行原理和权限详解

因此,当一个目录被设置为"粘滞位"(chmod +t),则该目录下的文件只能由(1)超级管理员删除(2)该目录的所有者删除(3)该文件的所有者删除好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

weixin_75128035的博客 1827

【Linux】Linux权限管理 —— shell运行原理 | 权限 | 目录权限 | 粘滞位 | 权限掩码umask

怎么就累了,倦了,相忘了

浮光掠影 4586

【Linux】shell运行原理及权限概念

shell命令以及运行原理 什么是 Shell 命令 Shell 是一个命令行解释器,它接收用户输入的命令,并将这些命令传递给操作系统内核执行。常见的 Shell 有 Bash(Bourne - Again Shell)、Zsh、Fish 等。Shell 命令就是用户在 Shell 环境下输入的用于完成各种任务的指令。 例如,ls是一个基本的 Shell 命令,用于列出目录中的文件和子目录。cp命令用于复制文件,mkdir用于创建目录等。这些命令可以通过在终端(命令行界面)中输入来执行。

2301_80319993的博客 1991

Linux简单指令3+shell原理+权限

查找指定命令,并返回其绝对路径,只在系统文件中去查找。

xsc2004zyj的博客 1018

Linux(一)Linux的基本指令操作和shell命令以及运行原理

Linux的基本指令操作和shell命令以及运行原理

2501_94404690的博客 1278

Shell 的运行原理以及 Linux 权限

本篇文章主要详细介绍 Linux 中的权限问题,干货满满,赶紧进来学习吧。

2302_79341182的博客 1062
上一篇: Node.js 与 MCP:从 JavaScript 运行时到大模型的标准接口
下一篇: 认识 AI Agent:概念、架构、设计模式与主流框架
jinyishu_
博客等级 码龄1年 53粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值