Linux的文件管理

1、文件类型

复制代码
-    新建、删除(touch、rm)   查看(cat、head、tail、less,grep,sed,awk)   编辑(vim,echo >,>>)
d    新建、删除(mkdir  -p,rm -r)   查看(ls -l,-d,-a,-h)   编辑
​
l:软链接,符号链接   新建、删除(ln -s)
​
硬链接:不是文件类型
b
c
s
p
复制代码
cd
pwd

2、文件权限

用户操作文件的时候,要先看用户属于文件的哪一类人【文件的所属者、文件的所属组、其他人】

普通权限:

r

w

x

复制代码
目录文件某一类用户可以拥有的权限:
    没有权限:---,0
    只读:r-x,5
    读写:rwx,7
普通文件对应的权限:
    没有权限:---,0
    只读:r--,4
    读写:rw-,6
    执行:r-x,5
    读写执行:rwx,7

特殊权限:

suid:给命令的程序文件u+s权限,任何人执行命令的时候,该进程的所属者是程序文件的所属者,rwsrwxrwx,4777

sgid:给目录g+s权限,任何人在该目录下创建的文件的所属组是该目录的所属组,rwxrwsrwx,2777

sticky:给目录o+t权限,任何普通用户不能删除别人的文件,只能删除自己的文件,rwxrwxrrwt,1777

扩展权限:

facl

setfacl

getfacl

3、文件输入、文件输出

3.1 输入输出类型

标准输入:有些命令需要从键盘上接收输入,例如cat;<重定向让命令接收文件内容作为输入,<<指定输入结束符

标准输出:是命令执行成功后的输出,>,>>重定向到/dir/path_file

标准错误输出:是命令执行失败后的输出,2>重定向到/dev/null

3.2 对普通文件的输入和输出

echo

重定向、追加重定向:>,>>

输入重定向:<,<<

vim:

编辑模式:跳转光标,复制,粘贴

插入模式:i,a

末行模式:保存文件

cat

head

tail

less

4、文件的压缩与解压缩

文件压缩/打包扩展名 压缩/打包 解压缩/解包
.zip zip unzip
.gz gzip gunzip
.bz2 bzip2 bunzip2
.xz xz unxz
.tar.gz tar -czvf tar -xvf
.tar.bz2 tar -cjvf tar -xvf
.tar.xz tar -cJvf tar -xvf

5、文件的传输

5.1 cp,mv

5.2 scp

复制代码
#从rhel93传输文件到rhel79
[root@rhel93 ~]# scp  test.sh   root@192.168.168.198:/root
#从rhel93下载文件到rhel79
[root@rhel79 ~]# scp  root@192.168.168.197:/test/haha  .

配置ssh免密登录:

复制代码
#配置rhel93免密登录rhel79
[root@rhel93 ~]# ssh-keygen  -f  /root/.ssh/id_rsa -N ""
[root@rhel93 ~]# ssh-copy-id  root@rhel79

5.3 rsync

5.3.1 rsync 概念

rsync(remote sync)是linux系统下的数据镜像备份工具。是一个可实现全量及增量的本地或远程数据镜像备份的优秀工具。

rsync的增量同步是只同步发生变化的数据,因此数据传输效率很高,rsync有三大传输方式:

1、主机本地间的数据传输(类似于cp)

2、借助ssh等通道来传输数据(类似于scp)

3、以守护进程(socket)的方式传送数据

rsync的常用选项:

复制代码
1、支持拷贝特殊文件如链接、设备等;【-l 保持软连接;-H 保留源文件的硬链接文件;-r 递归模式,包含目录及子目录;-D 保留设备文件和一些特殊文件】
2、可以排除指定文件或目录同步的功能,相当于打包命令tar的排除功能【--exclude=PATTERN 指定排除不需要传输的文件】
3、可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变;【-a 归档模式,表示以递归方式传输时,保持所有文件属性】
4、可以使用rcp、rsh、ssh等方式来配合传输文件;
5、可以通过socket(进程方式)传输文件和数据;
6、可支持匿名的或认证(无需系统用户)的进程模式传输,可方便安全的进行数据备份及镜像。

5.3.2 本地传输模式

命令语法:rsync [OPTION...] SRC... [DEST]

(1)把系统的host文件同步到/opt目录

