序言
江山如画,一时多少豪杰。
复习Linux基础知识。
GNU/Linux
GNU:基于开源协议,实现UNIX系统中的组件,本质上是工具集合。
Linux:本质是内核,分配计算机资源。
和在一起就是Linux发型版。
家族
Debian
Ubuntu
Kali
RedHat
centOS
Fedora
Linux目录结构
/
:根目录,所有用户共享的目录,Linux虚拟目录结构只包含/
根目录。
~
:家目录,用户的个人目录
#
:root
$
:普通用户
CLI
: 文本命令行界面
挂载点:根驱动器上创建的特别的目录,用于分配额外存储设备的目录。
挂载目录实际上存储在另一个驱动器之中。
命令行参数前缀格式
主要有三种:
- Unix风格:-
- GNU风格:–
- BSD风格:no dash
常见连接符
cmd_a | cmd_b : a结果作为b的输入 管道符
cmd_a || cmd_b :a失败再执行b
cmd_a && cmd_b :a成功后再执行b
cmd_a & cmd_b :a执行后继续执行指令b
外部命令与内建命令
外部命令
外部命令,也被称为文件系统命令,指的是存在于bash shell之外的程序。它们并不是shell 程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。
ps就是一个外部命令。可以使用which和type命令找到它。
1 | $ type -a ps |
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
内建命令
作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。
1 | $ type cd |
缝合怪命令
有些命令由多种实现,例如echo和pwd既有内建命令也有外部命令。
命令type -a显示出了每个命令的两种实现。which命令只显示出了外部命令文件。
要查看命令的不同实现,使用type -a
。
1 | $ type -a echo |
常用命令
命令末尾加& 进入后台模式
查看后台作业 jobs -l
ls
ls [选项] [参数] : ls -l /etc
目录内容查看
选项:
-a
:显示所有文件(包括隐藏文件)-l
:长格式显示;ls -l
可以简写成ll
权限 | 引用次数 | user | group | size(bytes) | 最后修改时间
-lh
:人类化显示,KB、MB…-ld
:查看目录本身的信息-li
:查看文件的inode节点
1 | ls -l my_script # 匹配文件名为my_script 的文件 |
mkdir
mkdir [选项] [目录名,路径]
创建新目录
选项:
-p
:迭代创建。在目录本身不存在的情况下,创建新目录(子目录)
cd
cd [目录路径] :cd /tmp
切换目录
pwd
显示当前目录
. :当前目录
.. :上一级目录
cp
cp [选项] [源文件目录] [目标文件目录]
复制文件或目录
选项:
-r
:复制目录-p
:复制目录时保留文件属性(修改时间等信息)
1 | cp -i /etc/NetworkManager/NetworkManager.conf . # 复制到当前目录 |
mv
mv [源路径] [目标路径]
剪切、重命名
mv只影响位置、名称,时间戳以及inode编号不影响
mv test test1
:将目前目录下的文件test改名为test1
mv test1 test2 test3 test4
:源路径可以多个一起复制(1,2,3 -> 4)
rm
rm [选项] [路径]
删除文件或目录
选项:
-f
:默认强制删除-r
:删除目录
rm -rf /*
:将根目录下的一切删除
touch
创建空文件
cat
cat [选项] [文件路径]
显示文件内容
选项:
-n
:显示行号-A
:查看所有内容,包含隐藏文件ls -a
##tac
tac [选项] [文件路径]
文件倒着显示,从最后一行倒着显示
more
分页显示文件内容
进入浏览状态后:
- 空格键/f:翻页
- enter:逐行显示
- q/Q:退出
- B/b:返回上一页
less
与more相同,但可以用⬆️方向键向上翻页
也可以搜索关键词:
/+keyword
:寻找关键词,n
向下找
##head
head -n 20 /etc/services.conf
:查看前20行内容
如果不写-n 20,那么默认显示前10行
tail
tail -n 20 /etc/services.conf
:查看尾部后20行
如果不写,也是默认后10行
ln
ln [选项] [源文件] [目标文件]
选项:
-s
:创建软链接
软链接:通过文件路径访问,类似快捷方式;
硬链接:通过文件索引地址(inode)访问,
与
cp -p
不同的是,硬链接可以同步更新
要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln -s 来创建符号链接。
chmod
chmod [选项] [文件或目录]
Type1:
[{ugoa}{+-=}{rwx}] [文件或目录]
Type2:
[mode 421] [文件或目录]
权限管理
-R
:递归修改,如果修改目录权限,那么目录内所有的文件都会修改
Type1:
u+x
:给user增加x权限
g+w
:给group增加write权限
o-r
:给other去掉read权限
g=rwx
:强制给group权限改为read、write、exe
Type2:
权限用数字显示
r=4,w=2,x=1
rwxrw-r--
:764
chown,chgrp
更改文件所属者,更改文件所属组
1 | chown dan newfile |
find
find [选项] [搜索范围] [匹配条件]
文件搜索
find /etc -name init
:在/etc
下搜索文件init
-iname
:不区分大小写
*init*
:只要带init就可以
init???
:以init开头,后面有三个字符
-type
:按类型查找
-type -f/d/l
:按照文件/目录/软链接类型查找
which、whereis
which
:找到命令所在的目录
whereis
:会附带帮助文档的位置
grep
grep [选项] [关键词] [文件名或目录]
搜寻特定行
选项:
-i
:不区分大小写
-n
:显示行号
-v
:反向搜索,排除指定字串
grep -v ^# /etc/inittab
:不看行首带#注释的行
ps
查看进程
常用参数:
1 | ps -elf # 完整查看所有进程 |
列含义:
UID
:启动这些进程的用户id。
PID
:进程id。
PPID
:父进程id,如果该进程是由另一个进程启动的
F
:系统分配给进程的系统标记。
S
:进程状态 [O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵 化,进程已结束但父进程已不存在;T代表停止]
C
:进程生命周期中的CPU的利用率。
PRI
:进程的优先级 [数字越大优先级越低]
ADDR
:进程的内存地址。
SZ
:假如进程被换出,所需要的交换空间的大小。
STIME
:进程的start time。
TTY
:进程由哪个终端设备启动。
TIME
:进程的累积运行时间。
CMD
:启动的程序名称。
top
实时显示进程信息
列含义:
PID
:进程的ID。
USER
:进程属主的名字。
PR
:进程的优先级。
NI
:进程的谦让度值。
VIRT
:进程占用的虚拟内存总量。
RES
:进程占用的物理内存总量。
SHR
:进程和其他进程共享的内存总量。
S
:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表 跟踪状态或停止状态,Z代表僵化状态
%CPU
:进程使用的CPU时间比例。
%MEM
:进程使用的内存占可用内存的比例。
TIME+
:自进程启动到目前为止的CPU时间总量。
COMMAND
:进程所对应的命令行名称,也就是启动的程序名。
默认情况下,top命令在启动时会按照%CPU值对进程排序。可以在top运行时使用多种交互命令重新排序。
键入f允许你选择对输出进行排序的字段,键入d允许你修改轮询间隔。键入q可以退出top。
用户在top 命令的输出上有很大的控制权。
kill
kill pid
Killall http* 关闭http的所有服务
help、who、w
help
:查看shell内置命令的帮助手册
who
:查看登陆用户信息
w
:查看详细登录信息
gzip、gunzip
.gz : linux常见的压缩格式
.zip : win、linux都可以识别,解压
gzip 文件名
:压缩成.gz格式的压缩文件,压缩后不会保留源文件
gunzip 压缩文件
:将.gz文件解压成正常文件
tar
tar [-zcvf] [压缩后文件名] [待压缩目录]
压缩目录,先打包,再压缩,格式.tar.gz
选项:
-c
:打包
-x
:解包
-v
:显示详细信息
-f
:指定文件名
-z
:打包同时压缩
zcvf
:打包
zxvf
:解包
常用命令:
1 | tar -zcvf test.tar test/ test2/ # 将test/和test2一起打包为test.tar |
zip
zip [选项] [压缩后文件名] [压缩目录]
-r
:压缩目录
shutdown
shutdown -h now/date
:关机
shutdown -r
:重启
shutdown -c
:取消上一条命令
history
显示bash历史。通常历史记录中会保存最近的1000条命令。
命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。
这里要注意的是, bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中。
!!
自动唤出刚刚命令
网络命令
tty
:本地终端
pts
:远程终端
###write
write <用户名> : 给在线用户名发消息,ctrl+D保存结束
wall
wall [message] : 广播信息,自己也会收到
ping
ping -c : 指定发送次数
ifconfig
ifconfig etc0 [ip]: 给eth0配置ip地址
mail [用户名]:查看,发送电子邮件
last
列出计算机用户登录信息
traceroute
traceroute www.baidu.com
显示数据包到主机之间的路径
netstat
查询网络状态
选项:
-t
:TCP
-u
:UDP
-l
:监听
-r
:路由
-n
:显示ip地址和端口号
-a
:所有,all
环境变量
全局环境变量 : env
命令查看
删除环境变量:unset
持久化
放在$HOME/.bashrc
中
软件包类别
- 源码包
- C/C++编写,需手动安装
- 二进制包
- 经过编译的二进制包,不能再看见源代码
- .rpm包:redhat,centOS
- .ded包:debian,ubuntu
shell命令
shell两大家族:
Bourne shell | C |
---|---|
sh | csh |
ksh | tcsh |
bash | |
psh | |
zsh |
查看支持shell种类:vim /etc/shells
echo
输出命令
echo -e
:支持\
转义
echo -n
:合并为一行输出
#! /bin/bash
alias
alias 别名 = ‘原命令’
设置命令别名
alias
:查询命令别名
unalias
:删除别名
history
history [选项] [历史命令保存文件]
查看历史命令
选项:
-c
:清空历史命令
-w
:把缓存中的历史命令写入文件
~/.bash_history
:历史命令
wc
对数据中的文本进行计数
默认会记录:
文本的行数
文本的词数
文本的字节数
##tricky skills
Ctrl+L
清屏
Ctrl+U
清空光标前命令、剪切
Ctrl+K
清空光标后命令
Ctrl+Y
粘贴
Ctrl+R
在历史命令中搜索
Ctrl+D
退出当前终端
Ctrl+A
光标移至开头
Ctrl+E
光标移至结尾
##重定向
标准输出重定向:
命令 > 文件 : 覆盖
命令 >> 文件 : 追加
不管是否报错都保存:
覆盖:命令 > 文件 2>$1
命令 &> 文件
追加:命令 >> 文件 2>$1
命令 &>> 文件
正确保存1,错误保存2:
命令 >> 文件1 2 >> 文件2
##管道符
命令1 | 命令2 :命令1的正确输出作为命令2的操作对象
set
查看所有命令
unset
多命令顺序执行
;
:多个命令之间没有任何联系,顺序执行
&&
:逻辑与
当cmd1
正确执行,cmd2
才会执行
当cmd1
不正确,cmd2
不会执行
||
:逻辑或
当cmd1
正确执行,cmd2
就不会执行
当cmd1
不正确,cmd2
才会执行
例子:
判断命令是否正确:
cmd && echo yes || echo no
脚本安装:
./configure && make && make install
通配符
匹配文件名
具体含义:
?
:匹配任意一个字符,必须得有一个,不包含null
*
:匹配任意一个或多个任意字符,可以匹配任意内容,null也可以匹配到
[]
:匹配括号中的任意一个字符,必须得有一个
[-]
:[a-z]
:匹配任意一个小写字母
[^]
:逻辑非,表示匹配不在中括号内的一个字符
[^0-9]
:匹配一个任意一个不是0-9数字的字符
其他特殊符号
单引号双引号的区别:
1 | name=sc |
$()
:用来执行系统命令
abc = $(date)
:将date执行,将结果赋值给abc变量的值
shell启动
登录shell
当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里 读取命令:
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
默认的bash shell的主启动文件,系统上的每个用户登录时都会执行 这个启动文件。
另外4个启动文件是针对用户的,可根据个人需求定制。我们来仔细看一下各个文件。
交互式shell进程
当你是在命令行提示符下敲入bash时启动,那 么你启动的shell叫作交互式shell。
交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。
如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。
非交互式shell进程
系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。
但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。
为了处理这种情况,bash shell提供了BASH_ENV环境变量,可以设置
shell的继承
如果父shell是登录shell,在/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc文件中 设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。
Linux文件权限
Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配唯一的用户账户。
用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。登录名是用户用来登录系统的最长八字符的字符串(字符可以是数字或字母),同时会关联一个对应的密码。
/etc/passwd
将用户的登录名匹配到对应的UID值。
root用户账户是Linux系统的管理员,固定分配给它的UID是0
伴随很多系统账户,他们并不是真实存在的。
用户的密码保存在一个特定的文件/etc/passwd
/etc/shadow 文件
/etc/shadow文件为系统上的每个用户账户都保存了一条记录。只有root用户才能访问/etc/shadow 文件。
用户组
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。
每个组都有唯一的GID——跟UID类似,在系统上这是个唯一的数值。除了GID,每个组还 有唯一的组名。
/etc/group
包含系统上用到的每个组的信息。系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配。
文件修饰符
-rw-r--r--
: -|user|group|others
第一个
-
含义:- -:文件
- d:目录
- l:软链接
- n: 网络设备
r,w,x : 可读、可写、可执行
rw-
含义:- 对象所属的user有read、write权限
r--
含义:- 对象所属的group只有read权限
r--
含义:- 其他用户只有read权限
shell脚本编程
1 |
|
Vim
永远滴神