Linux基础知识手册

Linux简介

Linux具有非常优良的血统,具有相当良好的多人多工环境。
与Windows比较,Win面向非专业用户,Linux面向专业人员;Windows的宗旨是让不会电脑的人也可以操作电脑,Linux的宗旨是最大化精简系统。因此Win在大众领域受欢迎,而Linux在专业和速度领域大放异彩。
Linux开源,易于移植。奇数版本为发展中版本,偶数版本为稳定版本。d
输出重定向

操作界面

Linux预设的情况下会提供六个Terminal来让使用者登入。

Linux有两种操作界面,纯文字界面和图形用户界面。
[Ctrl] + [Alt] + [F2] ~ [F6] :文字界面登入 tty2 ~ tty6 终端机;
[Ctrl] + [Alt] + [F1] :图形界面桌面。
图形界面只能有一个,如果没有tty1-tty6都没有开启图形界面,可以使用命令startx开启图形界面。

命令行介绍

[dmtsai@study ~]$

dmtsai是用户名,study是电脑名,~是home

快捷键

【TAB】按键:

  • 补全代码和命令;
  • 连按两次tab键,会列举出所有相关项。
    【ctrl+c】:终止当前程序;
    【ctrl+d】:相当于输入 exit

查看内核版本

$ uname -r
5.4.0-58-generic
#第一项(5):当前内核主版本号;
#第二项(4):当前内核次版本号;
#第三项(0-58):0 表示为当前内核更新次数,58表示当前内核修补次数;
$ uname -a
Linux parallels-Parallels-Virtual-Platform 5.4.0-58-generic #64-Ubuntu SMP Wed Dec 9 08:16:25 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

查看发行版本号

$ cat /etc/issue
Ubuntu 20.04.1 LTS \n \l
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.1 LTS
Release:	20.04
Codename:	focal

查看CPU个数及每个CPU内核数

$ cat /proc/cpuinfo  | grep "cores"
cpu cores	: 2
cpu cores	: 2

设置时间日期

timedatectl [commamd]

选项与参数:
list-timezones :列出系统上所有支持的时区名称
set-timezone :设定时区位置
set-time :设定时间
set-ntp :设定网络校时系统

修改主机名

# 查看主机信息
hostnamectl 

# 修改主机名
hostnamectl set-hostname 主机名

#查看主机名
cat /etc/hostname

辅助手册

# 查询指令
--help 

# 详细操作手册
man page

# 以超链接形式组织的操作手册
info page

文件操作

LINUX下不同的文件类型有不同的颜色:
蓝色 表示目录;
蓝绿 色表示可执行文件,可执行的程序;
红色 表示压缩文件或包文件;
浅蓝色 表示链接文件;
灰色 表示其它文件;

ls 列出目录

# 显示当前目录
ls
# 显示所有文件
ls -a
# 显示所有文件及细节
ls -l
# 筛选文件,可用正则表达式
ls -d xxx*
# 按时间排序
ls -t

cd 切换目录

#切换到根目录
cd /
#切换到home
cd ~
#切换到上一级
cd ..
#切换到上一次目录
cd -
#切换到绝对路径
cd /目录1/目录2/目录3
#切换到相对路径
cd ../目录

pwd 显示当前目录

#显示当前路径
pwd
#显示出确实的路径,而非使用连结 (link) 路径
pwd —P

mkdir 创建目录

#创建文件夹
mkdir test
#创建多级目录
mkdir test1/test2/test3/test4
#建立权限为rwx--x--x的目录
mkdir -m 711 test2

rmdir 删除空的目录

#删除文件夹
rmkdir 目录
#连同上一级『空的』目录也一起删除
rmdir -p 目录1/目录2/目录3/目录4

cp 复制文件/目录

# 复制文件A到B
cp A B
# 强制复制,若目标存在,则移除后再复制
cp -f A B
# 若目标已存在,则询问
cp -i A B
# 连同档案的属性(权限、用户、时间)一起复制过去,而非使用预设属性
cp -p A B
# 递归复制,复制文档及其以内全部内容
cp -r A B

使用正则表达式

cp test*.* TEST/

rm 删除文件/目录

# 删除文档A
rm A
# 强制删除,不进行询问
rm -f A
# 删除前询问
rm -i A
# 递归删除,删除文档及其以内全部内容
rm -r A
# 直接删除且不询问
rm -rf A
# 删除所有文件
rm -rf *