复制代码
[root@rhel93 ~]# rsync /etc/hosts  /opt
[root@rhel93 ~]# ll  /opt/
总用量 4
-rw-r--r--. 1 root root 158  8月 27 16:39 hosts
#增量内容使用rsync进行传输
[root@rhel93 ~]# echo "192.168.168.197 rhel93">> /etc/hosts
[root@rhel93 ~]# rsync /etc/hosts  /opt

(2)把opt目录拷贝到/mnt目录

复制代码
[root@rhel93 ~]# mkdir -p  /opt/test1/test11/
[root@rhel93 ~]# echo test111 >> /opt/test1/test11/file
#当opt后面写了/时,表示传输该目录下的文件
[root@rhel93 ~]# rsync -avz /opt/ /mnt
sending incremental file list
./
hosts
test1/
test1/test11/
test1/test11/file
​
sent 360 bytes  received 69 bytes  858.00 bytes/sec
total size is 189  speedup is 0.44
[root@rhel93 ~]# tree /mnt
/mnt
├── hosts
└── test1
    └── test11
        └── file
######以下为说明######
说明:-a,归档模式,表示以递归方式传输文件,并保持文件所有属性
-v,详细模式输出
-z,对备份的文件在传输时先压缩
######说明结束######
​
#当要传输的opt目录后面没有写/时,表示传输该目录
[root@rhel93 ~]# rsync  -avz /opt   /mnt
[root@rhel93 ~]# tree  /mnt
/mnt
├── hosts
├── opt
│   ├── hosts
│   └── test1
│       └── test11
│           └── file
└── test1
    └── test11
        └── file
​

5.3.3 远程shell进行数据传输

命令语法:

复制代码
Access via remote shell:
​
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

(1)将本地文件推送到远程主机

复制代码
[root@rhel93 ~]# rsync -avz /etc/hosts  root@192.168.168.198:/root
The authenticity of host '192.168.168.198 (192.168.168.198)' can't be established.
ED25519 key fingerprint is SHA256:GVgC0haib/uMP+FIfkoDLj7/7TUfhlCgL9LN1C6eS8k.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
root@192.168.168.198's password:
​
#查看目标主机上是否已收到文件
[root@rhel93 ~]# ssh  root@192.168.168.198
root@192.168.168.198's password:
[root@rhel79 ~]# ll /root/hosts
-rw-r--r--. 1 root root 181 8月  27 16:40 /root/hosts
​

rsync -avz /etc/hosts root@192.168.168.198:/root该命令等同于使用以下命令:

rsync -avz -e "ssh -p 22" /etc/hosts root@192.168.168.198:/root

(2)将远程主机的文件下载到本地

复制代码
#192.168.168.198 主机上新建文件
[root@rhel79 ~]# echo "192.168.168.198 rhel79" >> /root/rhel79
[root@rhel93 ~]# rsync -avz  root@192.168.168.198:/root/rhel79  /root
root@192.168.168.198's password:
[root@rhel93 ~]# cat /root/rhel79
192.168.168.198 rhel79

rsync -avz root@192.168.168.198:/root/rhel79 /root该命令等同于使用以下命令:

rsync -avz -e "ssh -p 22" root@192.168.168.198:/root/rhel79 /root

5.3.4 使用守护进程的方式传输数据

命令语法:

复制代码
Access via rsync daemon:
​
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
​
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

安装软件包,并配置服务:

