Ubuntu Server学习

** Xshell **

  • 复制:Ctrl+Insert *

  • 粘贴:Shift+Insert *

登录

**远程登录 **

1
2
3
4
5
6
7
8
9
10
*command 参数1 参数2*
# 查询ip地址,用Xshell连接
ip addr
# 查看当前目录
pwd
# 注销,退出
exit or Ctrl+d
# 关机
power off本机上操作
rebot 重启

使用root用户登录
root用户是超级管理员,权限很大。

1
2
3
执行命令 sudo passwd root
修改密码后
执行命令 su - root 切换到root账号

文本编辑vi

vi的三种模式

  • 命令模式
    • h — 光标左移一个字符
    • j — 光标下移一个字符
    • k — 光标上移一个字符
    • l — 光标右移一个字符(插入模式上下左右键)
    • gg — 回到开始行
    • G —移动到文件末尾
    • Ctrl + f 往下翻一页
    • Ctrl + b 往上翻一页
    • yy 复制光标所在行
    • p 粘贴
  • 插入模式 ESC 退回命令模式
    • a —光标所在位置后插入文本 append
    • i —光标所在位置前插入
    • o —插入新行
  • 底行模式
    在屏幕底部打开命令行,主要是 保存、退出
    • :wq 保存文件并退出
    • :q不保存,并退出
    • :q! 编辑过了,不保存文件,强制退出
    • :w只保存文件,不退出vi
    • :set nu 显示行号
    • /abc 查找abc字符
    • :1,$s/string/replace/g 替换功能,把文件中的string替换为replace

文件系统

Linux中,文件是一个非常广泛的概念。
Linux中的文件,不仅仅指磁盘上的文本、图片、视频文件,也包括硬件设备。

分区和文件系统

在windows上,可以为一块磁盘分区,创建好分区后,还不能直接在分区里存放文件,需要格式化分区。所谓格式化分区,即为分区安装文件系统
windows上使用的主要是 NTFS。
Linux上有 ext2 ext3 ext4等

文件系统是一种规范,规定了文件存放在磁盘上的方式

  • Windows文件系统里面都是磁盘文件或目录
  • Windows的文件路径是从盘符开始的
  • Windows上的文件的路径是大小写不区分的

挂接

但是,Linux系统不同,Linux文件系统里面不都是磁盘文件。

从Window过来学习Linux的同学要纠正一个思维定式,就是看到路径就一定要和磁盘上的存储的目录或文件对应起来。

而Linux文件系统目录里面除了磁盘文件,还有很多设备、甚至一些虚拟的对象,也在文件系统目录里面访问。

image-20230708132927260

随后的启动过程,才会,将不同的分区 挂接(mount) 到文件系统不同的目录中。

上图就是把一个磁盘分区挂接到 /opt 下面。 /opt 这个路径在这个动作中被称为挂接点。

挂接后的文件系统目录如下图所示。

image-20230708133028097

一个文件的全路径 是 从 根 到 该文件 这条路径上 所有节点名 顺序连接,每个节点之间以 / 分开。

注意:区分大小写

目录和文件操作

当前工作目录 /home/用户名

绝对路径 /相对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd .  当前路径
cd .. 父级路径
cd ~ 相当于cd /home/当前用户名
cat 显示文件
mkdir 创建目录
mkdir -p 依次创建多层目录
rm 删除文件
rm -r 删除目录
rm -rf 全部删除,不要确认
rm -f 硬性删除,不需要确认

通配符
* 匹配任意多个字符
? 匹配任意1个字符
[abcd]匹配abcd中任意一个字符

拷贝
cp 源文件 目标文件
cp -r 拷贝目录

移动/重命名
mv 源文件/目录 目标目录

搜索关键字
grep -n error 文件 查找文件中有error的行

du -h # 查看磁盘使用情况

用户管理和文件权限

现代操作系统都是一个多用户的操作系统。

添加/删除用户

1
2
3
adduser # 添加用户,自动建立一个同名用户组
adduser --ingroup root hxh #把hxh用户添加到root组里面
deluser hxh # 删除账号hxh

设置密码

1
passwd #修改密码su

用户切换

1
su - hxh2 # 切换到用户hxh

用户组