# 反向删除,这里用到^反选,反引号``将结果作为前边命令的输入
rm -rf `ls | grep ^ "test"`

mv 移动/重命名

# 将A移动到B
mv A B
# 重命名,其中B应该是新文件名称
mv A B
# 覆盖移动
mv -f A B
# 询问移动
mv -i A B

文件权限

文件属主

Linux是多人多工系统,因此为了保护每个人的隐私,创建了健全的保护机制。
创建者:档案拥有者,即这个新建这个文档的人。
群组:作用是让非创建者拥有和创建者一样的权利。
文档权限:读写权和执行权。

以上权限可以用如下命令修改:
chown :改变档案拥有者
chgrp :改变档案所属群组
chmod :改变档案的权限, SUID, SGID, SBIT等等的特性

chown

chown username:username 文件名

chgrp

TODO:)

文件权限解析

dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot
-----------------------------------------------
12  3  4     5 6    7    8    9   10  11

属性1:代表这个文件是目录、文件或链接文件等等.
[ d ]是目录;[ - ]是文件;[ l ]是链接文档;[ b ]是装置文件里面的可供储存的接口设备(可随机存取装置);[ c ]是装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

属性2-4:用户权限,rwx分别为读、写和执行权.
属性2是创建者(拥有者),属性3是群组,属性4是其他用户的权限,-表示没有此权限

各权限的数字代表:

权限 数字代表 作用
r 4
w 2
x 1 执行
- 0 无此权限

如:超级权限777代表所有人都具有读写执行权

chmod

chmod用于设定文件属性,有两种方式:一种是数字方式,另一种是字母方式.
1.数字方式

# 给予文件夹内所有用户(root用户,管理员,普通用户)所有权限。
chmod 777 -R 文件夹

2.字母方式

# 赋予文件A执行权.
chmod +x A

i属性

设置了i属性之后:只能查看文件,不能修改(权限,内容等但是可以刷新时间)和删除,包括root也无权限。

# 查看i属性
lsattr test.txt
# 增加i属性
chattr +i test.txt

a属性

设置a属性后,该文件就只能增加内容不能修改和删除。

chattr +a 文件名

文件搜索

which

查找 PATH 路径中的 可执行文件,并返回该命令位置。

which python
# /usr/bin/python

whereis

whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。
该指令会在特定目录中查找符合条件的文件,一般文件的定位需使用locate命令。如果想看whereis搜索了哪些目录,可以使用whereis -l查看。

whereis python
# /usr/bin/python

locate/updatedb

locate搜索时,只要文件名中包含关键字,就都会列举出来。
locate使用的是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,因此搜索起来很快。
但是由于该数据库是定期建立一次,因此有时可能在数据库建立数据之前去搜索数据的话,会出现搜索不到的情况,这时就需要手动更新数据库。

locate 文件名

#手动更新数据库
updatedb

支持正则表达式。

find

查找文件

# 在路径中查找文件
find 查找路径 -name 文件名

# 在/var目录下查找passwd这个文件
find /var -name passwd

# 在/var目录下查找含有passwd关键字的文件
find /var -name "*passwd*"

支持正则表达式。

文件查看

cat

# 正序显示文件内容
cat 文件名
# 显示行号
cat -b 文件名
# 显示标记符
cat -v 文件名
# 显示文件前面几行,默认的情况下,显示前 10 行!
head 文件名
# 显示文件前20行
head -n 20 文件名

tail

# 显示文件前面几行,默认的情况下,显示前 10 行!
tail 文件名
# 显示文件后20行
tail -n 20 文件名

文件传输

scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。

# 传输远程文件到本地
scp 用户名@ip地址:文件名 本地目录
# 递归传输本地文件到远程
scp 本地文件  用户名@ip地址:文件名

硬链接和软链接

硬链接和软链接又叫实体链接和符号链接。
硬链接是别名,是透过文件系统的 inode 连结来产生新档名,而不是产生新文件!即同一数据,但是有两个名字。需要注意的是,硬链接只能在当前目录下进行。
软链接是Win下的快捷方式,其内容记录的是真实文件的地址。

# 硬链接
ln /etc/crontab .

# 软链接
ln -s  /etc/crontab .

文件解压

tar.gz

这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多CPU的,而且可以得到一个非常理想的压缩率。

# 压缩,将文件B压缩为A.tar.gz
tar -zcvf 压缩文件名.tar.gz 被压缩文件名

# 解压,将A.tar.gz解压到当前目录
tar -zxvf A.tar.gz