复制代码
[root@rhel93 yum.repos.d]# yum install rsync-daemon -y
[root@rhel93 ~]# vim   /etc/rsyncd.conf
uid = rsync  #指定传输文件所使用的用户,默认都是nobody
gid = rsync  #指定传输文件所使用的组,默认都是nobody
use chroot = no
max connections = 20
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[data]
comment = It's my test data!
path = /rsync_data
ignore errors
read only = false
list = false
hosts allow = 192.168.168.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup  #rsync认证的账号
secrets file = /etc/rsyncd.passwd
​
#创建共享文件目录并修改权限
[root@rhel93 ~]# mkdir -p /rsync_data
[root@rhel93 ~]# useradd rsync -s /sbin/nologin -M
[root@rhel93 ~]# chown rsync:rsync /rsync_data
#配置用于rsync同步的密码文件
[root@rhel93 ~]# echo "rsync_backup:123456" > /etc/rsyncd.passwd
[root@rhel93 ~]# chmod 600 /etc/rsyncd.passwd
#关闭防火墙和selinux
[root@rhel93 ~]# systemctl disable  --now firewalld
[root@rhel93 ~]# setenforce  0
[root@rhel93 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/'  /etc/selinux/config
​
[root@rhel93 ~]# systemctl start rsyncd
[root@rhel93 ~]# ss -lntup  | grep sync
tcp   LISTEN 0      5            0.0.0.0:873       0.0.0.0:*    users:(("rsync",pid=24324,fd=5))
tcp   LISTEN 0      5               [::]:873          [::]:*    users:(("rsync",pid=24324,fd=6))
​

客户端访问:

复制代码
[root@rhel79 ~]# rsync  -avz /root/file  rsync_backup@192.168.168.197::data
Password:
#服务端可查看到文件已经成功上传
[root@rhel93 ~]# ll /rsync_data/
总用量 4
-rw-r--r--. 1 rsync rsync 15  8月 27 17:37 file
​

客户端配置rsync账号密码文件:

复制代码
[root@rhel79 ~]# echo 123456 > /etc/rsync.passwd
[root@rhel79 ~]# chmod 600 /etc/rsync.passwd
[root@rhel79 ~]# echo "test password" >> /root/file
[root@rhel79 ~]# rsync  -avz /root/file  rsync_backup@192.168.168.197::data  --password-file=/etc/rsync.passwd
​
#在服务端进行验证
[root@rhel93 ~]# cat /rsync_data/file
this is rsyncd
test password

排除某个文件进行同步上传:

复制代码
#新建一个测试目录,注意不要在用户家目录下同步
[root@rhel79 ~]# mkdir /test
[root@rhel79 ~]# cd  /test
[root@rhel79 ~]# touch  anaconda-ks.cfg hosts .test
[root@rhel79 test]# rsync  -azv ./ --exclude={anaconda-ks.cfg,hosts,.*} rsync_backup@192.168.168.197::data  --password-file=/etc/rsync.passwd
​
#也可以将要排除的文件写在某个文件中
[root@rhel79 test]# cat exclude
anaconda-ks.cfg
.*
[root@rhel79 test]# rsync  -azv ./ --exclude-from=exclude rsync_backup@192.168.168.197::data  --password-file=/etc/rsync.passwd
​

服务端做配置排除某些文件:

复制代码
[root@rhel93 rsync_data]# grep exclude /etc/rsyncd.conf
# exclude = lost+found/
exclude = haha dir1
[root@rhel93 rsync_data]# systemctl restart rsyncd
#客户端进行测试
[root@rhel79 test]# echo haha > haha
[root@rhel79 test]# mkdir dir1
[root@rhel79 test]# echo dir1_file >> dir1/file
[root@rhel79 test]# echo  server_exclude >> server_exclude.test
[root@rhel79 test]# rsync  -azv ./ rsync_backup@192.168.168.197::data  --password-file=/etc/rsync.passwd
sending incremental file list
ERROR: daemon refused to receive file "haha"
./
server_exclude.test
ERROR: daemon refused to receive directory "dir1"
*** Skipping any contents from this failed directory ***

5.3.5 定期同步文件

与传统的cp、scp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以满足对实时性要求不高的数据备份需求,例如使用crontab定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异。此时可以利用内核中的 inotify 监控指定目录,当目录中的文件或数据发生变化时,立即调用 rsync 服务将数据推送到远程主机上。

linux内核从2.6.13起,加入了Inotify支持。 Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,inotify-tools就是这样的一个第三方软件。

安装软件并简单使用:

复制代码
#确认内核支持
[root@rhel93 ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0  8月 27 18:03 max_queued_events
-rw-r--r--. 1 root root 0  8月 27 18:03 max_user_instances
-rw-r--r--. 1 root root 0  8月 27 18:03 max_user_watches
#inotify-tools工具由epel仓库提供
[root@rhel93 ~]# cat  /etc/yum.repos.d/epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/9/Everything/x86_64/
gpgcheck=0
[root@rhel93 ~]# yum install -y inotify-tools

inotify-tools指令: inotifywait 用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录。 inotifywatch 用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

复制代码
Inotifywait是一个监控等待事件,可以配合shell脚本使用,常用的一些参数:
-m, 即--monitor,表示始终保持事件监听状态
-r, 即--recursive,表示递归查询目录
-q, 即--quiet,表示打印出监控事件
--timefmt 指定日期显示格式
--format 指定输出信息格式
    %w 显示被监控文件的路径
    %f 显示具体发生改变的文件的文件名
    %e 发生的事件类型
-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等

inotify-tools工具使用方式:

复制代码
#监控目录/inotify-files/
[root@rhel93 ~]# inotifywait -mrq -e modify,delete,create,attrib /inotify-files/
​
#另开一个终端在/inotify-files/下创建文件
[root@rhel93 ~]# cd /inotify-files/
[root@rhel93 inotify-files]# echo file > file
[root@rhel93 inotify-files]# mkdir mulu1
#监控输出如下:
[root@rhel93 ~]# inotifywait -mrq -e modify,delete,create,attrib /inotify-files/
/inotify-files/ CREATE file
/inotify-files/ MODIFY file
/inotify-files/ CREATE,ISDIR mulu1
​
​
#监控时加上时间信息
[root@rhel93 ~]# inotifywait -mrq  --timefmt '%y/%m/%d %H:%M' --format '%T %e %w%f'  -e modify,delete,create,attrib /inotify-files/
#再开一个终端进行文件调整
[root@rhel93 inotify-files]# echo test2 >> mulu1/test2
​
#监控信息如下:
[root@rhel93 ~]# inotifywait -mrq  --timefmt '%y/%m/%d %H:%M' --format '%T %e %w%f'  -e modify,delete,create,attrib /inotify-files/
25/08/27 18:14 CREATE /inotify-files/mulu1/test2
25/08/27 18:14 MODIFY /inotify-files/mulu1/test2

配置数据自动同步至rsync服务端:

inotify-rsync服务器:192.168.168.197

inotify-rsync客户端:192.168.168.198

在服务端配置hosts自解析和ssh免密认证:

复制代码
[root@rhel93 ~]# tail -1 /etc/hosts
192.168.168.198 rhel79
[root@rhel93 ~]# ssh-keygen  -f /root/.ssh/id_rsa -N ""
[root@rhel93 ~]# ssh-copy-id root@rhel79
[root@rhel93 ~]# yum install rsync inotify-tools -y
[root@rhel93 ~]# mkdir  /inotify_server_data/
[root@rhel93 ~]# cat /usr/local/bin/inotify_rsync.sh
#!/bin/bash
#注意src后面的目录文件一定要写结尾的/
src=/inotify_server_data/
dst=/inotify_client_data
inotifywait -mrq -e modify,delete,create,attrib $src | while read file
do
        #-X 保留扩展属性,包括selinux上下文
        #-A 保留访问控制列表
        #--delete删除目标端(destination)存在而源端(source)不存在的文件
        rsync -avzXA --delete $src  root@rhel79:$dst
done
[root@rhel93 ~]# chmod +x /usr/local/bin/inotify_rsync.sh
[root@rhel93 ~]# cat /usr/lib/systemd/system/inotify-rsync.service
[Unit]
Description=inotify-rsync service
​
[Service]
Type=simple
ExecStart=/usr/local/bin/inotify_rsync.sh
WorkingDirectory=/inotify_server_data/
Restart=on-failure
​
[Install]
WantedBy=default.target
[root@rhel93 ~]# systemctl daemon-reload
[root@rhel93 ~]# systemctl start inotify-rsync.service

测试:

复制代码
#服务端创建文件
[root@rhel93 inotify_server_data]# echo "this is inotify rsync" > file
#客户端查看是否自动同步
[root@rhel79 ~]# cat /inotify_client_data/file
this is inotify rsync
相关推荐
xlq223221 小时前
高并发服务器day13
运维·服务器
Android系统攻城狮1 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(四十二)
linux·运维·服务器·音频进阶·pipewire音频进阶
Ivan CloudBay1 小时前
CDN 能完全隐藏源服务器 IP 吗?
运维·服务器·tcp/ip
蜉蝣fuyou1 小时前
VMware多版本安装包
linux·vmware·虚拟机
不会代码的小猴1 小时前
Linux note2
linux·笔记
AAA@峥1 小时前
OpenStack Keystone 认证服务完整学习指南
服务器·云计算·openstack
雾里0不看花2 小时前
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
linux·网络·tcpdump
沉迷学习 日益消瘦2 小时前
13-Ingress 生产实战
运维·kubernetes
Dawn-bit3 小时前
Linux日志处理三剑客之基础篇:(基础正则+扩展正则)
linux·运维·服务器·正则表达式·云计算·运维开发