1
2
3
4
5
6
7
groups hxh # 查看hxh属于哪个用户组
cat /etc/group # 查看所有组
addgroup hxhs # 添加hxhs组 注意在root权限下
delgroup # 删除组
usermod -g g1 byhy # 将byhy用户添加到g1组中
usermod -G g2,g3 byhy # 将byhy用户设置到g2 g3组中
usermod -a -G g1,g2 byhy # 将byhy用户添加到g2 g3组中 a==append

文件权限

Linux文件的访问有三种权限: 读(用字母r表示)、写(用字母w表示)、执行(用字母x表示)

某个用户 对于一个 文件 :

  • 有读权限,表示该用户可以读取文件的内容,

  • 有写权限,表示该用户可以修改文件内容,

  • 有执行权限, 表示该用户可以运行该文件(当然该文件应该是可执行文件)

而 这三种权限 对目录,含义又不一样。

某个用户 对于一个 目录 :

  • 有读权限,表示该用户可以查看该目录里面的内容,

  • 有写权限,表示该用户可以在该目录里面 创建 和删除 文件,

  • 有执行权限, 表示该用户可以使用 cd命令,进入该目录

对 某个文件或者目录,Linux系统需要说明 三种类型的用户 ,分别具有怎样的权限

这三种类型分别是:

  • 文件的所有者,英文叫 owner , 也就是 该文件的 创建者

  • 文件归属的用户组里面的用户 ,英文叫 grouper,

  • 其他用户 (非owner和非grouper)

Linux系统需要为每个文件和目录,指定这个三种类型的用户,具有什么r、w、x里面的哪些权限

文件存取权限的显示 可以通过”ls -l”命令显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
drwxr-xr-x 3 root root 4096 Jul  8 06:31 h1
drwxr-xr-x 2 root root 4096 Jul 8 06:02 h3
-rw-r--r-- 1 root root 226 Jul 8 06:14 nnu.txt
drwx------ 3 root root 4096 Jul 7 13:25 snap

d表示dir目录
-表示文件
owner grouper 其他用户

# g表示同组用户
chmod u+x nnu.txt

u 拥有者(user --- owner)
g 与拥有者同一组的用户(group)
o 其他人(other)
a 所有人(all)

chmod u+w file1 ,该命令添加了 拥有者对file1文件的写权限

chmod u-x file1 ,该命令去掉了 拥有者对file1文件的执行权限

chmod ug+rwx file1 ,该命令添加了 拥有者和同组用户 对file1文件的 读、写、执行权限

chmod a+rwx file1,该命令添加了 所有人 对file1文件的 读、写、执行权限

chmod o+rx /root , 该命令添加了 其它组 对 目录 /root 的可读可执行权限。 对于目录来说 ,可执行权限意味着,用户可以 cd 进入 到这个目录。

chmod -R o+rx /root , 参数 -R 表示递归的意思,该命令执行结果是:其它用户可以对 /root 目录以及所有它的子目录、子文件 都有 可读可执行权限 。

chown byhy test1 ,就把文件test1的所有者变更为用户byhy

chown byhy:byhy test1 ,就把文件test1的所有者变更为用户byhy,所属组变为byhy

chown -R byhy dir1 ,就把目录dir1以及下面所有的子目录和文件的所有者变更为用户byhy

也可以用命令chgrp改变文件所有者组,格式如下

sudo

sudo以root权限运行程序
例如:sudo adduser hxh 以root权限添加用户hxh

进程管理

windows下的可执行文件.exe
正在运行的实例称为进程

1
ps # 查看进程信息

进程的创建和查看
Linux中,一个进程A里面可以创建一个新的进程B,进程A叫做进程B的父进程,B叫做A的子进程。

1
2
3
4
5
6
7
8
9
10
11
ps 显示和当前终端有关的进程信息

ps -u byhy 显示byhy用户所创建的进程信息

ps -f 详细显示每个进程信息

ps -e 显示所有正在运行的进程信息

ps -ef 显示当前系统所有的进程

ps –ef | grep python 查找python进程

进程的前台、后台转换

Linux终端通过Shell程序来接收用户输入的命令,并且执行命令。

我们在Shell里正在执行的,和用户进行人机交互的进程叫 前台进程 (foreground process)

前台进程可以接收键盘输入并将结果显示在显示器上。

