废话
学习任何一种新东西,最好的方式就是进行实践。对于一个被 Windows 这样的 GUI OS 惯坏了的用户而言,上手 Linux 的最快途径便是利用一些现成的项目进行实操。正如笔者肤浅的 Linux 使用技能完完全全是靠自己在 VPS 上搭梯子(ss)达成的。在这里写一些基本命令的笔记,一方面方便自己今后查阅,另外也给看到本文的 Linux 小白一些入(bu)门(kao)级(pu)的指北。
Linux 的历史
关于 GNU/Linux 的相关历史,GNU/Linux与开源文化的那些人和事 一文已经有很详尽的介绍。简单来说,Linux 是 Linus Torvalds 在 1991 年凭个人兴趣爱好发明的一个轮子。在众多开发者和社区的贡献下这个轮子逐渐变得众人皆知。 (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 后才能正常使用:
- 使用 Root 身份登录 Linux
- 执行如下命令确认自己的系统版本,如返回信息为
CentOS release 6.8 (Final)
则表示系统版本为CentOS 6
。
head -n 1 /etc/issue
- 执行如下命令确认自己的系统内核,如返回信息为
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
。(x86
为32 Bit
)
uname -a
- 根据系统版本和内核选择如下命令执行: ***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
-
执行命令
yum repolist
确认 EPEL 仓库已经安装 -
需要使用 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
编辑文件
编辑文本时我们可以使用 vi
或 vim
工具来实现,直接执行命令即可编辑文件 <file>
:
vi <file>
编辑文件时有三种命令模式:命令模式、插入模式、编辑模式。使用 ESC
或 i
或 :
来切换模式。命令模式下(按 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
命令查看当前目录下的文件详细信息,文件属性如图所示:
(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 命令整理