Linux常用基本命令指北

废话

学习任何一种新东西,最好的方式就是进行实践。对于一个被 Windows 这样的 GUI OS 惯坏了的用户而言,上手 Linux 的最快途径便是利用一些现成的项目进行实操。正如笔者肤浅的 Linux 使用技能完完全全是靠自己在 VPS 上搭梯子(ss)达成的。在这里写一些基本命令的笔记,一方面方便自己今后查阅,另外也给看到本文的 Linux 小白一些入(bu)门(kao)级(pu)的指北。

Linux 的历史

关于 GNU/Linux 的相关历史,GNU/Linux与开源文化的那些人和事 一文已经有很详尽的介绍。简单来说,Linux 是 Linus Torvalds 在 1991 年凭个人兴趣爱好发明的一个轮子。在众多开发者和社区的贡献下这个轮子逐渐变得众人皆知。 Unix发展过程图 (Source:刘军民)

GNU/Linux 存在很多发行版,最早发布 GNU/Linux 系统的公司是 Redhat,现在诸如 Debian、Ubuntu、CentOS 等等的系统都是被广泛使用的 GNU/Linux 发行版。Ubuntu 在营销和 GUI 优化方面做的更好一些,所以我们偶尔能看到 Ubuntu 出现在普通消费者新购电脑的预装系统中。

了解命令提示符和命令行

命令提示符和命令行

命令提示符和命令行 (Source:姜鹄)

Shell 简介

Shell 指「为用户提供用户界面」的软件,通常指的是命令行界面的解析器。泛指所有为用户提供操作界面的程序,也就是程序和用户交互的层面。在 Linux 系统中,我们使用的是 Linux Shell 进行操作,不同版本的 Linux 搭配了不同版本的 Shell,在使用上语法有所差异。bash 是 Unix shell 的一种,一般来说目前绝大多数的 Linux 都支持 bash。下面我们以 bash 为例介绍一下 shell 的命令。

所谓命令行操作,可以理解为人机交互通过一条一条的命令来实现。bash shell 的命令格式为:

command [options] [arguments]

其中, command:表示命令的名称。 options:表示命令的选项。 arguments:表示命令的参数。

我们一般把具有以上格式的字符串称为命令行。命令行是用户与 shell 之间对话的基本单位。 命令的选项是包含一个或多个字母的代码,主要用于改变命令的执行方式。在选项前面有一个 - 符号,用于区别参数。例如:

[root@WEBServer ~]$ ls -a ~/test

上面的语句中: [root@WEBServer ~]$命令提示符root 为用户名,WEBServer 为本机名,~ 为当前的工作目录; ls -a ~/test命令行ls 为命令名称,a 为命令选项,~/test 为命令参数。

命令行的命令选项可以不区分前后顺序地同时列出,例如:

[root@WEBServer ~]$ ls -la
[root@WEBServer ~]$ ls -al

还有很多 shell 的具体细节本文暂时不表,你可以通过 这篇文章 来进行学习。后文将省略命令提示符,只给出命令行。

Shell 管道

所谓管道,顾名思义具有连接的作用。我们可以通过管道把一个命令的输出当作下一个命令的输入,使用管道符 | 把第 1 个命令的输入当作第 2 个命令的输出,第 2 个命令的输出当作第 3 个命令的输入,依此类推。例如:

ps aux | grep blabla | wc –l

上面这个命令由三个命令组成, ps aux 用于查看系统中正在运行的进程 grep blabla 用于匹配(提取)包含字段为 blabla 的文本信息 wc –l 用于统计文本的数量 使用管道连接后,整条命令的作用就是查看系统中正在运行的名为 blabla 的进程数量。

常用快捷键

自动补全命令:Tab 停止当前命令:Ctrl+C 键盘输入结束:Ctrl+D

包管理

常见包管理套件

Linux 不是 GUI OS,几乎所有操作都需要输入命令行实现。所以为了方便地安装 / 卸载软件等操作,Linux 内置了专门用于对软件包进行管理的工具。不同版本的 Linux 系统使用不同的 软件包管理 指令。

各版本系统常见套件管理指令 (Source:凍仁翔)

根据上图,你可以实现对软件包的基本操作。例如,apt 常用命令如下:

sudo apt-get update                  #更新源索引
sudo apt-get install <package>       #安装软件 <package>
sudo apt-get remove <package>        #卸载软件 <package>
sudo apt-get upgrade                 #将系统中所有软件升级到最新版本
sudo apt-get remove <package>        #卸载软件 <package>