# 解压,将A.tar.gz解压到指定目录
# tar -zxvf A.tar.gz -C 指定目录

zip

zip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用。缺点就是支持的压缩率不是很高,而tar.gz和tar.gz2在压缩率方面做得非常好。

# 压缩,将文件B压缩为A.zip
zip -r A.zip B
# 解压,解压A.zip
unzip A.zip

rar

# 解压,将A.rar解压到指定目录
unrar x A.rar 指定目录

用户和组

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

创建新用户

进入root

su

创建名为 db 的新用户:

adduser db
正在添加用户"db"…
正在添加新组"db" (1006)…
正在添加新用户"db" (1006) 到组"db"…
创建主目录"/home/db"…
正在从"/etc/skel"复制文件…
输入新的 UNIX 口令:
重新输入新的 UNIX 口令:
两次输入db的初始密码,出现的信息如下
passwd: password updated successfully
Changing the user information for db
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Full Name []:

一路回车,然后y,
到此,用户添加成功。

添加root权限:
使用 visudo 打开 sudoers

sudo visudo 

修改内容如下:

# User privilege specification
root ALL=(ALL) ALL
db ALL=(ALL) ALL

保存退出,db用户就拥有了root权限。
:wq 退出,
或者
ctrl+o,回车,ctrl+x退出

删除用户

删除用户

userdel 用户名

把用户的主目录一起删除。

userdel -r 用户名

修改用户

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
用法:

usermod 参数 用户名
参数:
    -c comment 指定一段注释性描述。
    -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
    -g 用户组 指定用户所属的用户组。
    -G 用户组,用户组 指定用户所属的附加组。
    -s Shell文件 指定用户的登录Shell。
    -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
用户名:
    指定新账号的登录名。

修改密码

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
如果默认用户名,则修改当前用户的口令。

# 修改密码
passwd

添加组

groupadd 参数 用户组

参数

-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

删除组

groupdel 用户组

修改组

groupmod 参数 用户组

参数

-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组 将用户组的名字改为新名字

切换组

newgrp 组名

系统目录

