上了近六周的操作系统理论课,最近终于开始做实验了。关于 Linux 这块,不想学得太深入,但是以后部署项目到服务端也会涉及到这部分的知识,所以一些基本的概念和操作还是有必要学一学的。这篇笔记就作为平时查看的手册。

以下操作基于 Ubuntu 。

帮助指令

1. man

用法:man + 参数

查看相关命令、相关文件等的使用手册。Ctrl+f 上一页,Ctrl+b 下一页,Ctrl+Home 第一页,Ctrl+End 最后一页,q 退出回到终端

输入 man man 查找 man 命令本身的使用手册:

可以看到数字代表相关类型的帮助所在的章节,比如数字 1 就代表 shell 指令的相关帮助,所以 man man 等价于 man 1 man。之所以要用数字进行区分,是为了防止重名带来的指向不明确,比如 passwd 可能是文件或者指令,当加上数字 1 的时候,指的是指令;加上 5 的时候,指的是文件。

如果不知道指的是什么,就用 man -a xxx,这样就默认在所有章节的手册中查找相关帮助。

使用手册默认是英文的,可以安装汉化包(先切换到 root 用户):

apt-get install manpages-zh
vi /etc/manpath.config
:1,$s#/usr/share/man#/usr/share/man/zh_CN#g

2. help

用法:

  • help + 参数:内部命令,比如 help cd

  • 参数 + --help:外部命令,比如 ls --help

help 用于查询外部命令和内部命令的使用手册。内部命令指的是 shell 内嵌的(shell builtin),其它命令则是外部命令(is hashed)

3. info

用法:info + 参数

info 作为 help 的补充,会更加详细。

目录管理

1. 目录结构

/ :根目录

/bin:存放常用的二进制可执行命令,如 ls,mv 等,通常与 /usr/bin 内容一样。

/dev:存放与设备有关的特殊文件,如 /dev/fd0 代表软盘,/dev/cdrom 代表光盘。

/etc:存放系统管理和配置的文件,如用户的账号、密码以及系统的主要设置。

/home:为用户设置的主目录,每一个普通用户在 home 下都有对应的普通用户家目录,比如 chor 就有 /home/chor ,可用 ~ 表示。

/root:root 用户的超级用户家目录,也可用 ~ 表示。

/lib:标准程序设计库,或动态链接共享库。

/sbin:系统管理命令,存放系统管理员程序,如 fdisk、mount 等。

/boot:存放 Linux 核心与启动和关闭系统有关的文档。

/mnt:其他文件系统的挂载点。

/var:系统预先设置的工作目录,如各种服务的日志文件和收发的邮件等。

/proc:虚拟目录,是系统内存的映射,通过访问该目录获取系统信息。

/tmp:公用的临时文件存储点。

/usr:最庞大和最主要的目录之一,要用到的应用程序和文件几乎都在这个目录。

  • /usr/bin :应用程序
  • /usr/sbin:超级用户的管理程序
  • /usr/local:存放本地增加的命令
  • /usr/lib:存放常用动态链接库和软件包的配置文件
  • /usr/src:保存 Linux 内核的源代码,编译内核时必须用到
  • /usr/share:Linux 的说明文档
  • /usr/include:Linux 下编程需要的头文件

2. 目录查看

pwd

显示当前所在目录(路径)

ls

ls:显示当前所在路径下的文件

ls + 路径:显示指定路径下的文件

ls -l:显示当前所在路径下的文件,并且带有详情(修改时间、大小、权限等)

ls -a:显示当前所在路径下的文件,包括隐藏文件

ls -r:按照文件名逆序显示当前所在路径下的文件

ls -t:按照时间顺序显示当前所在路径下的文件

ls -R:递归显示当前所在路径下的文件,包括文件里面的文件

ls -lartR:上面几种查看方式的组合

ls xxx*:显示当前所在路径下以 xxx 开头的文件

PS:如果要目标是指定路径下,再加上第三个参数即可