CentOS 相关包管理套件介绍

笔者使用的是 Linux 发行版本是 CentOS 6,在此简单介绍一下 CentOS 的相关包管理套件。从上面的各版本系统常见套件管理指令中我们看到 CentOS 使用 rpm 和 yum 进行包管理。

RPM (RPM Package Manager) 虽有 RedHat 的标志,但其原始设计理念是开放式的,包括 OpenLinux、S.u.S.E. 以及 Turbo Linux 等 Linux 的分发版本都有采用。

YUM (Yellow dog Updater, Modified) 是杜克大学为了提高 RPM 软件包安装性而开发的一种软件包管理器。

YUM 源和 EPEL

软件包管理器就像 PC 上的各种软件管家,软件包管理器的不同『源』收录的软件资源 / 信息是不同的,如当我们使用 yum 安装一个软件 <ooxx> 时返回的信息是:

No package <ooxx> available.
Error: Nothing to do

这有可能是因为我们使用的『源』中并没有记录关于 <ooxx> 的信息。所以我们需要换一个信息丰富的『源』来解决这个问题。

EPEL 及使用方法

EPEL (Extra Packages for Enterprise Linux) 是 Fedora 团队的免费、开源项目,用于为 RedHat 系的 Linux 系统提供额外的软件包,其适用于 RHEL、CentOS 和 Scientific Linux。对于没有默认使用 EPEL 作为 YUM 源的 CentOS,我们需要安装、设置 EPEL 后才能正常使用:

  1. 使用 Root 身份登录 Linux
  2. 执行如下命令确认自己的系统版本,如返回信息为 CentOS release 6.8 (Final) 则表示系统版本为 CentOS 6
head -n 1 /etc/issue
  1. 执行如下命令确认自己的系统内核,如返回信息为 Linux <username> 2.6.32-042stab117.16 #1 SMP Fri Sep 9 21:57:19 MSK 2016 x86_64 x86_64 x86_64 GNU/Linux 则表示系统内核为 64 Bit。(x8632 Bit
uname -a
  1. 根据系统版本和内核选择如下命令执行: ***RHEL/CentOS 7 ***
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

RHEL/CentOS 6

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
  1. 执行命令 yum repolist 确认 EPEL 仓库已经安装

  2. 需要使用 EPEL 安装软件 <software> 时,执行如下命令即可:

yum --enablerepo=epel install <software>

系统

whatis <command>            #单行描述命令
man <command>               #显示命令手册
alias <alias>="<command>"   #设置 <command> 命令的别名为 <alias>,   
                             之后执行 <alias> 命令相当于执行 <command> 命令
date                        #显示日期
cal                         #显示日历
shutdown -r now             #关机后重启
shutdown -h now             #关闭系统服务后关机
shutdown -h 10              #10min 后关闭系统服务后关机
shutdown -h 21:25	        #10min 后关闭系统服务后关机
reboot                      #立即重启
init 0                      #关机
init 6                      #重启
free                        #显示系统内存状态
uname -a                    #查看系统信息
head -n 1 /etc/issue        #查看版本信息
lsb_release -a              #查看版本信息
df -h                       #查看磁盘空间
du -sh                      #查看目录大小
clear                       #清除屏幕信息

文件

常用参数

-r                 #递归,操作某目录及其子目录中的文件时使用
-i                 #交互操作,操作前会询问
-f                 #强制操作,不进行提示
-help              #显示帮助信息

常用命令

wget <URL>                            #下载 <URL> 指向的文件
pwd                                   #显示当前所在目录
mkdir <dir>                           #创建新目录
mkdir -m <access_code> <dir>          #创建新目录并设定目录权限
mkdir -p <dir>/<dir>                  #创建新目录,若无父目录,则创建
rmdir <dir>                           #删除空目录
rmdir -p <dir>/<dir>                  #删除空目录及父目录中的所有空目录
cp -p <source> <target>               #复制文件 / 目录 <source> 及其属性到 <target>
cp -r <source> <target>               #递归复制文件 / 目录 <source> 内所有内容到 <target>
cp -a <source> <target>               #相当于 cp -pdr
cp -i <source> <target>               #复制文件时若目标文件存在,则询问操作
rm -f <file>                          #强制移除文件
rm -r <file>                          #递归移除文件 / 目录(慎用)
mv <file> <dir>                       #移动文件 <file> 到目录 <dir>
mv <file> <new>                       #重命名文件 <file> 为 <new>
cat <file>                            #显示文件内容
cat -b <file>                         #显示文件内容,空白行不显示行号
cat -n <file>                         #显示文件内容,显示所有行号
more <file>                           #分页显示文件内容
        空格(Space)                  #下一页
        回车(Enter)                  #下一行
        /<string>                     #向下搜索内容 <string>
        :f                            #显示文件名及行数
        q                             #关闭 more 显示
