0x00-Linux基础
·Shell
shell:shell是系统的用户界面,提供了用户与内核进行进行交互的一种接口(命令解释
器),Shell接收用户输入的命令并把它送入内核执行,在用户与系统之间进行交互
。Shell在整个Linux中具有极其重要的地位。
Shell是一个用C语言编写的程序,他是用户使用Linux的桥梁。
Shell的功能
命令解释是Shell最重要的功能。Linux系统中所有的可执行文件都可以作为Shell命令来执行。
常见Linux可执行文件分类
Linux命令 存放在/bin、/sbin目录下的命令
内置命令 出于效率的考虑,将一些命令的解释程序构造在Shell内部
实用程序 存放在/usr/bin/、/usr/sbin、/usr/local/bin、/usr/local/sbin等目录
下的实用程序
用户程序 用户程序经过编译生成可执行文件后可作为Shell命令运行
Shell脚本 由Shell脚本编写的批处理文件
Shell的运行原理
用户输入命令,提交给shell,判断是否为内置命令,若是,则内核中的系统功能调用;若是外部命令或实用程序,在系统中查找该命令的文件并调入内存执行,最后由内核中的系统功能调用。
shell的主要版本
常见的shell版本:
bash: 多数Linux系统的默认shell,包含ksh的优点,界面友好
ksh: 由Dave Korn编写,是UNIX系统上的标准Shell
tcsh: C Shell的拓展
Shell的元字符
在Shell中一些具有特殊意义的字符,称为Shell元字符,若不以特殊方式指明,shell不会把他们当作普通文字符使用。
* 代表任意字符串
? 代表任意字符
/ 代表根目录或作为路径间隔符使用
\ 转义字符。当命令的参数要用到保留字时,要在保留字前面加上转义字符
\<Enter> 续行符。可以使用续行符将一个命令分写在多行上
S 变量值置换,如SPATH表示环境变量PATH的值
' 在'......'中间的字符均被当作文字处理,指令、文件名、保留字等都不再
具有原来的意义
" 在"..."中间的字符会被当做文字处理并允许变量值置换命令替换,置换
...中命令的执行结果
< 输入重定向字符
> 输出重定向字符
| 管道字符
& 后台执行字符。在一个命令之后加上字符”&“,该命令就会以后台方式执
行
; 分割顺序执行的多个命令
() 在子shell中执行一组命令
{} 在当前shell中执行一组命令
! 执行命令历史记录中的命令
~ 代表登录用户的宿主目录(自家命令)
文件
在Linux上,文件被看作是字节序列。这种概念使得所有的系统资源有了统一的标识,这些资源包含普通文件或目录、磁盘设备、控制台(键盘、显示器)、打印机等
- 普通文件
d 目录,存放位置
I 符号链接
c 字符设备文件
b 块设备文件
s 套接字
p 命名管道符
普通文件
普通文件可以是可执行文件(文本、程序、脚本等)、源代码等类型,在Windows中后缀名决定了文件的类型,但是在Linux中,可执行文件是用权限来标识的,只要有了可执行权限,那么不论文件后缀是什么都可以执行,但是对于一些数据文件一般也遵循文件名后缀的规则。
常见文件后缀
*.txt 文本文件
*.conf 配置文件
*.html/*.xml/*.yml/*.sql html、xml、yml、sql文件
*.c/*.cpp c/c++源码文件
*.so/*.ko/*.lib 模块、库文件
*.sh/*.php/.py/*.pl/*.rb Shell/PHP/Python/PerVRuby脚本文件
*.rpm RPM包文件
*.tar 存档文件
*.gz/*.bz2/*.xz 由gzipbzip2/xz生成的压缩文件
*.gz/*.tgz/*.tar.bz2/*.tbz/*.tar.xz/*.txz 压缩后的tar包文件
*.lock 用于表示某个程序或某种服务正在运行的锁文件
*~ 备份文件
目录和硬链接
目录是由一组目录项组成,目录可以是对其他文件的指向,也可以是对其下的子目录的指向
硬链接:将两个文件名指向同一个存储空间,任意修改其中一个都会影响另一个指向的文件,它并不是一种特殊文件类型,而是允许多个子目录指向同一文件的一种机制
In file1 file2 会生成一个硬链接文件file2
符号链接
符号链接又叫做软链接,是指将一个文件指向另一个文件名
软链接:将一个文件指向另一个文件,类似与快捷方式,如果删除了源文件,那么另一个文件会成为死链接
In -s file1 file2 会生成一个软链接文件file2
设备文件
设备文件是指计算机中的外围硬件装置,也就是除了cpu和内存以外的所有设备,linux下为了屏蔽用户对设备访问的复杂性,采用了设备文件,就可以像当问普通文件一样对设备进行读写访问,设备文件用来访问设备,包括硬盘、光驱、打印机等,每个硬件设备至少与一个设备文件相关。
设备文件又分为字符设备(如键盘)和块设备(如磁盘)。
linux下的设备名以文件系统中的设备文件的形式存在,通常放在/dev目录下,/dev目录下存在多个链接文件,我们可以通过来链接文件来访问设备
常见的设备文件
/dev/sd* SCSI/SAS、PATH/SATA、USB硬盘设备,sda1表示SATA接口的第一块
硬盘上的第一个分区;hda2表示IDE接口的第一块硬盘的第二分区
/dev/sr0 光驱
/dev/console 系统控制台
/dev/tty* 本地终端设备
/dev/pts/* 伪终端设备
/dev/ppp* ppp设备,ppp协议的设备,用于拨号上网
/dev/lp* 并口设备
/dev/null 空设备,可理解为黑洞,所有写入他的内容都会被丢弃,用于屏蔽命令行
输出
/dev/zero 零设备 用于产生连续不断的二进制流的零流,通常用于创建指定长度的
空文件
磁盘结构:块设备:block 存取单位”块“ 磁盘
字符设备:char,存取单位”字符“ 键盘
机械硬盘(hdd,碟式)和固态硬盘(ssd):机械硬盘 关键字 转速 7200 5400
不同磁盘标识 /dev/sda /dev/sdb, /dev/sdaa,/dev/sdab
SATA接口的设备分的磁盘表示 sda
IDE接口的设备分的磁盘表示 hda
套接字和命名管道
套接字和命名管道是Linux环境下实现进程间通信的(IPC)机制
命名管道(FIFO)文件允许在同一计算机上的两个进程之间进行通信
套接字(socket)允许运行在不同的计算机上的进程之间互相通信
他们通常是在进程运行时创建或删除,无需管理员来干预
目录
bin 存放二进制的可执行程序
boot 存放用于系统引导时使用的各种文件
dev 用于存放设备文件,用户可以通过这些文件访问外部设备
etc 存放系统的配置文件
home 存放所有用户文件的根目录,有一个用户在该目录下就有一个与该用户名相
对应的子目录,当用户登录时就进入其用户名对应的子目录
lib/lib64 存放根文件系统中的程序运行所需要的共享库及内核模块
lost+found 存放一些系统检查结果,发现不合法的文件或数据都存放在这里,通常
此目录是空的,除非硬盘遭受了不明的损坏
mnt 临时文件系统的挂载点目录
media 即插即用型存储设备的挂载点自动在这个目录下创建,如C/DVD等
opt 第三方软件的存放目录
proc 是一个虚拟文件系统,存放当前内存的映射,主要用于在不重启机器的情况
下管理内核
root 超级用户目录
sbin 类似/bin目录,也存放二进制可执行文件,但是只有root才能访问
srv 系统对外提供服务的目录,如Web虚拟主机等
tmp 用于放置各种临时文件
usr 用于存放系统应用程序
var 用于存放需要临时改变的文件,如系统日志、脱机工作目录等
Linux命令
Linux命令常用结构: Command [-option] [argument]
Command 既是要运行的命令本身,说白了就是一个程序(软件)
Option 是选项(可选),选项是控制命令运行状态和行为的(可多个选项一起,如df -hT)
Argument 是参数(可选),是命令要操作对象如文件、路径、数据、目录等;
在指令的第一部分按tab键一下为命令补全,两下为所有命令选择,在非第一部分按tab键两下为文件补全
帮助命令
命令名 --help 查看命令帮助
whatis 命令名 查看命令功能描述
man 命令名 查看指定命令手册
man -k<关键字> 列出与<关键字>匹配的手册页
系统信息相关
lscpu或cat /proc/cpuinfo 显示cpu信息
free -m或cat /proc/meminfo | grep -i memtotal 显示物理内存大小
cat /etc/system-release 显示系统发行版本
uname -r 查看内核版本
uname -a 查看版本详细信息
arch 查看机器架构
lsmod 查看内核模块
dmesg 查看系统启动信息
lsblk 查看系统中的块设备
fdisk -l 查看磁盘分区
findmnt 查看挂载的文件系统
df -Ph 查看磁盘剩余空间
df -h 显示已经挂载的分区列表
date/timedatectl 查看本地时间和日期
localectl 查看语言支持和键盘设置
yum repolist 查看已经启用的软件更新源
yum list installed或rpm -qa 查看已经安装的软件’
yum check-update或yum list updates 查看可用的软件包更新
yum remove xx 卸载xx软件
hostname或hostnamectl 查看主机名称
ifconfig或ip addr show 查看ip地址、网卡
route 显示路由信息
ss或netstat 显示网络状态信息
firewall-cmd --list-all 查看防火墙规则
软件包安装
yum install package_name 下载并安装一个rpm包
yum update package_name.rpm 更新当前系统中所有安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum repolist 查看已经启用的软件更新源
rpm -qa 查看已经安装的软件
yum clean all 删除所有缓存的包和头文件
yum check-update 检查可更新的所有软件包
yum update 下载更新已安装的所有软件
APT软件工具
(Debian,Ubuntu以及类似系统)
apt-get install package_name 安装/更新一个deb包
apt-cdrom install package_name 从光盘安装/更新一个deb包
apt-get update 升级列表中的软件包
apt-get upgrade 升级所有已安装的软件
apt-get remove package_name 从系统删除一个deb包
apt-get check 确认依赖的软件仓库正确
apt-get clean 从下载的软件包中清理缓存
关机重启登出
shutdown -h now 关闭系统(1)
init() 关闭系统(2)
telinit 0 关闭系统(3)
shutdown -h hours:minutes 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启(1)
reboot 重启 (2)
logout 注销
exit 退出
文件和目录
ls 显示文件和目录列表
ls -al 以列表形式显示所有文件、目录(包含隐藏文件、目录)
ls -R 递归显示当前目录及其子目录下的文件及目录
mkdir /dirname/dirname1 以绝对路径创建一个空目录
mkdir -p /srv/{abc,def}/html 递归创建/srv/abc/html和/srv/def/html目录
touch file file1 生成file、file1空文件
touch oldfile 修改已有文件的时间为当前时间
cd dirname 切换到目录
cd - 切换到上一次使用cd命令前的目录
cd .. 切换到当前目录的上级目录
cd ../.. 切换到当前目录的上两级目录
tree 树状显示当前目录结构(没有需要安装 yum -y install tree)
cp 复制文件
cp file1 dirname 复制单个文件到目录
cp file1 file2 dirname 复制两个文件到目录
cp -r /etc/dir 复制/etc/dir目录及所有的文件到当前目录
mv file1 file2 将file1改名为file2
mv file 00e 移动到目录
ren file1 file2 将file1改名为file2
rm -rf file/dir 强制删除文件或文件夹
rmdir 删除空文件夹
find . -name ‘my*’ 从当前目录查找名字为my开头的文件
find /home -user ”osmond“ 从/home目录下开始查找用户属主为osmond的文件
文本文件操作
cat /etc/passwd 查看文件/etc/passwd的内容
cat -n /etc/passwd 带行号的显示/etc/passwd的内容,等价于 nl /etc/passwd
more /etc/passwd 分页显示/etc/passwd内容,注意空格,Enter和q的使用
more + 10 /etc/passwd 从第十行开始分页显示/etc/passwd内容
less /etc/passwd 分页显示,类似more
head -4 /etc/passwd 显示/etc/passwd的前四行
tail -4 /etc/passwd 显示/etc/passwd的最后四行
tail -n +10 /etc/passwd 显示/etc/passwd从第十行到最后的内容
wc /etc/passwd 统计/etc/passwd的行数、字数、字符数
wc -l /etc/passwd 统计/etc/passwd的行数
sort /etc/passwd 以ASCII码顺序对/etc/passwd排序
grep str file 从文件中查找str关键字
diff file1 file 比较两个文件的不同
sed 's/w/q/g' file1 将file1中的字符串w替换为新字符串q
sed -e 4a\newline testfile 在testfile文件的第四行后添加一行
sed -n '/xxx/='home/test.log 输出所有包含xxx字符串的行号
sed -i '3,$d' file1 删除3到最后一行,其余行打印出来
sed -i '1,3d' file1 删除file1的1到3行内容
nl /etc/passwd | sed '/root/p' 搜索/etc/passwd有root关键字的行
sed -i '$a 增加的字符串' a.txt 在最后一行的下一行增加字符串
打包和压缩
gzip file 将file压缩为file.gz并删除源文件file
gzip -d file.gz 将file.gz解压并删除源文件file.gz
bzip2 file 将file压缩为file.bz2并删除源文件file
bzip2 -k file 将file压缩为file.bz2并保留源文件file
bzip2 -d file.bz2 将file.bz2解压为file并删除源文件
tar zxvf file.tar.gz 调用gzip解压file.tar.gz
tar zcvf mydir.tar.gz mydir 调用gzip将mydir目录打包并压缩为file.tar.gz
tar jxvf file.tar.bz2 调用bz2解压file.tar.gz
tar jcvf mydir.tar.bz2 mydir 调用bz2将mydir目录打包并压缩为file.tar.gz
zip file.zip file 将file压缩为zip
unzip file.zip 将file.zip解压
信息显示
whereis ls 查找程序ls的位置
history 显示历史命令
history -c 清空历史命令
cal 2015 显示2015年日历
ifconfig eth0 显示网卡eth0的详细信息
netstat -antp 显示所有已经建立的连接
du -sh 显示当前目录已使用量
df -h 目录名 显示目录磁盘使用量
who 显示当前tty终端或伪终端占用
id 显示用户uid、gid
进程相关
crontab
cronttab -l 查看计划任务 在目录/var/spool/cron/crontabs/ 下
top 动态显示进程占用
ps -aux/ps -ef 显示所有进程
kill -9 pid号 杀死进程
命令
a 显示终端上的所有进程,包括其他用户的进程
u 显示进程的详细状态
x 显示没有控制终端的进程
网络相关
ifconfig 显示网卡信息及ip地址
ifconfig eth0 显示一个eth0的配置
ifup eth0 启用一个”eth0“网络设备
ifdown eth0 关闭一个”eth0“网络设备
wget url/uri 下载某个文件
ifconfig eth0 promisc 设置'eth0'成混杂模式以嗅探数据包
dhclient eth0 以dncp模式启用'eth0'
route -n 显示路由表
echo "1">/proc/sys/net/ipv4/ip_forword 开启路由转发(数据转发)
hostname 显示系统主机名
ping hostname/IPdizhi 网络连通性测试
ss或netstat 显示网络状态信息
firewall-cmd --list-all 查看防火墙规则
其他命令
systemctl start 服务名 启动某个服务
systemctl restart 服务名 重启某个服务
systemctl stop 服务名 停止某个服务
systemctl reload 服务名 重新加载某个服务
systemctl enable 服务名 将某个服务加入启动项
systemctl disable 服务名 将某个服务移除启动项
systemctl is-enabled 服务名 检查服务是否开机自启
systemctl status | grep ssh 查看
vi编辑器
vi 是Visual Interface的简称,可以执行输入、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行控制,这是其他编辑器所不具备的功能
vi不是一个排版程序,不像MS Word或WPS那样可以对字体、格式、段落等进行排版,他是一个文本编辑程序
vi的进入方式
vi 进入vi的默认方式
vi filename 没有则创建,有则进入vi,将光标
vi +n filename 打开文件并将光标置于第n行
vi + filename 打开并将光标置于最后
vi +/pattern filename 将光标指向文本中匹配的位置
vi -r filename 打开上次使用Vi编辑时崩溃的文件,并恢复它
vi编辑器有三种运行模式:普通模式、插入模式、命令行模式(底行模式)
普通模式:进入vi时默认就是普通模式,在其他模式时可以按ESC进入
插入模式:普通模式下按a(附加)、i(插入)、o(打开)、c(修改)、r(取代)、s(替换)都
可以进入
命令行模式:也叫底行模式,按住Shift+:可进入,在底行模式下可以输入一些命令
普通模式下进入插入模式
i 从光标所在位置开始插入文本
I 将光标移到行首并在其前面插入
a 在光标之后插入文本
A 将光标移动到行尾并插入文本
o 将光标移动到下一行行首,并等待文本收入
O 将光标移动到上一行行首,并等待文本输入
普通模式下光标定位
G 将光标移动到最后一行行首
nG 将光标移动到第n行行首
n+ 光标下移n行
n- 光标上移n行
n$ 将光标移动到低n行行尾
0 将光标移动到光标所在行的行首
$ 移动到光标所在的行尾
^ 将光标移动到所在行的第一个字符(非空格)
h,j,k,l 上下左右移动
H 将光标移动到当前屏幕首行行首
M 将光标移动到当前屏幕中间行行首
L 将光标移动到当前屏幕底行行首
普通模式下删除
dd 删除整行
d$ 删除光标到末尾的内容
d0 删除光标位置之前到开始的内容
普通模式下粘贴
yy 复制整行到缓冲区
p 将缓冲区内容粘贴到光标所在
nyy 从光标位置开始复制n行到缓冲区
普通模式下撤销
u 取消上一次操作
底行模式下跳转
:n 直接跳转到n行行首
底行模式下查找字符串
:/str/ 从当前光标位置向右移动到有字符串的地方
:?str? 从当前光标位置向左移动到有字符串的地方
底行模式下查找替换
:s/str1/str2/ 找到当前行第一个str1将其替换为str2
:s/str1/str2/g 找到当前行所有str1将其替换为str2
底行模式下文件相关
:x 保存并退出
:wq 保存并退出
:w file 将当前内容保存到file文件中
:q! 强制不保存退出
:f file1 将当前文件改名为file1