cd

用法:

  • cd + 绝对路径

  • cd + 相对路径

  • cd - :回到上一次 cd 进去的目录

  • cd ~ :回到用户家目录(/home/xxx 或者 /root

切换当前工作目录。另外,shell 提供了路径补全功能,按 tab 可以自动补全路径

3. 目录创建和删除

mkdir folder1 folder2:在当前目录下创建 folder1 目录和 folder2 目录

mkdir /etc/folder:在 etc 目录下创建 folder 目录

mkdir -p f1/f2/f3/f4:在当前目录下递归创建目录 f1、f2、f3、f4

rmdir folder:删除 folder 空目录(如果 folder 里面有文件,是无法删除 folder 的)

rmdir -p folder1/folder2:删除 folder2 空目录,如果删除之后导致 folder1 也变成空目录,则将 folder1 目录也删除

rm -r folder:删除 folder 目录以及目录下所有文件(Centos 下会进行询问)

rm -r -f folder(或者 rm -rf folder):强制删除 folder 目录以及目录下所有文件(无论空还是非空)

4. 目录复制和移动

cp -r /folder2 /folder1:将目录 folder2 复制到 folder1 目录里

mv /folder /etc:将 folder 目录移动到 etc 目录里(目录 ——> 目录)

文件管理

1. 文件创建和删除

touch filea fileb:创建文件 filea 和 fileb

rm filea:删除文件 filea

2. 文件编辑

cat>filea:直接在终端中编辑 filea 文件(ctrl+c 保存退出)。无该文件时会自动创建。

cat file1 file2>>file3:将 file1 和 file2 内容进行拼接,再放到 file3 中。

gedit filea:打开 filea 文件进行修改

echo 123>filea:将输出进行重定向,把 123 输出到 filea 文件

3. 文件查看

用法:

cat filea: 从头到尾查看文本内容

head -10 filea:查看文本内容前十行

tail -10 filea:查看文本内容倒数十行

more -5 filea:支持翻页查看文本内容,一屏显示5行。bspace 控制上下翻页

less -5 filea:支持翻页查看文本内容,一屏显示5行。pageuppagedown 控制上下翻页

wc filea:统计文件内容信息

PS:常用参数 -f,同步追踪并显示正在发生更改的文件内容。moreless 支持翻页,适合用来查看那些内容超过一屏的文本。

4. 文件复制和移动

cp file /a:将文件 file 复制到 a 目录里

cp -p file /a:将文件 file 复制到 a 目录里,并且副本时间和原文件一样

cp -a file /a:将文件 file 复制到 a 目录里,并且副本时间、权限等都和原文件一样

mv /filea /fileb:将 filea 重命名为 fileb(文件 ——> 文件)

mv /filea /etc:将 filea 移动到 etc 目录里(文件 ——> 目录)

mv /filea /etc/fileb:将 filea 移动到 etc 目录里,并将文件重命名为 fileb

PS:小技巧。如果重名名前后只有局部差异,可以考虑将前后改动包裹在 {} 中。例如 filea 修改为 fileb,可以这么写:mv file{a,b}

用户管理

1. 创建用户(组)

用法:

useradd chor:直接创建新用户 chor,但是不生成对应的家目录 /home/chor

adduser chor:以引导的方式创建新用户 chor,生成对应的家目录 /home/chor

groupadd group1:创建新用户组 group1

adduser -g group1 chor:创建新用户 chor 的同时将其分组为 group1

PS:必须以 root 身份创建用户。上述两种方式区别在于是否创建对应家目录,但都会在 /etc/passwd 下添加用户,/etc/shadow 下添加密码。更推荐用 adduser

2. 查看用户

id:查看当前激活用户信息

id chor:查看 chor 用户的信息

PS:信息中,uid 唯一标识用户,group 是用户所在组,默认以用户名单独建一个组(组的作用在于统一修改多个用户)

who:查看当前登录用户

whoami:查看当前终端用户

3. 修改用户

passwd:修改当前激活用户的密码

passwd chor:修改 chor 用户的密码

usermod -d /home/chor1 chor:修改 chor 用户的家目录

usermod -g group1 chor:修改 chor 用户的所在组为 group1

chage -E 2020-10-01 chor:设置 chor 用户的生命周期,2020.10.01 时该用户不可用

4. 删除用户(组)

userdel chor:删除 chor 用户,但保留其家目录(防止删除重要数据)

userdel -r chor:删除 chor 用户,并且删除其家目录

deluser chor:删除 chor 用户,但保留其家目录(防止删除重要数据)

userdel --remove-home chor:删除 chor 用户,并且删除其家目录

groupdel group1:删除用户组 group1

PS:更推荐用 userdel

5. 切换用户

su chor:切换到 chor 用户,但当前目录不变

su - chor:切换到 chor 用户,且当前目录自动切换到 chor 的家目录下

su:切换到 root 用户

su - root:切换到 root 用户

exit:退出当前用户,切换为到 root 用户

权限管理

1. 指令权限

sudo shutdown -c:以普通用户 chor 的身份执行 root 用户赋予给自己的特权指令 shutdown -c

visudo:以 root 身份编辑赋予给普通用户的特权指令

2. 文件权限

① 查看权限

ls -l file:查看文件权限

ls -ld folder:查看目录权限

查看到信息的时候只需关注前面的部分:

  • chor chor 中,第一个chor 代表文件所有者,第二个 chor 代表所有者所在组。
  • - rw-rw-r-- 中 ,第一个 - 指示文件是普通类型。第一个 rw- 代表文件所有者对该文件的权限,第二个 rw- 代表文件所有者所在组对该文件的权限,r-- 代表其他用户对该文件的权限。同样的,d rwxrwxr-x 也是一样的,只不过 d 指示文件是目录类型(文件夹)
  • 对于普通类型,rwx 分别代表对文件拥有可读可写可执行的权限,- 代表未指定
  • 对于目录类型,rwx 分别代表对目录拥有可显示目录内文件(ls)、**可修改目录内文件(rm)可进入目录(cd)**的权限,- 代表未指定
  • rwx 可以分别用数字 4、2、1 表示

② 修改权限

chown user1 file:修改文件所有者

chown :group1 file:修改文件所有者所在组

chown user1:group1 file:修改文件所有者和所在组

chgrp group1 file:修改文件所有者所在组

可以用字符修改权限:

chmod u+rw file:修改文件所有者对 file 的权限,增加 rw 权限

chmod g-r file:修改文件所有者所在组对 file 的权限,减去 r 权限

chmod o=rwx file:修改其它用户对 file 的权限,为 rwx 权限

chmod a-w file:修改所有用户对 file 的权限,去掉所有出现过的 w 权限

PS:u 代表文件所有者,g 代表所有者所在组,o 代表其它用户,a 代表所有用户。操作方式包括 +,-,=

也可以用数字修改权限:

chomod 777 file:修改 file 权限为 777。7 = 4+2+1,所以 777 的意思是所有的用户对该文件都拥有可读可写可执行的权限。

注意:

  • root 用户不受权限影响,即使为某文件设置 770,root 用户依然可以读写该文件
  • 为文件设置 040,则文件所有者没有读权限,但是文件所有者所在组又有读权限,这就矛盾了。此时以所有者为准,它依然没有读权限,但是所在组除了所有者之外的其它用户有读权限。

软件安装

Linux 下安装软件,可以通过源码包安装,也可以通过软件包安装,这里介绍后面一种。软件包的安装相关概念如下:

系列发行版包管理机制安装包格式包管理器(无法处理依赖)包管理器(可以处理依赖)
RedHat 系列Fedora,CentOSrpm.rpmrpmyum
Debian 系列Ubuntu,Debiandpkg.debdpkgapt

因为个人用的是 Ubuntu,这里仅介绍 apt 的相关用法。

新版 Ubuntu 中,建议用 apt 代替旧的 apt-get

0. 修改安装源

在动手安装软件包之前,首先必须修改默认的安装源,改为国内的镜像地址,否则速度会非常慢。具体做法可以参考之前写的这篇文章,这里我们介绍另一种纯命令行修改镜像地址的方法。

  1. 通过 cat 指令查看 /etc/apt/sources.list 文件,大概是这样的内容:

可以看到,默认的安装源地址是 http://archive.ubuntu.com,这个地址安装软件是非常慢的,我们要进行替换。

  1. 这里使用流编辑器 sed 进行地址替换:
sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list

这里的 -i 代表直接对文件进行修改;s/aaa/bbb/g 中,s 表示替换,aaa 表示修改前的地址,bbb 表示修改后的地址;末尾的参数则表示要修改的文件。

我这里使用的是阿里云的镜像源,也可以选择其它的。

  1. 查看替换后的文件:

  2. 通过下面的指令更新软件包列表:

sudo apt update

1. 安装/更新相关

apt install:安装软件包

apt update:并不实际更新软件,而是更新软件包列表。具体地说,运行命令后会逐一访问 sources.list 文件中的原仓库地址,并读取最新的软件包列表,保存在本地中。

apt upgrade:更新软件,但不会根据依赖关系的变化添加或删除软件。具体地说,运行命令后会将当前安装软件与之前通过 update 更新的软件包列表进行比对,有需要更新的就会进行更新。

apt dist-upgrade:同上,但是会根据依赖关系的变化添加或删除软件

2. 移除相关

apt remove:卸载软件包,但保留配置文件

apt --purge remove:卸载软件包,且不保留配置文件

apt autoremove:卸载为了满足其它软件的依赖而安装的、但现在已不再需要的软件包

apt clean:删除安装软件时缓存的 .deb 文件

apt autoclean:同上,但仅删除旧的、无用的 .deb 文件,对于已安装软件的 .deb 文件会进行保留

3. 查看相关

apt check:检查某个软件包是否有损坏的依赖

apt-cache stats:显示系统软件包的统计信息

apt-cache show gcc:查看 gcc 软件包的相关信息

apt-cache showpkg gcc:查看 gcc 软件包的常规信息、依赖关系等

apt-cache policy gcc:查看 gcc 软件包的安装设置状态

apt-cache depends gcc:查看 gcc 软件包所依赖的软件包

apt-cache redepends gcc:查看 gcc 软件包被哪些软件包依赖

安装 apt-fle 后,可以查看软件包的文件:

apt-file update:要查看软件包的文件,首先运行该命令更新软件包的文件库

apt-file list gcc:展示 gcc 软件包的所有文件

apt-file search file1:查找包含 file1 文件的软件包(不管软件包有没有安装)

服务相关

netstat 用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

显示所有连接和监听的端口:netstat -a

查看 tcp 监听的端口:netstat -ntlp

查看某个进程的端口:ps -ef | grep 进程名 查看进程 pid,再根据 netstat -nap | grep 进程pid 查看进程的端口

查看某个端口对应的进程:netstat -nap | grep 端口号

关闭占用某个端口的进程:sudo fuser -k 端口号/tcp

连接相关

远程连接 linux 服务器的工具有很多,secureSRT、putty 等,我这里使用的是 MobaXterm。如果没有服务器,也可以将本机的虚拟机当作一台远程服务器去连接:

  • 通过 ifconfig 指令查询虚拟机的 ip 地址(紧跟在 inet 后面的地址)
  • 查看虚拟机是否安装了 ssh 工具 —— 一般都是没有的,所以通过 apt-get install openssh-server 进行安装
  • 在 MobaXterm 中新建 session,输入虚拟机 ip 地址进行 ssh 连接

参考:

《Linux 实战技能100讲》