less <file>                           #分页显示文件内容
        PageUp                        #上一页
        PageDown                      #下一页
        空格(Space)                  #下一页
        ?<string>                     #向上搜索内容 <string>
        /<string>                     #向下搜索内容 <string>
        q                             #关闭 less 显示
tail <file>                           #显示文件最后 10 行内容
tail -n <num> <file>                  #显示文件最后 <num> 行内容
touch <file>                          #若 <file> 不存在,则新建文件 <file>
                                      #若 <file> 存在,则修改 <file> 的时间(atime/ctime/mtime)为当前时间
touch -t <date> <file>                #修改 <file> 的时间为指定 <date> 时间(YYMMDDhhmm)
whereis <file>                        #查找文件 <file>
locate <keyword>                      #查找文件(目录)名包含 <keyword> 的文件(目录)
find <path> <file>                    #在 <path> 路径下查找文件 <file>
tar -zxvf <file>.gz <dir>             #打包 <dir> 目录并压缩为 <file>.gz
tar -zxvf <file>.gz                   #解压缩解包文件 <file>.gz
tar -jxvf <file>.bz2 <dir>            #打包 <dir> 目录并压缩为 <file>.bz2
tar -jxvf <file>.bz2                  #解压缩解包文件 <file>.bz2

编辑文件

编辑文本时我们可以使用 vivim 工具来实现,直接执行命令即可编辑文件 <file>

vi <file>

编辑文件时有三种命令模式:命令模式、插入模式、编辑模式。使用 ESCi: 来切换模式。命令模式下(按 ESC 进入):

:q                      #询问退出
:q!                     #不保存并强制退出
:wq                     #保存并退出
:set number             #显示行号
:set nonumber           #隐藏行号
/apache                 #在文档中查找 apache 按 n 跳到下一个,shift+n 上一个
yyp                     #复制光标所在行,并粘贴
j                       #下一行,相当于↓
k                       #上一行,相当于↑
h                       #左移一个字符,相当于←
l                       #右移一个字符,相当于→

其实这已经算是 vi/Vim 的使用方法(命令)了,可以通过 这篇文章 入门。

清空文件内容

下面的三个命令都可实现清空文件内容,但命令执行后文件大小有所不同:

echo "" > <file>                     #文件大小被截为 1 字节
> <file>                             #文件大小被截为 0 字节
cat/dev/null > <file>                #文件大小被截为 0 字节

文件权限

Linux 文件权限的表示

使用 ll 命令查看当前目录下的文件详细信息,文件属性如图所示: Linux文件属性 (Source:dwqs)

Linux 系统中的文件有三种基本权限,使用这三种权限的数值组合可以满足文件权限管理的所有需求。

参数 意义 数值
R 读(read) 4
W 写(write) 2
X 可执行(execute) 1

文件权限 (Source:dwqs)

文件属性中 drwxr-x---fonts 文件夹的权限 drwxr-x--- 一共十个字符,分成四段: 第一个字符表示文件属性,- 表示普通文件,d 表示目录,l 表示链接。 第二三四个字符 rwx 表示当前所属用户的权限。数值表示为 4+2+1=7 第五六七个字符 r-x 表示当前所属组的权限。数值表示为 4+0+1=5 第八九十个字符 --- 表示其他用户权限。数值表示为 0+0+0=0 故 fonts 文件夹的权限用数值表示为 750

更改权限

chgrp -r <file>                       #更改文件所属用户组
chown -r <user>:<group> <file>        #更改文件所属用户

chmod 命令可更改文件权限,其有 4 个参数

  • 指定用户及用户组:[u <指定用户> g <指定用户组> o <其他用户> a <所有用户>]
  • 权限增减:[+ 增加权限 - 减少权限]
  • 权限变更内容:[r w x]
  • 权限变更的文件名: <file>

文件 newfile 的权限为 -rw-r—-x,如需将其权限更改为 -rwxrw-r-x(数值表示为 765),执行下列任意一条命令即可:

sudo chmod u+x,g+w,o+r newfile
sudo chmod 765 newfile

进程

