1.1 系统管理类命令
在计算机发展初期,计算机之庞大以吨为计。因此计算机都是放到一个单独的房间中,人们在另一个地方通过一定的方式(设备)去操控计算机,操控计算机的这个设备被称为终端,也叫终端机。终端其实就是一种输入输出设备,本身并不提供运算处理功能。
后来随着个人计算机的普及,终端的含义也慢慢出现了变化。因为个人计算机不再需要一个额外的终端来操作计算机,所有操作都在个人计算机上完成了。但是,计算机操作系统中已有的终端设计却保留了下来,并以终端模拟器(Terminal Emulator)的形式出现。这些终端模拟器被简称为「终端」。 如今,用户主要通过图形化 shell 界面与计算机交互,如 MacOS 操作系统。
更多 shell 介绍和使用,参见1.3 shell 脚本编程章节中的内容。
本节的基础系统管理类命令以 CentOS Linux 8 为例。

主机名称
在大多数 Linux 发行版中,都使用hostname命令查看或更改主机名。主机名用于网络中的计算机标识。修改主机名操作需要重新登陆后才能生效。修改主机名称方法如下:
在 Linux 系统中,用户账户主要分为两大类:普通用户和超级用户/管理员,后者通常特指 root 用户。root 对系统拥有绝对权力;而普通用户只对个人目录下的文件拥有完全控制权。
直接以管理者身份(root)操作 shell 是危险的,所以计算机用户通常以普通用户登陆。
示例代码中[zhangzh@node01 ~]$分别表示以用户名为zhangzh的用户登陆主机名为node01的主机。
当root用户登陆时$符号会变为#符号,以示区分。
电源管理
服务器和电脑都是计算机的一种形式,都可以开关机和重启:
重启命令 e.g.
关闭命令 e.g.
密码设置
passwd命令 设置用户的认证信息,包括用户密码、密码过期时间等。只有 root 用户可以指定用户名称或者修改密码,普通用户只能修改自己的密码。
修改其他用户的密码方式参考本章用户管理一节;找回 root 密码的方法参考这篇博客。
远程控制
ssh命令 用来远程连接服务器。e.g.
需要启动 X11 服务(即调用 GUI)时需要添加-XY 参数。
在 MacOS 中开启 X11 转发服务方法可以参考:使用 XQuartz 调用 GUI 界面。
每次输入密码登陆未免太过麻烦,因此,可以在值得信任的计算机上设置免密登陆:
在可以信任的计算机上执行ssh-keygen命令,生成 ssh 钥匙。MacOS 中钥匙的路径存放在.ssh/。e.g.
接下来将公钥内容拷贝至需要控制的服务器即可。e.g.
配置登陆服务器名称:
将远程服务器命名为klcr, 在配置文件中.ssh/config写入:
至此,就完成了服务器的别名配置,输入ssh klcr即可免密访问服务器。
在终端中上传和下载本地或服务器的文件方法参见跨服务器传输文件章节内容。
服务管理
启动服务
不同系统的服务启动指令略有差异,本系统使用systemctl start git启动。e.g.
暂停服务
标准安全的暂停:
永久禁用:
用户管理
用户管理涉及到组与用户以及权限的概念。通常,普通用户只对自己的文件具有完整权限,同组用户拥有相对完整的权限,对组外(其他)用户不具备任何权限。权限控制命令参见权限。
useradd命令 建立用户帐号。
usermod命令 修改用户帐号。
userdel命令 删除用户帐号。
组管理命令:
用户管理命令:
当创建用户时出现 Creating mailbox file: File exists 的错误。请直接删除 /var/spool/mail/ 和 /home 下的之前存在的用户文件,删除后就能重建成功。
su命令(switch uesr)用于变更使用者身份。常见用法如:su username或者su -c command username,其含义分别是切换至用户名为username的账户和切换至username的账户后执行命令后退出该账户。
进程管理
top命令 实时查看系统的运行情况。
top界面支持个性化:按z更改界面颜色,按 shift+z,依次点按S和数字0-7可以更改对应位置的字体颜色,按t和m可以切换显示 CPU、GPU 的占用情况,按回车后按W保存。
w命令 显示登陆系统的用户列表,用户正在执行的进程,登陆地点,登陆时间等等信息。还可用于查看系统时间,这一点和uptime作用一致。更多关于时间的命令可以参考附录。该命令参数如下:
jobs命令 显示作业的状态,如列出活动和停止的作业。
jobs常用参数是jobs -l,以包含pid的形式展示进程。需要注意的是jobs只能查看当前账户的进程,诸如nohup之类的命令,在重新登陆后jobs可能无法查询到该进程,这时候建议使用ps命令来管理。
ps命令(process status)报告当前系统的进程状态。
搭配kill指令随时中断、删除不必要的程序。ps是最基本和强大的进程查看命令。如ps -aux配合grep命令查找需要的进程,并打印 ID 号和所属用户。
pstree命令 以一种优雅的方式展示进程树。
当进程严重影响到服务器的运行状态时,可以指定结束特定用户的特定进程。
kill命令 通过进程 ID (Progress ID, PID)关闭进程。使用kill -9命令立即杀死指定 PID 的进程。使用ps等命令配合grep来查找进程 ID。
killall命令 关闭指定用户名称的所有进程。
pkill命令 按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果想杀掉单个进程,用kill。
进程中无法输入 kill 时,使用如下命令中止或挂起进程。
当需要kill某项进程时,请先关闭该进程之前的进程,否则可能会报错。如nohup ping,应先kill ping,再kill nohup。
配置文件
环境变量(environment variable)是用来存储有关 shell 会话和工作环境的信息的一种特性。
这项特性允许在内存中存储数据以便程序或 shell 中运行的脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。
变量名区分大小写。所有的环境变量名均使用大写字母,这是 bash shell 的标准惯例。如果是个人创建的局部变量或是 shell 脚本,请使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,bash shell 就会把值当成一个单独的命令
根据作用域的不同,环境变量分为两种:全局环境变量和局部环境变量。使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符$ e.g.
在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。e.g.
一旦启动了 bash shell(或者执行一个 shell 脚本),就能创建在这个 shell 进程内可见的局部变量了。可以通过=给环境变量赋值,值可以是数值或字符串,如果要给变量赋一个含有空格的字符串值,必须用引号来界定字符串的首和尾。e.g.
设置了局部环境变量后,就能在 shell 进程的任何地方使用它了。但是,如果生成了另外一个 shell,它在子 shell 中就不可用。e.g.
在子 shell 中无法使用用户定义变量my_var。通过命令echo $my_var所返回的空行就能够证明这一点。
当退出子 shell 并回到原来的 shell 时,这个局部环境变量依然可用,类似地,如果在子进程中设置了一个局部变量,那么一旦退出了子进程,那个局部环境变量就不可用。
那么需要该变量在所有进程中都是可见的,就需要设置全局变量。
全局变量
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中,这个过程通过export命令来完成,变量名前面不需要加$ 。
修改子 shell 中全局环境变量并不会影响到父 shell 中该变量的值,子 shell 甚至无法使用export命令改变父 shell 中全局环境变量的值,甚至子 shell 重新定义并导出了变量my_var,但父 shell 中的my_var变量依然保留着原先的值。
当然,既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用unset命令完成这个操作。在unset命令中引用环境变量时,记住不要使用$
在涉及环境变量名时,什么时候该使用$,什么时候不该使用$,实在让人摸不着头脑。
记住一点就行了:如果要用到变量,使用$;如果要操作变量,不使用$。
这条规则的一个例外就是使用printenv显示某个变量的值。
如果子进程中删除了一个全局环境变量, 这只对子进程有效。该全局环境变量在父进程中依然可用。
默认的环境变量有很多,在这里查看全部的默认变量,这里列出一些常用的环境变量名称:
PATH
决定了 shell 将到哪些目录中寻找命令或程序
LIBRARY_PATH
用于在程序编译期间查找动态链接库时指定查找共享库的路径
LD_LIBRARY_PATH
用于在程序加载运行期间查找动态链接库时指定查找共享库的路径
INCLUDE
用于在程序编译期间查看头文件的路径
PBS_O_HOST
提交作业的主机名
PBS_O_WORKDIR
提交作业的工作路径
PBS_JOBID
作业被 PBS 系统指定的作业号
PBS_QUEUE
PBS 脚本在执行时的队列名
PBS_NODEFILE
PBS 系统指定的作业运行的节点名
在 shell 命令行界面中输入一个外部命令时,shell 必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。例如,输出中显示了有 8 个可供 shell 用来查找命令和程序。PATH中的目录使用冒号分隔。
如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell 是没法找到的。如果 shell 找不到指定的命令或程序,它会产生一个错误信息(建议都使用绝对路径):
登入 Linux 系统启动一个 bash shell 时,默认情况下 bash 会在几个文件中查找命令。这些文件叫作启动文件或环境文件。大多数 Linux 发行版只用这四个启动文件中的一到两个:
$HOME/.bash_profile、$HOME/.bashrc、$HOME/.bash_login、$HOME/.profile
这四个文件都以点号开头,这说明它们是隐藏文件(不会在通常的ls命令输出列表中出现)。它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动 bash shell 会话时生效。
当在登录时echo一些个性化的内容,如登录信息,应该将脚本添加在$HOME/.bash_profile中,而不得添加在$HOME/.bashrc中,因为在使用sftp等需要按行查看登录环境的命令时,echo会打乱其读取的内容,导致连接失败。
ls命令(list files) 可以打印出当前工作目录下的所有文件(目录/地址也是一种文件)。
echo命令 用于在shell中打印shell变量的值,或者直接输出指定的字符串。
服务查询
systemctl status 是一个用于在 Linux 系统上查看服务状态的命令。它可以显示特定服务的详细信息,包括当前是否正在运行、最后一次启动时间、PID、主机名称等。e.g.
地址与端口
地址:地址通常指的是 IP 地址,它是用来唯一标识网络中的设备(例如计算机、路由器、服务器等)的,使得数据能够正确地发送和接收。IP 地址可以分为 IPv4 地址(如
192.168.1.1)和 IPv6 地址(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。端口:端口是一个用来标识应用程序或服务的逻辑通道。在网络通信中,数据包通过端口来确定应该传递给哪个应用程序或服务。端口号是一个 16 位的数字,范围从
0到65535。其中,0到1023的端口号是被预留给一些知名的服务(例如 HTTP 服务的端口号是80,HTTPS 服务的端口号是443)。一般情况下,用户自定义的应用程序会使用大于1023的端口号。
因此,地址和端口在网络通信中起着非常重要的作用,地址用于标识设备,而端口则用于标识设备上的应用程序或服务。
路径与文件
路径是文件(目录也是文件)在 Linux 系统中的唯一位置。Linux 中路径分为两种:
绝对路径 :是完全限定名称从根目录 / 开始,指定到达唯一单个文件所需要遍历的每个子目录;
相对路径: 仅指定从工作目录到达该文件所需的路径。
cd命令(change directory)命令用于改变当前工作目录的命令,切换到指定的路径,如cd ~意为切换到家目录,cd .切换至当前工作目录,cd ..切换至工作目录的上一级目录。
通配符与正则表达
在前面的介绍中,或多或少已经接触了一些通配符与正则表达,二者是 Linux 中最强大的工具,虽然规则很多,但是值得反复学习和使用,受益终身。
通配符用于匹配文件名。比如find,ls,cp,mv等命令支持通配符查找文件名。
*
匹配任何字符。e.g. rm *.txt删除当前目录下的所有以.txt结尾的文件。
?
匹配单个字符。e.g. ls file?.txt 将匹配 file1.txt、file2.txt 等文件。
[-]
范围匹配。e.g. rm [a-z].txt删除当前目录下的包含小写字母的文件,举一反三,[a-zA-Z0-9]意为匹配所有大小写字母和阿拉伯数字。
{,}
选项匹配。e.g. touch {a..z}.txt按字母顺序创建名为a.txt到z.txt,删除同理。touch {a.txt,b.txt}创建名为a.txt和b.txt的文件。cp a{.c,.c.bak}为a.c创建名为a.c.bak的备份文件。
\
转义字符。转为表达字符的原始含义用。e.g. ls \*.txt 将匹配以 *.txt 结尾的文件
!
取反匹配。e.g. [!abc]表示不包含abc中的任何字母
^
同上
正则表达式元字符有字符匹配、匹配次数、位置锚定、分组。主要是处理文本里的内容,用来匹配文本里的字符串,针对文件内容的文本过滤工具里,大都用到正则表达式,如grep, sed, awk, vim, less, nginx, varnish等命令,均支持正则表达式。
.
匹配任意单个字符
*
匹配 0 个或多个前面的字符
+
匹配 1 个或多个前面的字符
?
匹配 1 次或 0 次前面的字符
()
分组过滤,被括起来的内容表示一个整体
|
匹配多个模式中的一个
^
匹配行的开头。grep '^start' file.txt 将匹配以 start 开头的行
$
匹配行的结尾。grep 'end$' file.txt 将匹配以 end 结尾的行
\b
匹配单词的边界。grep '\bword\b' file.txt 将匹配独立的单词 word
\d
匹配数字字符。grep '\d+' file.txt 将匹配一个或多个数字。
\w
匹配字母数字字符。grep '\w+' file.txt 将匹配一个或多个字母数字字符
\s
匹配空白字符。grep 'line\s+' file.txt 将匹配以 line 开头的行,并跟随一个或多个空白字符
{n}
匹配前面的元素恰好 n 次。grep 'a{3}' file.txt 将匹配 aaa
{n,}
匹配前面的元素至少 n 次。grep 'a{2,}' file.txt 将匹配至少两个连续的 a
{n,m}
匹配前面的元素至少 n 次,但不超过 m 次。grep 'a{2,4}' file.txt 将匹配两个到四个连续的 a
根目录结构
Linux 的根目录通常有这些文件构成,它们的作用分别是:
软件编译
GNU编译器
GCC(GNU Compiler Collection,GNU编译器套件)
GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 计划的关键部分,亦是自由的类 Unix 及苹果电脑 macOS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准
GCC 可处理 C、C++、Fortran、Pascal、Objective-C、Java 以及 Ada 等语言
从 github 中下载一个开源软件(或者库),通常需要“三连”安装(使用cmake或其他指定编译安装命令的除外)
此时该开源软件的会默认安装到/usr/local/lib和/usr/local/include中
如果想指定安装位置(比如库文件将要做到 docker 镜像中,或者加入到 git 仓库中,需要独立出来),可以通过一下方式指定:make DESTDIR=/install/directory install。
随后在.bashrc中指定环境变量地址即可。
参考:
添加媒体
Linux 中,“媒体”指的是存储介质,如光盘、USB 闪存驱动器、硬盘等,用于安装、存储和传输数据。媒体通常需要被挂载到系统中,以便用户访问和操作。步骤是(属于临时挂载):
1、插入媒体(u盘)到计算机,通常它的硬件名称为:sda1,可以用fdisk -l来查看当前的硬件名称
2、在mnt目录下先建立一个 usb 的目录,如# mkdir /mnt/usb
3、挂载媒体:mount -t vfat /dev/sda1 /mnt/usb
4、卸载媒体:umount /mnt/usb
5、删除 usb 目录:rm -rf /mnt/usb
非临时挂载需要在vi /etc/fstab中修改配置,配置在重启后才能生效。
当发现无法卸载某个媒体,尝试使用fuser -km关闭所有进程。
配置别名
alias命令 创建常用命令的快捷形式,二者输入效果等价。例如:alias ll='ls -latr' 创建了一个命令别名 ll等价于ls -latr,每次配置别名仅在当前 bash 中生效,把别名保存在 ~/.bashrc中将全局生效,具体参考这篇文章。
最后更新于