用户敲入什么命令,shell就会启动对应的程序,运行在 前台

有些程序运行时,并不需要和用户进行交互,也就是说,不需要用户输入什么内容。 比如一个日志分析程序,一个定时清理磁盘文件的程序。

比如,下面这样的一个Python程序 t2.py:

1
2
3
4
5
6
7
import time

while True:
print("execute a task ...")
time.sleep(2)
print("done, wait for an hour to proceed...")
time.sleep(3600)

我们可以执行命令 python3 t2.py 运行它

这样的程序,运行期间,如果在前台执行,我们只能等待它结束,不然我们没法执行下个程序。

但是既然不需要用户输入信息,在前台执行,没有太大意义,我们应该要让它在 后台 执行。

要让它在后台运行,启动时只需在命令行的最后加上“&”符号。

比如 python3 t2.py &

后台运行的进程我们叫后台进程(background process),或者后台任务 ,它不直接和用户进行交互的进程。用户一般是感觉不到后台进程程序的运行。

nohup

我们在执行命令时候,使用 & 结尾可以使进程在后台进行。
但是如果终端关闭,程序也会被关闭,因为shell会发送SIGHUP信号给这些进程,进程接受的该信号,如果没有特别的处理,缺省就会结束运行。
未来避免这种情况,可以使用nohup

1
nohup python3 xxx.py & # 后台运行xxx.py,且不会因为终端的关闭导致进程结束

进程的终止

  • 自行终止

    • 执行完任务自动结束
    • ctrl c 结束 / exit
  • 被强制杀死

    1
    kill -1 id # 杀死id号的进程,使用ps查看进程的id号

重定向和管道

stdin/stdout/stderr与重定向

什么是终端?人—终端—程序
Linux进程在启动后,通常会打开3个文件句柄,标准输入文件(stdin),标准输出文件(stdout),标准错误文件(stderr)。
Linux进程,要从用户那里读入输入的信息,从stdin文件读取信息,输出信息给用户是输出到stdout,输出错误信息是输出到stderr。
缺省情况下这三个文件都是指向 终端设备。
即:Linux从stdin里面读取信息其实就是从终端设备读取信息
Linux进程写入信息到stdout stderr就是打印到终端设备上。

重定向:使用**>**符号可以将输出结果输出到其他文件

1
2
3
4
5
6
7
8
# 标准输出重定向
ps > out # 将stdout指向out文件
ps hhh 2> out # 将错误指向out文件,不存在ps hhh的指令
command &> both # 同时重定向
command > out 2> err # 分别重定向

# 标准输入重定向
python add.py < add.dat # 将add.dat内容作为add.py的输入

管道
grep命令可以从文件中过滤出包含指定字符串模式的行。

1
2
grep mike file1 # 在file1文件中过滤包含mike的行
ps -ef | grep mike # 使用管道操作符,从ps -ef结果中过滤

将一个命令的输出内容,作为另一个命令的输入内容。

apt

Advanced Packing Tool

更改源

  1. 以root账号登录,或者后续命令前面加 sudo 以root执行
  2. 执行命令 cd /etc/apt 进入到目录 /etc/apt
  3. 执行命令 cp sources.list sources.list.bak 先创建备份文件,这样万一改错,可以有备份文件恢复
  4. 执行 vi sources.list 打开文件, 准备把域名从从 cn.archive.ubuntu.com 替换为 mirrors.163.com
  5. 按 冒号,进入底行模式,输入命令 1,$s/cn.archive.ubuntu.com/mirrors.163.com/g 进行替换
  6. 确认一下域名修改正确后,输入 :wq 保存退出。
  7. 执行命令 apt update , 让修改生效
1
2
3
4
apt install package1 # 安装装软件
apt list --installed # 列出所有安装信息
apt list package1 # 列出指定程序包信息
apt remove package1 # 删除软件包

启动、重启、关闭服务

inux上有些软件程序是以服务的形式安装的,比如 SSH 服务、 MySQL服务、 nginx服务等。

这些 软件 的启动、重启、关闭 要使用特殊的命令

在当前的 Ubuntu 系统上,使用命令 systemctl 来 启动、重启、关闭 服务。

  • 要查看 服务 ssh 状态, 执行命令 systemctl status ssh

  • 要启动 服务 ssh, 执行命令 systemctl start ssh

  • 要重启 服务 ssh, 执行命令 systemctl restart ssh

  • 要关闭 服务 ssh, 执行命令 systemctl stop ssh