top                             #实时显示进程信息
ps aux                          #显示进程信息
ps aux | grep <package>         #显示 <package> 程序的进程信息
kill <PID>                      #终止 PID 为 <PID> 的进程
kill -2 <PID>                   #中断进程,类似 Ctrl+C
kill -9 <PID>                   #杀死进程
top 表头 含义 备注
PID 进程 ID
USER 进程的属主
PR 优先级
NI Nice 值 负值表示高优先级
正值表示低优先级
VIRT 虚拟內存使用量 单位 KB
RES 固定內存使用量 单位 KB
SHR 共享内存大小 单位 KB
S 进程状态 D 不可中断的睡眠状态
R 运行
S 睡眠
T 跟踪 / 停止
Z 僵尸进程
%CPU CPU 占比
%MEM 内存占比
TIME+ 进程实际使用 CPU 运作的时间 单位 1/100 秒
COMMAND 程序的实际指令

ps aux 表头 含义 备注
USER 进程的属主
PID 进程 ID
%CPU CPU 占比
%MEM 内存占比
VSZ 虚拟內存使用量 单位 KB
RSS 固定內存使用量 单位 KB
TTY 在哪个终端机上面运作 ? 与终端机无关
tty1-tty6 本机登入者程序
pts/0由网络连接进主机的程序
STAT 当前程序状态 D 无法中断的休眠状态(通常 IO 的进程)
R 正在运行可中在队列中可过行的
S 处于休眠状态
T 停止或被追踪
W 进入内存交换 (从内核 2.6 开始无效)
X 死掉的进程 (基本很少見)
Z 僵尸进程
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存
s 进程的领导者(在它之下有子进程)
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+ 位于后台的进程组
START 进程触发启动的时间
TIME 进程实际使用 CPU 运作的时间 单位秒
COMMAND 程序的实际指令

用户

useradd -m <user>               #添加用户 <user>
passwd <user>                   #设置用户 <user> 的密码
userdel -r <user>               #删除用户 <user>
su <userB>                      #临时切换到 <userB> 身份工作,运行 `exit` 命令返回
groups                          #查看当前用户所属的组
usermod -G <group> <user>       #将用户 <user> 加入 <group> 组
usermod -g <group> <user>       #将用户 <user> 加入 <group> 组,并从原有用户组中除去

网络

常用命令

netstat -tunpl                           #列出所有监听的服务端口
iptables -L -n                           #查看防火墙设置
iptables -F                              #清空防火墙规则
ifconfig -a |grep -i hw                  #查看 MAC 地址
ifconfig | awk '/eth/{print $1,$5}'      #查看 MAC 地址
sudo lshw -c network | grep serial       #查看 MAC 地址

添加指定端口的防火墙例外

添加指定端口 <port> 的防火墙例外使用如下命令:

iptables -A INPUT -p tcp --dport <port> -j ACCEPT

简单的 HTTP 服务

搭建一个简单的 Web Server,使用 HTTP 服务将 <http_dir> 中的目录和文件以 HTTP 的方式展示出来:

cd /<http_dir> && python -m SimpleHTTPServer <port>

若本机的外网 IP 为 <IP>,使用浏览器访问 http://<IP>:<port> 即可浏览 <http_dir> 目录。这是一个可以用来共享文件的非常有用的方式。

Q&A

设置开机启动:

开机启动命令

vi /etc/rc.local

将开机启动命令写入上述文件即可。

开机启动服务

chkconfig --list          显示开机可以自动启动的服务
chkconfig --add          添加开机自动启动 *** 服务
chkconfig --del          删除开机自动启动 *** 服务
setup                    在 shell 的 GUI 中进行详细配置
ntsysv                   在 shell 的 GUI 中进行简单配置

修改 SSH 默认端口

SSH 默认端口一般为 22,可通过修改配置文件自定义 SSH 默认端口:

vi /etc/ssh/sshd_config

修改文件中 #Port <port><port> 为自定义的端口,并删除 # 使之生效。

限制 SSH 登录的 IP

如需限制指定 <IP> 使用 SSH 登录,可编辑文件实现:

vi /etc/hosts.deny

文件末尾加入 sshd:ALL

vi /etc/hosts.allow

文件末尾加入 sshd:<IP>

参考链接

GNU/Linux 与开源文化的那些人和事 完全用 GNU/Linux 工作 【Linux】linux 常用基本命令 九十分钟极速入门 Linux——Linux Guide for Developments 学习笔记 Linux 工具快速教程 Linux 的文件权限 非常简单的Python HTTP服务 Linux 常用命令及使用技巧 vim/vi 命令整理

updatedupdated2023-09-272023-09-27