├── bin       存放普通用户可以执行的命令.
├── boot      启动项信息.
├── dev       外部设备信息.
├── etc       系统配置信息.
├── home      普通用户的主目录.
├── lib       动态库目录.
├── media     U盘、光驱等识别后,会挂载到这个目录下。
├── mnt       系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在`/mnt`/上,然后进入该目录就可以查看光驱里的内容了。
├── opt       软件安装目录.
├── proc      虚拟目录,可以通过直接访问这个目录来获取系统信息。
├── root      root用户主目录。
├── run       是一个临时文件系统,存储系统启动以来的信息。
├── sbin      存放root用户可以执行的命令.
├── srv       该目录存放一些服务启动之后需要提取的数据。
├── sys       这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:`针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
├── tmp       这个目录是用来存放一些临时文件的。
├── usr       Unix Software Resource,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
├── /usr/bin  系统用户使用的应用程序。
├── /usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序。
├── /usr/src  内核源代码默认的放置目录。
├── var       这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

bin:
bin为binary的简写,主要放置系统的必备执行文件,例如:
cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/usr/bin:
主要放置应用程序工具的必备执行文件,例如:
c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

/sbin:
主要放置系统管理的必备程序,例如:
cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/sbin:
主要放置网路管理的必备程序,例如:
dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等.

进程管理

在 Linux 系统当中:‘触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设定。’ 从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!

查看进程

# 显示所有进程
ps -e
# 筛选进程
ps -e | grep 关键字

杀死进程

kill -signal PID

其中,PID是进程号,signal有:

1	SIGHUP	启动被终止的程序,可让该 PID 重新读取自己的设定档,类似重新启动
2	SIGINT	相当于用键盘输入 [ctrl]-c 来中断一个程序的进行
9	SIGKILL	代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有‘半产品’产生,类似 vim会有 .filename.swp 保留下来。
15	SIGTERM	以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
19	SIGSTOP	相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行

杀死进程1234

kill -9 1234

gcc编译流程

https://www.cnblogs.com/chendeqiang/p/12861616.html

软件管理

  • dpkg:
    这个机制最早是由 Debian Linux 社群所开发出来的,透过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件资讯,实在非常不错。 只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括 B2D, Ubuntu 等等。
  • RPM:
    这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributions 就使用这个机制来作为软件安装的管理方式。包括 Fedora, CentOS, SuSE 等等知名的开发商都是用这咚咚。
代表 软件管理机制 使用指令 线上升级机制(指令)
Red Hat/Fedora RPM rpm, rpmbuild YUM (yum)
Debian/Ubuntu DPKG dpkg APT (apt-get)

dpkg命令

命令 作用
dpkg -l 查看所有被安装的包
dpkg -L 包名 查看包的安装位置信息

apt命令

命令 作用
sudo dpkg -i xxxx.deb 安装.deb软件包
sudo apt-get install XXXXX 安装软件库的软件
sudo apt-get install -f 修复安装依赖问题
sudo apt-get remove XXXXX 卸载软件库的软件
sudo apt-get purge XXXXX 卸载并清除配置
sudo apt autoremove 删除没用的依赖包
sudo vim /etc/apt/sources.list 修改软件库
sudo apt-get update 更新软件库列表,在文件 /etc/apt/sources.list 中列出
sudo apt-get upgrade 更新所有软件
apt search 关键字 搜索可用软件包
apt-cache show 包名 查看软件包信息
apt list --installed 列出所有已安装的软件
apt-get source 获取源码而非编译好的二进制
apt-get clean 清除缓存
add-apt-repository 添加仓库

apt默认下载位置及安装位置

下载的软件的存放位置:/var/cache/apt/archives
安装后软件的默认位置:/usr/share
可执行文件位置:/usr/bin
配置文件位置:/etc
lib文件位置:/usr/lib

dpkg和apt区别

apt是会解决和安装模块的依赖问题,并会咨询软件仓库,是在线安装
dpkg只能安装本地的deb文件,不会关心ubuntu软件仓库的软件,不会解决模块的依赖关系
dpkg是本地包安装,apt是在线包安装

参考链接:
https://www.jianshu.com/p/c6936efe5b58

磁盘管理

# 以阅读形式显示所有磁盘信息
df -hl
文件系统        容量  已用  可用 已用% 挂载点
/dev/root        30G   25G  3.3G   89% /
devtmpfs        434M     0  434M    0% /dev
tmpfs           438M     0  438M    0% /dev/shm
tmpfs           438M   17M  421M    4% /run
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           438M     0  438M    0% /sys/fs/cgroup
/dev/mmcblk0p1   43M   23M   21M   52% /boot
tmpfs            88M  4.0K   88M    1% /run/user/1000

以上面的输出为例,表示的意思为:
HD硬盘接口的第二个硬盘(b),第二个分区(2),容量是75G,用了75G,可用是0,因此利用率是100%, 被挂载到根分区目录上(/)。

在 Linux 底下如果 df 没有加任何选项,那么预设会将系统内所有的
(不含特殊内存内的档案系统与 swap) 都以 1 Kbytes 的容量来列出来!

关机命令

由于Linux是多人多工操作系统,所以关机还是需要注意一些问题。

命令 作用
sync 将数据由内存同步到硬盘中。
shutdown 关机指令,1分钟后关机。
shutdown -h now 立刻关机
shutdown –h 10分钟后关机,并且会显示在登陆用户的当前屏幕中。
shutdown –h now 立马关机
shutdown –h 20:25 系统会在今天20:25关机
shutdown –h +10 十分钟后关机
shutdown –r now 系统立马重启
shutdown –r +10 系统十分钟后重启
reboot 重启,等同于 shutdown –r now
halt 关闭系统,等同于shutdown –h now 和 poweroff

系统资源

查看cpu使用率 top

top

查看内存使用率 free

free -m
              total        used        free      shared  buff/cache   available
Mem:           874M        178M        301M         11M        395M        632M
Low:           874M        573M        301M
High:            0B          0B          0B
Swap:           99M          0B         99M

total:总内存
used:已使用的内存(包含 shared、buffers、cached)
free:未分配的内存
shared:共享内存
buffers:块设备的读写缓冲区
cached:文件系统的cache

查看系统信息 uname

uname -a
Linux study.centos.vbird 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015
x86_64 x86_64 x86_64 GNU/Linux

系统,主机名,版本号,时间,架构

查看系统启动时间 uptime

uptime
02:35:27 up  7:48,  3 users,  load average: 0.00, 0.01, 0.05

开机流程

开机自启脚本

过去用过 Linux 的朋友大概都知道,当系统完成开机后,还想要让系统额外执行某些程序的话,可以将该程序指令或脚本的绝对路径名称写入到 /etc/rc.d/rc.local 这个文件去!新的 systemd 机制中,它建议直接写一个 systemd 的启动脚本配置文件到 /etc/systemd/system 底下,然后使用systemctl enable 的方式来设定启用它,而不要直接使用 rc.local 这个文件啦!
透过这个 chmod a+x /etc/rc.d/rc.local 的步骤,你的许多脚本就可以放在 /etc/rc.d/rc.local 这个文件内,系统在每次开机都会去执行这文件内的指令喔!

开机菜单

/boot/grub2/grub.cfg

menuentry 'CentOS Linux 7 (Core), with Linux 3.10.0-229.el7.x86_64' --class rhel fedora\
...

修改开机配置

/etc/default/grub

[root@study ~]# cat /etc/default/grub
GRUB_TIMEOUT=5 # 指定预设倒数读秒的秒数,0不等待,-1一直等待
GRUB_DEFAULT=saved # 指定预设由哪一个选单来开机,预设开机选单之意,使用的设定值包括有『 saved, 数字, title 名, ID 名』等等,通过开机选单中的ID设置最好。
GRUB_DISABLE_SUBMENU=true # 是否要隐藏次选单,通常是藏起来的好!
GRUB_TERMINAL_OUTPUT="console" # 指定数据输出的终端机格式,默认是透过文字终端机
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet" # 就是在 menuentry 括号内的 linux16 项目后续的核心参数
GRUB_DISABLE_RECOVERY="true" # 取消救援选单的制作

重建grub

grub2-mkconfig -o /boot/grub/grub.cfg
# grub2-install /dev/vda

vim命令

vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。

一般流程:
vi runoob.txt,打开文档
进入一般模式.
按下 i 进入输入模式(也称为编辑模式),开始编辑文字,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入。
按下 ESC 按钮回到一般模式
在一般模式中按下 :wq 储存后离开 vi

命令 作用
:q 是离开而不保存
:wq 是保存并离开
:q! 不保存退出
:set nu 显示行号
vim . 使用vim打开当前目录
:%d 全部删除
:u 撤销
gg 光标回到首行
n回车 光标跳到n行
Ctrl+f 向下翻一页
Ctrl+b 向上翻一页
0 移动到这一行最前面的字符
$ 移动到这一行最后面的字符
G 移动到这个档案的最后一行
gg 移动到这个档案的第一行
ggVG 全选
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird即可!
:1,$s/word1/word2/g :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !
:1,$s/word1/word2/gc:%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!
x 删除当前字符
yy 复制当前行
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行
dd 删除当前行
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。
u 复原前一个动作。

配置自定义设置,打开 /etc/vim/vimrc,写入命令即可设置自定义配置,如:

#设置tab键为4格
set tablestop=4

vim命令

块选择

在一般模式下,按v或者ctrl+v进行块选择,
y 复制
d 删除
p 粘贴

在所选行的行首添加字符

  1. ctrl+v 按方向键选中多行
  2. shift+i 插入字符
  3. ESC 完成所有行字符插入

多文件编辑

 vim FileA FileB

使用:file来选择需要编辑的文件。

多窗口

:sp FileName

切换窗口:
Ctrl+W+上下左右

关闭窗口:
quit
only

Bash Shell

shell简介

shell用于用户和操作系统内核进行交互。
由于早年的 Unix 年代,发展者众,所以由于 shell 依据发展者的不同就有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为‘ Bourne Again SHell (简称 bash) ’,这个 Shell 是 Bourne Shell 的增强版本,也是基准于 GNU 的架构下发展出来的呦!

1.查看可用shell

gedit /etc/shells
/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预设的 shell)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)

2.查看预设的shell

gedit /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

如上所示,在每一行的最后一个资料,就是你登入后可以取得的预设的 shell 啦!那你也会看到, root 是 /bin/bash ,不过,系统账号 bin 与 daemon 等等,就使用那个怪怪的 /sbin/nologin 啰~

Bash Shell简介

Bash Shell是Linux预设的shell,优点有:
历史命令查找;Tab补全功能;alias别名;工作控制、前景背景控制;程式化脚本;正则表达式等。

变量

在进入 shell 之前,也正如同上面提到的,由于系统需要一些变数来提供他资料的存取 (或者是一些环境的设定参数值, 例如是否要显示彩色等等的) ,所以就有一些所谓的‘环境变数’ 需要来读入系统中了!这些环境变数例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的, 为了区别与自订变数的不同,环境变数通常以大写字元来表示呢!

显示变量

显示变量使用 echo $ 方式。

echo ${PATH}
echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin

设置变量

# 设置变量
myname=ala

# 取消变量
unset myname

bash脚本的内置变量

$0 : 本文件名
$1 :  第一个参数
$2 :  第二个参数
$3:  第三个参数
$4 :  第四个参数
$# : 参数个数
$@ :  “$1”“$2”“$3”“$4”
$* :  “$1 $2 $3 $4”

环境变量

显示环境变量

# 显示PATH环境变量
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

其中:是分隔符.

# 显示所有环境变量
export
HOSTNAME=study.centos.vbird    <== 这部主机的主机名称
TERM=xterm                     <== 这个终端机使用的环境是什么类型
SHELL=/bin/bash                <== 目前这个环境下,使用的 Shell 是哪一个程式?
HISTSIZE=1000                  <== ‘记录指令的笔数’在 CentOS 预设可记录 1000 笔
OLDPWD=/home/dmtsai            <== 上一个工作目录的所在
LC_ALL=en_US.utf8              <== 由于语系的关系,鸟哥偷偷丢上来的一个设定
USER=dmtsai                    <== 使用者的名称啊!
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:
or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:
*.tar=01...                    <== 一些颜色显示
MAIL=/var/spool/mail/dmtsai    <== 这个使用者所取用的 mailbox 位置
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
PWD=/home/dmtsai               <== 目前使用者所在的工作目录 (利用 pwd 取出!)
LANG=zh_TW.UTF-8               <== 这个与语系有关,底下会再介绍!
HOME=/home/dmtsai              <== 这个使用者的家目录啊!
LOGNAME=dmtsai                 <== 登入者用来登入的账号名称
_=/usr/bin/env                 <== 上一次使用的指令的最后一个参数(或指令本身)

设置环境变量

export可以将普通变量变为环境变量,但只能在当前bash中生效,为了每次都会生效,可以写在~/.bashrc中:

CDQ=hellocdq!
export CDQ

输入 read

read -p "Please keyin your name: " -t 30 named
Please keyin your name:

输出 echo

echo "hello"

别名 alias

alias lm='ls -al | more'

bash欢迎信息

还记得在终端机界面 (tty1 ~ tty6) 登入的时候,会有几行提示的字串吗?那就是进站画面啊! 那个字串写在哪里啊?呵呵!在 /etc/issue 里面啊!

cat /etc/issue
\S
Kernel \r on an \m

issue 内的各代码意义:
\d 本地端时间的日期;
\l 显示第几个终端机界面;
\m 显示硬件的等级 (i386/i486/i586/i686...);
\n 显示主机的网络名称;
\O 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\S 操作系统的名称;
\v 操作系统的版本。

bash执行方式

如果直接执行bash脚本,那其实是在子bash中执行的程序;
如果使用source执行脚本,那么其实是将脚本中内容导入到该bash中,就不会开子bash。

bash的环境配置文件

login shell即首次登录需要输入密码那次的shell;
nologin shell即输入过密码,下次不需要再输入密码的shell。

login shell

/etc/profile 即每个使用者登入取得 bash 时一定会读取的配置文件!
/etc/profile.d/*.sh
其实这是个目录内的众多文件!只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,另外,使用者能够具有 r 的权限, 那么该文件就会被 /etc/profile 呼叫进来。在 CentOS 7.x 中,这个目录底下的文件规范了 bash 操作接口的颜色、 语系、ll 与 ls 指令的命令别名、vi 的命令别名、which 的命令别名等等。如果你需要帮所有使用者设定一些共享的命令别名时, 可以在这个目录底下自行建立扩展名为 .sh 的文件,并将所需要的数据写入即可喔!
/etc/locale.conf
这个文件是由 /etc/profile.d/lang.sh 呼叫进来的!这也是我们决定 bash 预设使用何种语系的重要配置文件! 文件里最重要的就是 LANG/LC_ALL 这些个变量的设定啦!
/usr/share/bash-completion/completions/*
记得我们上头谈过 [tab] 的妙用吧?除了命令补齐、档名补齐之外,还可以进行指令的选项/参数补齐功能!那就是从这个目录里面找到相对应的指令来处理的! 其实这个目录底下的内容是由/etc/profile.d/bash_completion.sh 这个文件载入的啦!
反正你只要记得,bash 的 login shell 情况下所读取的整体环境配置文件其实只有 /etc/profile,但是/etc/profile 还会呼叫出其他的配置文件,所以让我们的 bash 操作接口变的非常的友善啦!


~/.bash_profile
bash 在读完了整体环境设定的 /etc/profile 并藉此呼叫其他配置文件后,接下来则是会读取使用者的个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是:

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

其实 bash 的 login shell 设定只会读取上面三个文件的其中一个, 而读取的顺序则是依照上面的顺序。

non-login shell

~/.bashrc

source

source的作用是读入配置文件的内容到目前的shell环境中来。以下两种方式是相同的:

source ~/.bashrc
. ~/.bashrc

管道命令 pipe

管线命令使用的是‘ | ’这个界定符号! 另外,管线命令与‘连续下达命令’是不一样的呦!
假设我们想要知道 /etc/ 底下有多少档案,那么可以利用 ls /etc 来查阅,不过, 因为 /etc 底下的档案太多,导致一口气就将屏幕塞满了~不知道前面输出的内容是啥?此时,我们可以透过 less 指令的协助,利用:

ls -al /etc | less

如此一来,使用 ls 指令输出后的内容,就能够被 less 读取,并且利用 less 的功能,我们就能够前后翻动相关的资讯了!

筛选命令 grep
就是将一段资料经过分析后,取出我们所想要的。或者是经由分析关键字,取得我们所想要的那一行!

# 在文件中查找关键字
grep 关键字 文件

其他管道命令
cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs

输出重定向

标准输出重定向

# 覆盖源文件
echo "hello" > ~/test.txt

# 续写源文件
echo "hello" >> ~/test.txt

标准错误输出重定向

echo "hello" 2> ~/test.txt
echo "hello" 2>> ~/test.txt

联合输出重定向

# 标准输出和错误输出写到相同文件
echo "hello" 1> ~/richedit.log 2>&1

bash快捷键

命令 作用
ctrl+alt+t 打开终端
Ctrl+a 移动到当前行的开头
Ctrl+l 刷新屏幕
Ctrl+c 终止当前正在运行的程序。
ctrl+shift+c 复制
ctrl+shift+v 粘贴
ctrl+shift+t 新建标签页
ctrl+shift+w 关闭标签页
Ctrl+PageUp/Ctrl+f 前一标签页
Ctrl+PageDown/Ctrl+b 后一标签页
F11 全屏
ctrl + l 清屏
ctrl + c 终止命令
ctrl + d 退出 shell
ctrl + z 将当前进程置于后台,fg 还原
ctrl + r 从命令历史中找
ctrl + u 清除光标到行首的字符(还有剪切功能)
ctrl + w 清除光标之前一个单词 (还有剪切功能)
ctrl + k 清除光标到行尾的字符(还有剪切功能)
ctrl + y 粘贴 Ctrl+u 或 Ctrl+k 剪切的内容
ctrl + t 交换光标前两个字符
Alt + d 由光标位置开始,往行尾删删除单词
Alt + . 使用上一条命令的最后一个参数
Alt – b || ctrl + 左方向键 往回(左)移动一个单词
Alt – f || ctrl + 右方向键 - 往后(右)移动一个单词

ip配置

Ubuntu16.04 ip配置

sudo gedit /etc/network/interfaces
auto eth0                  #设置自动启动eth0接口
iface eth0 inet static     #配置静态IP
address 192.168.11.88      #IP地址
netmask 255.255.255.0      #子网掩码
gateway 192.168.11.1        #默认网关

重启网络:

sudo /etc/init.d/networking restart

Ubuntu 18.04 ip配置

Ubuntu 18.04的网络管理程序改为netplan了,因此配置方式也需要改喽!
查看ip

ifconfig -a

设置静态ip

sudo gedit /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: [192.168.199.101/24, ]
            dhcp4: no
            dhcp6: no
            gateway4:  192.168.199.1
            nameservers:
                addresses: [8.8.8.8, 9.9.9.9]
    version: 2

其中,把dhcp4/dhcp6都设为no予以关闭,设上自己的ip地址、网关和域名服务器。
应用网络:

netplan apply

代理配置

bash代理

sudo gedit ~/.bashrc
export http_proxy=https://127.0.0.1:8000
export https_proxy=https://127.0.0.1:8000
# export http_proxy=https://邮箱用户名:邮箱密码@proxy.xxx.com:8080/
source ~/.bashrc

apt代理

sudo gedit /etc/apt/apt.conf
Acquire::https::proxy "https://127.0.0.1:8000/";
Acquire::https::proxy "https://127.0.0.1:8000/";
# Acquire::http::proxy "https://邮箱用户名:邮箱密码@proxy.xxx.com:8080/";

Shell脚本

www.purethought.cn/40027.html

Ubuntu开机自动登录

右上角 -> System Settings... -> User Accounts -> Automatic Login -> ON

网线直连

将两台电脑的静态ip设置为相同频段即可。如:
A电脑

ip地址:192.168.0.2
子关掩码:255.255.255.0
默认网关:192.168.0.1

B电脑

ip地址:192.168.0.3
子关掩码:255.255.255.0
默认网关:192.168.0.1

然后可以使用ping进行测试。

磁盘与分区

磁盘的物理结构

磁盘接口模式有SATA,USB,SCSI等。
磁盘为盘状,其上由扇区和磁道组成,扇区通过被磁化或未被磁化来记录1和0,每一圈的磁道和扇区组成磁柱,磁柱是分区槽的最小单位。
为什么要分区呢?

  • 数据分离,格式化就只格式化某个分区的数据;
  • 系统效能。

分区表分为MSDOS(MBR)和GPT两种格式。
由于MBR的历史原因,只在磁盘的第一扇区做开机管理程序,这个扇区通常是 512bytes 的大小(旧的磁盘扇区都是 512bytes 喔!),所以说,第一个扇区 512bytes 会有这两个数据:

  • 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes。

由于分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。64/4=16bytes,16/2=8bytes,所以每个磁柱号占用8字节?

为了存储效率,通常以一组扇区的大小为一个block,作为数据记录的最小单位,因为记录数据的最小单位太大和太小都不合适,所以通常block为4k(1k,2k,4k)。

MSDOS (MBR) 分区表格式与限制

由于第一扇区会记录四笔分区信息,因此逻辑分区是从/dev/sda5开始的。
MBR 主要分区、延伸分区与逻辑分区的特性我们作个简单的定义啰:

  • 主要分区与延伸分区最多可以有四笔(硬盘的限制)
  • 延伸分区最多只能有一个(操作系统的限制)
  • 逻辑分区是由延伸分区持续切割出来的分区槽;
  • 能够被格式化后,作为数据存取的分区槽为主要分区与逻辑分区。延伸分区无法格式化;
  • 逻辑分区的数量依操作系统而不同,在 Linux 系统中 SATA 硬盘已经可以突破 63 个以上的分区限制;

GUID partition table, GPT 磁盘分区表

与 MBR 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!

  • LBA0 (MBR 相容区块)
    与 MBR 模式相似的,这个兼容区块也分为两个部份,一个就是跟之前 446 bytes 相似的区块,储存了第一阶段的开机管理程序! 而在原本的分区表的纪录区内,这个兼容模式仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的磁盘管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护了此磁盘喔!
    -LBA1 (GPT 表头纪录)
    这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区 (就是前面谈到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码 (CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以透过这个纪录区来取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运作!
  • LBA2-33 (实际纪录分区信息处)
    从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,所以在默认的情况下,总共可以有 432 = 128 笔分区纪录喔!因为每个 LBA 有 512bytes,因此每笔纪录用到 128 bytes 的空间,除了每笔纪录所需要的标识符与相关的纪录之外,GPT 在每笔纪录中分别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对于单一分区槽来说, 他的最大容量限制就会在『 264 * 512bytes = 263 * 1Kbytes = 2^33TB = 8 ZB 』,要注意 1ZB = 30TB 啦! 你说有没有够大了?

查看磁盘容量

df会去搜索超级块区中所记录的磁盘信息。

df -ah

查看当前目录容量

du

查看硬盘信息

parted

sudo parted /dev/sda print

查看硬盘序列号

lsblk --nodeps -no serial /dev/nvme0n1

挂载iso

mkdir /mnt/cdq
mount abc.iso /mnt/cdq -o loop
cd /mnt/cdq

卸载iso

cd 
umount /mnt/cdq

结束

参考链接:
https://www.runoob.com/linux/linux-shell.html
https://www.cnblogs.com/nyist-xsk/p/7929859.html
https://www.cnblogs.com/sunyllove/p/9772053.html
https://linux.vbird.org/linux_basic/centos7/0220filemanager.php
https://blog.csdn.net/politefish/article/details/4729551

posted @ 2020-05-11 06:23  多弗朗强哥  阅读(413)  评论(0编辑  收藏  举报