打包与压缩

打包

Linux下打包的最常用命令是tar 命令,可将多个文件、目录打包到一个文件中。

1
2
3
4
5
6
7
8
tar cvf byhy.tar ./byhy  byhy.txt  # tar 命令打包
tar cvf files1.tar *.txt
tar cvf files.tar 123.txt 456.txt 789.txt

tar xvf files.tar # tar 命令解包

tar tvf files.tar # 查看包内内容
tar rvf files.tar newfile # 向包内添加内容

注意:tar命令只是把文件、目录打包到一个文件中。 并不会压缩文件

压缩

gzip命令用于文件的压缩与解压缩,压缩后的文件名后缀为“.gz”

1
2
gzip abc.txt # 压缩
gzip -d abc.txt.gz # 解压缩

gzip 和 tar 的联合使用

1
tar zcvf byhy.tar.gz  *.txt  打包*.txt再压缩到byhy.tar.gz

解压缩并解包,使用下面命令:

1
tar zxvf byhy.tar.gz # 解压并解包

● bzip2、zip 压缩、解压

bzip2 和 zip 也是常见的压缩解压工具, 使用方法和 gzip 类似

如下

1
2
3
4
5
6
7
8
9
10
11
12
13
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip -r FileName.zip DirName
---------------------------------------------

注意:如果你的Linux上没有安装 bzip2、zip、unzip,可以执行命令 apt install bzip2 zip unzip 来安装。

查看系统进程的动态运行情况

1
2
3
4
top 
top -p 5523
free -m # 以m为单位查看
uname –a # 查看系统内核版本信息

cpu整体负载

1
Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st

各个cpu的负载(按键盘1,可以在整体cpu和所有cpu之间切换)

1
2
3
4
Cpu0  :  0.3%us,  0.3%sy,  0.0%ni, 97.7%id,  1.3%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

整体内存使用量

1
2
KiB Mem :  2895572 total,  2507692 free,   118824 used,   269056 buff/cache
KiB Swap: 3145724 total, 3145724 free, 0 used. 2598756 avail Mem

​ 按快捷键大写的 M 可以 对进程列表按照内存使用率来排序,各个进程对内存的占用(RES)

网络管理

一个网卡可以配置多个网络接口

1
ip addr # 查看ip地址

启用、禁用网络接口

启用和禁用网络接口,常用的是 ifupifdown ,要使用root用户执行
Ubuntu 现在缺省是没有这两个命令的, 可以先运行 apt install ifupdown 安装一下。

● 启用网络接口

使用命令 ifup,比如下面的命令就是启用网络接口 enp0s3

1
ifup enp0s3

● 禁用网络接口

使用命令 ifdown,比如下面的命令就是禁用网络接口 enp0s3

1
ifdown enp0s3

ping 检测网络连通性

我们经常需要检查是否可以从本机访问某个远程主机,这时应该使用 ping 命令
例如:

1
2
3
4
5
$ ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.158 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.228 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.281 ms

上面的结果就表示 本机 和 IP 为192.168.100.1 的设备(可能是计算机也可能是路由器)之间的网络是通畅的。
可以按 ctrl+C 终止 测试。

netstat查看网络状态

Ubuntu 现在缺省安装的查看网络状态的工具是 Socket Statistics, 命令名为 ss

但是 目前这个工具使用还不是特别广泛,目前查看网络状态大多数人还是会使用著名的 netstat 。netstat 这个命令通常用来 查看各种与网络相关的状态信息,包括:网络的连接、状态、接口的统计信息、路由表、端口的监听情况。但是 Ubuntu 现在缺省没有安装这个netstat, 可以使用命令 sudo apt install net-tools 安装 net-tools 工具包后,即可使用。

常用参数:

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-n 不显示端口协议名,显示端口数字

-l 只显示 Listen (监听) 的状态端口

-p 显示建立相关链接的进程PID

-r 显示路由信息,路由表

Netstat 最常用的地方就是查看网络连接情况,比如查看22端口上的tcp网络连接情况

使用命令 netstat -anp | grep 22 | grep tcp

