Linux 实验
知识补充
框架设计
Linux 操作可以分为本地操作和网络操作,操作对象主要是文件和目录,根据上述分类设计框架如下
-
本地操作
-
基础指令:系统一般内置
-
目录
-
目录切换:cd
-
增删改查
- mkdir
- rmdir
-
权限管理:chmod
chmod
命令的具体用法如下:chmod [选项] 模式 文件
其中,
模式
是用于表示权限的数字或字符,文件
是要修改权限的目标文件。常用的
chmod
参数如下:-r
:递归地修改目录及其子目录中的文件权限。-f
:强制修改文件权限。u
:表示文件所有者(user)的权限。g
:表示文件所属组(group)的权限。o
:表示其他用户(others)的权限。a
:表示所有用户(all)的权限。+
:增加权限。-
:减少权限。=
:设置权限。
-
-
文件
-
增删改查
-
创建空文件:touch
-
cat
- 追加 >>
- 覆盖 >
-
rm:一般用来删文件,也能删目录(但此时一般是为了删文件而删目录)
# 强行递归删除目录及其子目录中所有文件 rm -rf 目录名字 # 名梗解析:删库跑路 # / 代表Linux的系统根目录 # 删除系统根目录的所有文件: rm -rf /
-
find:根据文件的属性找文件,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等
-
grep:利用正则表达式,针对文件内容进行字符串匹配,输出符合正则表达式的行
-
-
移动
- 实体
- 复制:cp
- 剪切:mv
- 实体
-
符号链接(快捷方式):ln
ln -s 源文件路径 快捷方式路径
-
权限管理
-
权限查看:ls -ahl
用于查看文件权限信息的 ls 的常用参数包括:
-l
:以长格式显示文件信息,包括权限、所有者、所属组、大小、修改时间等详细信息。-a
:显示所有文件,包括以.
开头的隐藏文件。-h
:以人类可读的格式显示文件大小。-t
:按照最后修改时间排序。-r
:以相反顺序显示文件列表。-d
:仅显示目录信息,而不显示目录下的文件。-F
:在文件名后面加上一个字符来表示文件的类型,例如斜杠表示目录。-R
:递归地显示目录及其子目录下的文件。-s
:显示文件和目录的大小。-i
:显示文件的 inode 号。
-
权限修改:与目录同理
-
-
-
-
常用工具:不一定集成在系统中,可能需要额外下载
-
vim
-
git
当你使用
git push
命令时,你将本地分支的更新推送到远程仓库。下面是一个常见的使用示例:git push origin <branch-name>
其中,
origin
是远程仓库的名称,branch-name
是要推送的本地分支的名称。这个命令将会将本地分支的更新推送到与远程仓库中具有相同名称的分支上。如果你想将本地分支的更新推送到远程仓库的不同分支,可以使用以下命令:
git push origin <local-branch-name>:<remote-branch-name>
其中,
local-branch-name
是本地分支的名称,remote-branch-name
是你想要将其推送到的远程分支的名称。这个命令将会将本地分支的更新推送到指定的远程分支。当你使用
git pull
命令时,你将从远程仓库获取更新并将其合并到当前分支。下面是一个常见的使用示例:git pull origin <branch-name>
其中,
origin
是远程仓库的名称,branch-name
是你想要从远程仓库获取并合并的分支的名称。这个命令将会获取远程分支的更新,并将其合并到当前分支。如果你想要在
git pull
过程中进行变基(rebase)操作,可以使用以下命令:git pull --rebase origin <branch-name>
这个命令将会获取远程分支的更新,并在当前分支上进行变基操作,将本地的提交应用到远程分支的最新提交之上。
-
-
性能监控和配置查询
-
进程
-
ps
: 查看所有进程信息-A
:显示所有进程。-u
:显示属于指定用户的进程。-f
:显示完整格式的进程信息,包括UID、PPID等。-e
:显示所有进程,与-A
效果相同。-l
:显示长格式的进程信息,包括进程状态等。-o
:自定义输出格式,可以指定要显示的信息。-p PID
:显示指定PID的进程信息。-C COMMAND
:显示指定命令名称的进程信息。--forest
:以树状结构显示进程的层级关系。--sort
:按指定的列对进程进行排序。
-
ps -ef
:用标准的格式显示进程ps -ef | tail -1 #UID PID PPID C STIME TTY TIME CMD #root 287926 255060 0 03:21 tty1 00:00:00 tail -1
- UID:用户ID、但输出的是用户名
- PID:进程的ID
- PPID:父进程ID
- C:进程占用CPU的百分比
- STIME:进程启动到现在的时间
- TTY:该进程在哪个终端上运行
- 若与终端无关,则显示?
- 若为pts/0等,则表示由网络连接主机进程。
- CMD:命令的名称和参数
-
ps aux
:用 BSD 的格式来显示进程ps aux | tail -1 #USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND #root 286489 0.0 0.0 5216 816 tty1 S+ 03:20 0:00 tail -1
- USER:用户名
- %CPU:进程占用的CPU百分比
- %MEM:占用内存的百分比
- VSZ:该进程使用的虚拟內存量(KB)
- RSS:该进程占用的固定內存量(KB)(驻留中页的数量)
- STAT:进程的状态
- D:无法中断的休眠状态(通常 IO 的进程);
- R:正在运行可中在队列中可过行的;
- S:处于休眠状态;
- T:停止或被追踪;
- W:进入内存交换 (从内核2.6开始无效);
- X:死掉的进程 (基本很少见);
- Z:僵尸进程;
- <:优先级高的进程
- N:优先级较低的进程
- L:有些页被锁进内存;
- s:进程的领导者(在它之下有子进程);
- l:多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
- +:位于后台的进程组;
- START:该进程被触发启动时间
- TIME:该进程实际使用CPU运行的时间
- COMMAND:命令的名称和参数
-
lsof -i:<port>
: 查看指定端口号的信息
-
-
网络
ip a
:显示网络接口的信息,包括 IP 地址、网关和子网掩码。ifconfig
:显示网络接口的信息,和ip
命令类似。
-
系统
uname -a
:显示所有的系统信息,包括内核版本、操作系统版本和硬件架构。lsb_release -a
:显示操作系统发行版的详细信息。
-
硬件
top
: 查看硬件资源占用情况cat /etc/os-release
:显示操作系统的发行版本信息。cat /proc/cpuinfo
:显示 CPU 的信息,包括型号、核心数量和频率。cat /proc/meminfo
:显示内存的信息,包括总容量、可用容量和使用率。df -h
:显示磁盘空间的使用情况。free -h
:显示内存和交换空间的使用情况。lshw
:显示硬件信息,包括 CPU、内存、磁盘、网络设备等。
-
-
用户管理:用户本地操作权限管理
-
-
网络操作
-
远程连接:ssh
ssh root@172.16.157.128
-
文件上传 / 下载:scp
scp /path/to/local/file username@remote_ip:/path/to/remote/directory #示例:scp Dockerfile root@172.16.17.37:/home/2024-graduation-design/openresty-test
其中:
/path/to/local/file
是本地文件的路径。username
是远程服务器的用户名。remote_ip
是远程服务器的IP地址。/path/to/remote/directory
是远程服务器上文件存放的目录路径。
-
网络权限控制
-
用户管理:root 远程访问权限管理
要设置 root 账户的远程访问权限,您需要进行以下操作:
-
登录到服务器上的非 root 账户(例如普通用户账户)。
-
打开 SSH 配置文件
/etc/ssh/sshd_config
,可以使用任何文本编辑器进行编辑,例如 vim:sudo vim /etc/ssh/sshd_config
-
在文件中找到
PermitRootLogin
这一行,将其值改为yes
:# vim 查找 :/PermitRootLogin
PermitRootLogin yes
-
保存并退出文件。
-
重启 SSH 服务使更改生效,可以使用以下命令重启:
sudo systemctl restart sshd
-
-
防火墙配置
在CentOS下,可以使用以下命令开启或关闭防火墙:
-
开启防火墙:
sudo systemctl start firewalld
-
关闭防火墙:
sudo systemctl stop firewalld
-
永久关闭防火墙:
如果你希望防火墙在系统重启后仍然保持关闭状态,可以执行以下命令:
sudo systemctl disable firewalld
-
永久开启防火墙:
如果你希望防火墙在系统重启后仍然保持开启状态,可以执行以下命令:
sudo systemctl enable firewalld
-
-
安全组设置
要配置Linux安全组,可以通过
iptables
和firewalld
两种工具来实现。iptables
是一个Linux内核提供的工具,用于配置IPv4的数据包过滤规则和网络地址转换(NAT)规则。-
开启端口号:
sudo iptables -A INPUT -p <协议> --dport <端口号> -j ACCEPT sudo service iptables save sudo service iptables restart
-
关闭端口号:
sudo iptables -D INPUT -p <协议> --dport <端口号> -j ACCEPT sudo service iptables save sudo service iptables restart
firewalld
是 RHEL/CentOS 7 中提供的新的防火墙服务,相比 iptables 更加简单易用。开启端口号:
sudo firewall-cmd --zone=public --add-port=<端口号>/<协议> --permanent sudo firewall-cmd --reload
关闭端口号:
sudo firewall-cmd --zone=public --remove-port=<端口号>/<协议> --permanent sudo firewall-cmd --reload
-
-
-
实验
Linux 文件操作
简介
实验目的
通过本实验,你将学会在Linux系统中进行文件操作的基本命令的使用,包括创建和删除文件和文件夹、修改文件权限、复制和移动文件、查找文件等。
实验内容
- 创建文件和文件夹
- 删除文件和文件夹
- 向文件中追加和覆盖内容
- 查找文件
- 修改文件权限
- 复制和剪切文件
- 创建符号链接(快捷方式)
实验过程
- 在指定路径下创建文件夹和文件
- 删除文件夹以及里面的文件
- 向文件中追加内容或覆盖式写入
- 查看当前目录和文件详细信息
- 修改文件权限
- 复制和剪切文件
- 创建符号链接(快捷方式)
- 修改快捷方式等效于修改原文件
示例代码
# 切换成 root 用户,避免权限问题
su root
# 跳转至 home 目录
cd /home
# 创建文件夹
mkdir linux-file
cd linux-file
mkdir tmp
cd tmp
# 创建文件
touch tmp.txt
mkdir inner
cd inner
mkdir inner.txt
cd ../..
# 删除文件夹
rmdir tmp
#rmdir: tmp: Directory not empty
rm -rf tmp
# 向文件中追加
cat >> hello.txt
hello
linux
^D # Control + D:保存并退出
cat hello.txt
#hello
#linux
cd ..
# 查看当前目录
pwd
# 查找当前目录下文件
find $(pwd) hello.txt | grep hello.txt
#/home/linux-file/hello.txt
cd linux-file
cat hello.txt
#hello
#linux
cat hello.txt | grep hello
#hello
cat hello.txt | grep linux
#linux
# 覆盖式写入
cat > hello.txt
hello linux
^D # Control + D:保存并退出
cat hello.txt
#hello linux
cat hello.txt | grep hello
#hello linux
cat hello.txt | grep linux
#hello linux
# 查看详细信息
ls -alh
#total 12K
#drwxr-xr-x 2 root root 4.0k Nov 1 10:58 .
#drwxr-xr-x 4 root root 4.0K Nov 1 10:56 ..
#-rw-r--r-- 1 root root 12 Now 1 11:02 hello.txt
# 修改文件权限
chmod 777 hello.txt
ls -alh
#total 12K
#druxr-xr-x 2 root root 4.0K Nov 1 10:58 .
#druxr-xr-x 4 root root 4.0K Nov 1 10:56 ..
#-ruxrwxrux 1 root root 12 Now 1 11:02 hello.txt
mkdir tmp
# 复制文件
cp hello.txt tmp/hello-cp.txt
cd tmp
ls
#hello-cp.txt
# 剪切文件
mv hello-cp.txt ../hello-cp.txt
ls
#
cd ..
ls
#hello-cp.txt hello.txt tmp
# 快捷方式
ln -s $(pwd)/hello.txt $(pwd)/hello-shortcut.txt
# 查看详细信息
ls -alh
# d 开头:路径
# - 开头:文件
# l 开头:符号链接,即快捷方式
#total 20K
#druxr-xr-x 3 root root 4.0K Nov 1 11:09 .
#druxr-xr-x 4 root root 4.0K Nov 1 10:56 ..
#-rwxr-xr-x 1 root root 12 Nov 1 11:06 hello-cp.txt
#lruxraxrux 1 root root 26 Nov 1 11:09 hello-shortcut.txt -> /home/linux-file/hello.txt
#-ruxrwxrux 1 root root 12 Nov 1 11:02 hello.txt
#druxr-xr-x 2 root root 4.0K Nov 1 11:08 tmp
# 修改快捷方式,就相当于修改文件本身
# 追加
cat >> hello-shortcut.txt
shortcut
^D # Control + D:保存并退出
cat hello.txt
#hello linux
#shortcut
vim 使用
简介
本实验主要介绍如何使用vim编辑器,包括基本的编辑命令、模式切换、保存退出、搜索替换等操作。
知识补充
- 基本编辑命令 在vim编辑器中,你可以使用以下基本命令来进行文本编辑:
- 非插入模式下的通用指令
- 光标移动
数字 ←↑↓→
or数字 hjkl
:左上下右移动数字
步gg
:跳转到首行开头G
:跳转到末行开头
- 内容操作
x
: 删除光标下的字符dw
: 删除光标所在位置到下一个单词开始的字符ddp
: 将当前行与下一行互换位置dd
: 删除当前行yy
: 复制当前行u
: 撤销上一次的操作
- 光标移动
- 默认模式
- 模式切换
- 进入插入模式(-- INSERT --)
i
: 进入插入模式,在光标前插入文本a
: 进入插入模式,在光标后插入文本o
: 进入插入模式,在当前行下方插入一个新行O
:进入插入模式,在当前行上方插入一个新行
- 进入选择模式(-- VISUAL --):按
v
进入选择模式 :
: 进入命令模式- 回到默认模式:
ESC
- 进入插入模式(-- INSERT --)
- 模式切换
- 选择模式(-- VISUAL --)
y
:复制选中的内容p
: 粘贴剪切板中的内容到当前行之后
- 插入模式(-- INSERT --):正常编辑内容
- 命令模式
- 保存退出
:w
: 保存文件:q
: 退出编辑器:!q
:强行退出:wq
: 保存文件并退出编辑器
- 搜索替换 在 vim 编辑器中可以使用以下命令进行搜索和替换操作:
/:关键词
: 在文件中搜索指定关键词:%s/old/new/g
: 查找并替换所有出现的old
为new
- 保存退出
- 非插入模式下的通用指令
实验目的
练习使用 vim 编辑器进行文本编辑的基本操作
实验内容
- 启动vim编辑器
- 基本编辑命令
- 高级编辑命令
- 模式切换
- 保存退出
- 搜索替换
实验过程
- 启动 vim 编辑器,创建 test.txt
- 进入插入模式,输入 hello vim
- 进入普通模式
- 进入选择模式,复制该行,粘贴该行,重复 3 次
- 进入命令模式,替换所有的 hello 为 hi
- 撤销替换操作
- 进入命令模式,保存并退出
示例代码
vim test.txt
# i
# hello vim
# ESC
# yy
# p
# p
# p
# :%s/Hello/Hi/g
# u
# :wq
在以上示例中,我们首先打开了一个名为 test.txt
的文件,输入 hello vim
后复制了三分,再使用搜索替换命令将所有的 hello
替换为 hi
,再撤销替换操作,最后保存文件并退出编辑器
用户管理
简介
在Linux操作系统中,用户权限管理是非常重要的一项功能。通过用户权限管理,可以控制不同用户对文件和系统资源的访问权限,从而保护系统的安全性。在Linux中,每个用户都被分配了一个唯一的用户ID(UID),每个文件和目录都有所属用户和所属组。用户可以通过权限设置来确定其他用户对自己的文件和目录有哪些操作权限。
实验目的
本实验旨在帮助学习者理解Linux用户权限管理的概念和原理,掌握基本的用户权限设置和管理方法。
实验内容
- 用户的创建和管理方法
- 用户组的创建和管理方法
- 文件权限的查看和修改方法
实验过程
- 创建两个用户 user1、user2、user3
- 创建用户组 group1、group2
- 将 user1 加入 group1,user2 加入 group2
- 查看 group1 和 group2 的成员
- 创建文件 test.txt
- 将文件的读写执行权限改成只有 group1 和 user3 可用
- 切换到 user2,尝试读取 test.txt
- 切换到 user1,尝试读取 test.txt
- 删除用户组 group1、group2
- 删除用户 user1、user2、user3
示例代码
su root
cd /home
mkdir auth-test
# 创建用户
sudo adduser user1
# 输入密码
# 再次输入
# 基础信息配置,一直输入 enter,可以设置为 default
# 会默认为每一个用户在 /home 目录下创建一个专属的文件夹
sudo adduser user2
sudo adduser user3
# 查看用户信息
cat /etc/passwd | grep user
#user1:x:1001:1002:user1-fullname,,,:/home/user1:/bin/bash
#user2:x:1002:1003:,,,:/home/user2:/bin/bash
#users:x:1003:1004:,,,:/home/user3:/bin/bash
# 创建用户组
sudo groupadd group1
sudo groupadd group2
# 查看用户组信息
cat /etc/group | grep group
#group1:x: 1005:
#group2:x: 1006:
# 将用户加入用户组
sudo usermod -a -G group1 user1
sudo usermod -a -G group2 user2
# 查看用户组成员
getent group group1
getent group group2
# 创建文件
cat >> test.txt
test
^D # Control + D:保存并退出
# 修改文件权限
# 将test.txt的权限设置为:
# 所有者具有读、写、执行权限,与所有者同组的用户具有读、执行权限,其他用户没有任何权限。
sudo chmod 750 test.txt # 等效于 sudo chmod g=rx,o= test.txt
# 权限分配
sudo chown user3:group1 test.txt
# 切换用户并尝试读取文件
su user2
cat test.txt
#cat: test.txt: Permission denied
ls -alh
#-rwxr-x--- 1 User3 group1 O Nov 1 12:41 test.txt
# 切换用户并尝试读取文件
su user1
cat test.txt
#test
# 将用户权限修改为 group2
chgrp group2 test.txt
#chgrp: changing group of 'test.txt': Operation not permitted
# 切换至 root
su root
# 将用户权限修改为 group2
chgrp group2 test.txt
# 切换用户并尝试读取文件
su user2
cat test.txt
#test
# 切换至 root
su root
# 删除用户组
groupdel group1
groupdel group2
# 查看用户组信息
cat /etc/group | grep group
#
# 删除用户
deluser user1
# 删除失败,需要先退出
su user1
exit
#强行删除:userdel -rf user1
deluser user2
# 删除失败,需要先退出
su user2
exit
deluser user3
# 删除成功,之前没有用到 user3
# 查看用户信息
cat /etc/passwd | grep user
#
进阶:通过 Shell 实现批处理
知识补充
seq
是用于生成连续数字的命令。它的参数依次为起始值、步长和结束值- 起始值:指定生成数字的起始值
- 步长:指定生成数字之间的间隔
- 结束值:指定生成数字的结束值
- 字符串中设置变量值:
$var
create.sh
批量创建
#!/bin/bash
# 添加30个用户
for i in $(seq 30)
do
username="user$i"
useradd "$username"
done
# 添加3个组
for i in $(seq 3)
do
groupname="group$i"
groupadd "'$groupname"
done
# 将用户添加到对应的组
for i in $(seq 10)
do
echo "user$i"
usermod -a -G group1 "user$i"
done
# seq 是用于生成连续数字的命令。它的参数依次为起始值、步长和结束值。
for i in $(seq 11 1 20)
do
echo "user$i"
usermod -a -G group2 "user$i"
done
for i in $(seq 21 1 30)
do
echo "user$i"
usermod -a -G group3 "user$i"
done
echo "add users and groups successfully"
sh create.sh
delete.sh
批量删除
for i in $(seq 3)
do
groupdel "group$i"
done
for i in $(seq 30)
do
userdel "user$i"
done
sh delete.sh