0%

Linux笔记

序言

江山如画,一时多少豪杰。

复习Linux基础知识。

GNU/Linux

GNU:基于开源协议,实现UNIX系统中的组件,本质上是工具集合。

Linux:本质是内核,分配计算机资源。

和在一起就是Linux发型版。

家族

  1. Debian

    Ubuntu

    Kali

  2. RedHat

    centOS

    Fedora

Linux目录结构

/:根目录,所有用户共享的目录,Linux虚拟目录结构只包含/根目录。

~:家目录,用户的个人目录

#:root

$:普通用户

CLI: 文本命令行界面

挂载点:根驱动器上创建的特别的目录,用于分配额外存储设备的目录。

挂载目录实际上存储在另一个驱动器之中。

image-20210917210024492 image-20210917210251823

命令行参数前缀格式

主要有三种:

  • 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
2
$ type -a ps
ps is /bin/ps

当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。

内建命令

作为shell工具的组成部分存在。不需要借助外部程序文件来运行。

cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。

1
2
$ type cd
cd is a shell builtin

缝合怪命令

有些命令由多种实现,例如echo和pwd既有内建命令也有外部命令。

命令type -a显示出了每个命令的两种实现。which命令只显示出了外部命令文件。

要查看命令的不同实现,使用type -a

1
2
3
4
5
6
7
8
9
10
11
12
13
$ type -a echo 
echo is a shell builtin
echo is /bin/echo

$ which echo
/bin/echo

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

$ which pwd
/bin/pwd

常用命令

命令末尾加& 进入后台模式

查看后台作业 jobs -l

ls

ls [选项] [参数] : ls -l /etc

目录内容查看

选项:

  • -a:显示所有文件(包括隐藏文件)
  • -l:长格式显示;ls -l可以简写成ll

权限 | 引用次数 | user | group | size(bytes) | 最后修改时间

  • -lh:人类化显示,KB、MB…
  • -ld:查看目录本身的信息
  • -li:查看文件的inode节点
1
2
3
4
5
6
7
ls -l my_script # 匹配文件名为my_script 的文件
ls -l my_sc?ipt # 代表一个字符
ls -l my* # 代表一个或多个字符 my开头的意思
ls -l my_s*t
ls -l my_scr[ai]pt
ls -l my_scr[a-i]pt
ls -l my_scr[!i]pt # 将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 来创建符号链接。

image-20210918205525213

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
2
chown dan newfile
chgrp shared 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

查看进程

image-20210919134459275 image-20210919134517341

常用参数:

1
ps -elf # 完整查看所有进程

image-20210919135611663

列含义:

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

实时显示进程信息

image-20210919140139396

列含义:

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
2
3
tar -zcvf test.tar test/ test2/ # 将test/和test2一起打包为test.tar
tar -tf test.tar # 列出压缩包中的文件
tar -xvf 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

mail [用户名]:查看,发送电子邮件

last

列出计算机用户登录信息

traceroute

traceroute www.baidu.com

显示数据包到主机之间的路径

netstat

查询网络状态

选项:

-t:TCP

-u:UDP

-l:监听

-r:路由

-n:显示ip地址和端口号

-a:所有,all

环境变量

全局环境变量 : env命令查看

删除环境变量:unset

持久化

放在$HOME/.bashrc

软件包类别

  1. 源码包
    1. C/C++编写,需手动安装
  2. 二进制包
    1. 经过编译的二进制包,不能再看见源代码
    2. .rpm包:redhat,centOS
    3. .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

对数据中的文本进行计数

默认会记录:

  1. 文本的行数

  2. 文本的词数

  3. 文本的字节数

##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
2
3
name=sc
echo '$name' =>$name
echo "$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

image-20210919170651776

伴随很多系统账户,他们并不是真实存在的。

用户的密码保存在一个特定的文件/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权限
    image-20210919171839898

shell脚本编程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
days=10
guest="Katie"
echo "$guest checked in $days days ago"

testing=$(date)
testing=`date`
echo "The date and time are: " $testing

date > result.txt
date >> result.txt #追加

today=$(date +%y%m%d)
ls -al /usr/bin > log.$today

if command
then
commands
else
commands
fi

Vim

永远滴神