1
2
3
4
[root@localhost ~]# netstat -anp |grep 22 |grep tcp
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 977/sshd
tcp 0 52 192.168.10.199:22 192.168.10.92:63911 ESTABLISHED 2011/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 977/sshd

SSH (secure shell)登录远程机器

之前我们使用的是Windows下面的终端模拟器PuTTY 远程登录Linux主机。在Linux下,也可以远程登录其他Linux主机,只需要运行ssh命令即可。命令的格式如下

1
ssh  用户名@IP地址或机器域名

比如,你要 使用 user1 账号 远程登录 192.168.1.12 这台Linux机器,执行下面的命令

1
[byhy@localhost ~]$ ssh user1@192.168.1.12

一般首次登录某个主机的时候,会出现如下提示:

1
2
3
The authenticity of host '192.168.1.12 (192.168.1.12)' can't be established.
RSA key fingerprint is cf:2c:22:d1:e8:4e:f3:16:43:09:9c:c6:fe:fc:9a:22.
Are you sure you want to continue connecting (yes/no)?

这是因为该远程机器没有被认证过(可能会有‘中间人’攻击的安全隐患),让你确认一下。这里如果是局域网里面的机器,一般安全没有什么问题,输入yes并回车即可。

接下来,会提示输入对应用户的密码,你输入正确的密码即可登录。

scp拷贝文件

在Linux上,可以直接使用scp命令 和远程Linux主机 进行文件的拷贝。

scp是secure copy的缩写,意为文件安全拷贝,它可以将远程Linux系统上的文件拷贝到本地计算机,也可以将本地计算机上的文件拷贝到远程Linux系统上。比如:

我们已经登录到主机A上面,要将 /home/byhy1 目录下面的文件abc.txt,拷贝到主机B的/home/byhy2目录下面,主机B的IP地址为:192.168.1.12我们要拷贝到 B主机, 必须要有B主机的用户账号, 假如B主机的账号是 byhy2,应该这样写

1
scp /home/byhy1/abc.txt byhy2@192.168.1.12:/home/byhy2

接下来,会提示用户输入用户byhy2的密码,输入正确密码后,进行拷贝操作。如果,我们要 在主机A上面,将主机B上面的文件/home/byhy2/123.txt 拷贝到主机A的/tmp/下面:

1
scp byhy2@192.168.1.12:/home/byhy2/123.txt /tmp/

winscp

在windows机器上和远程Linux机器进行文件的拷贝

wget下载

Linux中,要从网络下载文件,可以使用 wget。

wget就是一个下载文件的命令行工具。

例如:

1
wget https://mirrors.aliyun.com/centos/timestamp.txt

防火墙

通常网站服务之类的产品运行在Ubuntu上,我们会开启防火墙。防止恶意的网络访问和攻击。

Ubuntu目前使用命令 ufw (uncomplicated firewall) 管理防火墙功能。

缺省 ufw 是未被激活的,执行如下命令激活。

1
2
3
4
5
6
7
8
9
10
11
12
13
ufw enable # 开启防火墙
ufw disable # 关闭防火墙


ufw default allow/deny:外来访问默认允许/拒绝

ufw allow/deny 20:允许/拒绝 访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。

ufw allow/deny servicename:ufw从/etc/services中找到对应service的端口,进行过滤。

ufw allow proto tcp from 10.0.1.0/10 to 本机ip port 25:允许自10.0.1.0/10的tcp封包访问本机的25端口。

ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则

注意:这个命令最好是在 虚拟机终端执行。

如果是Putty远程登录,并且当前没有允许SSH访问的ufw规则,执行这个命令可能就会断开连接。

可以执行如下命令检查 当前的 防火墙设置

1
ufw status

或者查看更详细的信息

1
ufw status verbose

● 开放端口

如果我们允许 外面从网络访问本机的 SSH TCP 服务端口 22 ,应该这样执行命令

1
ufw allow 22/tcp

如果你知道端口对应的服务名,也可以使用名字。

比如下面的命令可以允许外面从网络访问 本机的 ssh 服务

1
sudo ufw allow ssh

比如下面的命令可以允许外面从网络访问 本机的 HTTP 服务端口 80

1
ufw allow http

● 删除规则

要删除一个前面设定的规则,执行下面的命令

1
ufw delete allow http

一些配置操作