常用的Linux命令

ssh连接

1
ssh root@106.15.94.49

scp传输文件

1
scp my_file root@106.15.94.49:/root/user/

scp传输目录

1
scp -r -v my_dir root@106.15.94.49:/root/user

查看端口占用情况

list of open file

1
lsof -i:8000

或者

1
netstat -lnput|grep 8000

开启防火墙

1
systemctl start firewalld

查看已经开放的端口号

1
firewall-cmd --list-ports

开放端口号

1
firewall-cmd --zone=public --add-port=8080/tcp --permanent

需要重启防火墙

1
firewall-cmd --reload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
启动: systemctl start firewalld
查看状态: systemctl status firewalld 
停止: systemctl disable firewalld
禁用: systemctl stop firewalld
启动服务:systemctl start firewalld.service
关闭服务:systemctl stop firewalld.service
重启服务:systemctl restart firewalld.service
服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
查看区域信息:  firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic

查找文件并且切换到所在文件目录

1
cd $(find /opt/lampp/ -name " php.ini" | xargs dirname )

xargs 能够捕获一个命令的输出,然后传递给另外一个命令。

之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数

压缩目录

1
tar -cvf file.tar file/

解压目录

1
tar -xvf file.tar

curl

-a/–append 上传文件时,附加到目标文件
-A/–user-agent 设置用户代理发送给服务器
-anyauth 可以使用“任何”身份验证方法
-b/–cookie <name=string/file> cookie字符串或文件读取位置
–basic 使用HTTP基本验证
-B/–use-ascii 使用ASCII /文本传输
-c/–cookie-jar 操作结束后把cookie写入到这个文件中
-C/–continue-at 断点续转
-d/–data HTTP POST方式传送数据
–data-ascii 以ascii的方式post数据
–data-binary 以二进制的方式post数据
–negotiate 使用HTTP身份验证
–digest 使用数字身份验证
–disable-eprt 禁止使用EPRT或LPRT
–disable-epsv 禁止使用EPSV
-D/–dump-header 把header信息写入到该文件中
–egd-file 为随机数据(SSL)设置EGD socket路径
–tcp-nodelay 使用TCP_NODELAY选项
-e/–referer 来源网址
-E/–cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
–cert-type 证书文件类型 (DER/PEM/ENG) (SSL)
–key 私钥文件名 (SSL)
–key-type 私钥文件类型 (DER/PEM/ENG) (SSL)
–pass 私钥密码 (SSL)
–engine 加密引擎使用 (SSL). “–engine list” for list
–cacert CA证书 (SSL)
–capath CA目录 (made using c_rehash) to verify peer against (SSL)
–ciphers SSL密码
–compressed 要求返回是压缩的形势 (using deflate or gzip)
–connect-timeout 设置最大请求时间
–create-dirs 建立本地目录的目录层次结构
–crlf 上传是把LF转变成CRLF
-f/–fail 连接失败时不显示http错误
–ftp-create-dirs 如果远程目录不存在,创建远程目录
–ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
–ftp-pasv 使用 PASV/EPSV 代替端口
–ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
–ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
–ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F/–form <name=content> 模拟http表单提交数据
–form-string <name=string> 模拟http表单提交数据
-g/–globoff 禁用网址序列和范围使用{}和[]
-G/–get 以get的方式来发送数据
-H/–header 自定义头信息传递给服务器
–ignore-content-length 忽略的HTTP头信息的长度
-i/–include 输出时包括protocol头信息
-I/–head 只显示请求头信息
-j/–junk-session-cookies 读取文件进忽略session cookie
–interface 使用指定网络接口/地址
–krb4 使用指定安全级别的krb4
-k/–insecure 允许不使用证书到SSL站点
-K/–config 指定的配置文件读取
-l/–list-only 列出ftp目录下的文件名称
–limit-rate 设置传输速度
–local-port 强制使用本地端口号
-m/–max-time 设置最大传输时间
–max-redirs 设置最大读取的目录数
–max-filesize 设置最大下载的文件总量
-M/–manual 显示全手动
-n/–netrc 从netrc文件中读取用户名和密码
–netrc-optional 使用 .netrc 或者 URL来覆盖-n
–ntlm 使用 HTTP NTLM 身份验证
-N/–no-buffer 禁用缓冲输出
-o/–output 把输出写到该文件中
-O/–remote-name 把输出写到该文件中,保留远程文件的文件名
-p/–proxytunnel 使用HTTP代理
–proxy-anyauth 选择任一代理身份验证方法
–proxy-basic 在代理上使用基本身份验证
–proxy-digest 在代理上使用数字身份验证
–proxy-ntlm 在代理上使用ntlm身份验证
-P/–ftp-port
使用端口地址,而不是使用PASV
-q 作为第一个参数,关闭 .curlrc
-Q/–quote 文件传输前,发送命令到服务器
-r/–range 检索来自HTTP/1.1或FTP服务器字节范围
–range-file 读取(SSL)的随机文件
-R/–remote-time 在本地生成文件时,保留远程文件时间
–retry 传输出现问题时,重试的次数
–retry-delay 传输出现问题时,设置重试间隔时间
–retry-max-time 传输出现问题时,设置最大重试时间
-s/–silent 静默模式。不输出任何东西
-S/–show-error 显示错误
–socks4 <host[:port]> 用socks4代理给定主机和端口
–socks5 <host[:port]> 用socks5代理给定主机和端口
–stderr
-t/–telnet-option <OPT=val> Telnet选项设置
–trace 对指定文件进行debug
–trace-ascii Like –跟踪但没有hex输出
–trace-time 跟踪/详细输出时,添加时间戳
-T/–upload-file 上传文件
–url Spet URL to work with
-u/–user <user[:password]> 设置服务器的用户和密码
-U/–proxy-user <user[:password]> 设置代理用户名和密码
-w/–write-out [format] 什么输出完成后
-x/–proxy <host[:port]> 在给定的端口上使用HTTP代理
-X/–request <command> 指定什么命令
-y/–speed-time 放弃限速所要的时间,默认为30
-Y/–speed-limit 停止传输速度的限制,速度时间
  • -A : 指定User-Agent

    1
    2
    3
    4
    curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

    # 移除`User-Agent
    curl -A '' https://google.com
  • -b : 发送 Cookie

    1
    2
    3
    4
    curl -b "foo=bar" https://google.com
    curl -b "foo1=bar" -b "foo2=baz" https://google.com
    curl -b cookies.txt https://www.google.com
    curl -b name=hyl;age=21 https://httpbin.org/get
  • -c : 将服务器设置的 Cookie 写入一个文件。

  • -i : 获取响应和响应头

  • ```bash
    curl -I https://httpbin.org/get

    –head参数等同于-I。

    curl –head https://www.example.com

    1
    2
    3
    4
    5
    6

    - `-x` : 指定 HTTP 请求的代理。

    ```bash
    # 指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。如果没有指定代理协议,默认为 HTTP。
    curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
  • -X : 请求方法

    1
    2
    curl -X POST www.example.com
    curl -X DELETE www.example.com
  • -v : 显示一次HTTP请求的通信过程 , 用于调试。

    1
    curl -v www.baidu.com
  • –connect-timeout : 连接超时时间

    -m : 数据传输的最大允许时间

    1
    curl -connect-timeout 10 -m 20 “http://outofmemory.cn/”
  • -d : 发送 POST 请求的数据体。

    1
    2
    3
    4
    curl -d 'login=emma&password=123'-X POST https://google.com/login
    curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
    # -d参数可以读取本地文本文件的数据
    curl -d '@data.txt' https://google.com/login
  • --data-urlencode : 等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

    1
    2
    # 发送的数据hello world之间有一个空格,需要进行 URL 编码。
    curl --data-urlencode 'comment=hello world' https://google.com/login
  • -e : 设置 HTTP 的标头Referer,表示请求的来源。

    1
    curl -e 'https://google.com?q=example' https://www.example.com
  • -H : 设置headers , 可以通过直接添加标头Referer,达到同样效果。

    1
    2
    3
    4
    5
    curl -H 'Referer: https://google.com?q=example' https://www.example.com
    curl -H 'Accept-Language: en-US' https://google.com
    curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
    # 添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据
    curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
  • -F : 向服务器上传二进制文件。

    1
    2
    3
    4
    5
    6
    # 给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。(默认 MIME 类型设为application/octet-stream)
    curl -F 'file=@photo.png' https://google.com/profile
    # 指定 MIME 类型。
    curl -F 'file=@photo.png;type=image/png' https://google.com/profile
    # 指定文件名。
    curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
  • -G : 构造 URL 的查询字符串。

    1
    2
    3
    4
    5
    # 实际请求的 URL 为https://google.com/search?q=kitties&count=20
    # 如果省略-G,会发出一个 POST 请求。
    curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
    # 如果数据需要 URL 编码,可以结合--data--urlencode参数。
    curl -G --data-urlencode 'comment=hello world' https://www.example.com
  • -k : 跳过 SSL 检测。不会检查服务器的 SSL 证书是否正确。

    1
    curl -k https://www.example.com
  • -L : 跟随重定向

    1
    curl -L -d 'tweet=hi' https://api.twitter.com/tweet
  • --limit-rate : 限制 HTTP 请求和回应的带宽,模拟慢网速的环境。

    1
    2
    # 将带宽限制在每秒 200K 字节。
    curl --limit-rate 200k https://google.com
  • -o : 将服务器的回应保存成文件,等同于wget命令。

    1
    2
    # 将www.example.com保存成example.html。
    curl -o example.html https://www.example.com
  • -O : 将服务器回应保存成文件,并将 URL 的最后部分当作文件名

    1
    2
    # 将服务器回应保存成文件,文件名为bar.html。
    curl -O https://www.example.com/foo/bar.html
  • -s : 不输出错误和进度信息。

    1
    2
    3
    4
    5
    # 一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。
    curl -s https://www.example.com

    # 如果想让 curl 不产生任何输出,可以使用下面的命令。
    curl -s -o /dev/null https://google.com
  • -S : 只输出错误信息

    1
    2
    # 命令没有任何输出,除非发生错误。
    curl -s -o /dev/null https://google.com
  • -u : 设置服务器认证的用户名和密码。

    1
    2
    # 设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
    curl -u 'bob:12345' https://google.com/login

常用:

  1. -A : 指定User-Agent
  2. -b : 发送 Cookie
  3. -i : 获取响应和响应头
  4. -X : 请求方法
  5. -v : 显示一次HTTP请求的通信过程 , 用于调试。
  6. -d : 发送 POST 请求的数据体。
  7. -G : 构造 URL 的查询字符串。
  8. --data-urlencode : 等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。
  9. -e : 设置 HTTP 的标头Referer,表示请求的来源。
  10. -H : 设置headers , 可以通过直接添加标头Referer,达到同样效果。
  11. -F : 向服务器上传二进制文件。
  12. -L : 跟随重定向
  13. -o : 将服务器的回应保存成文件,等同于wget命令。
1
2
3
4
5
6
7
8
9
10
11
12
13
curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com
curl -b name=hyl;age=21 https://httpbin.org/get
curl -i https://httpbin.org/get
curl -X POST www.example.com
curl -v www.baidu.com
curl -d 'login=emma&password=123'-X POST https://google.com/login
curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
curl -G --data-urlencode 'comment=hello world' https://www.example.com
curl -e 'https://google.com?q=example' https://www.example.com
curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
curl -F 'file=@photo.png;type=image/png;filename=me.png' https://google.com/profile
curl -L -d 'tweet=hi' https://api.twitter.com/tweet
curl -o example.html https://www.example.com

实际上 , -o参数比较少用 , 都是使用> , 他们效果是一样的

1
2
curl -o hyl.html http://106.15.94.49/download/
curl http://106.15.94.49/download/ > hyl.html

wget

wget是一个使用HTTP,HTTPS,FTP和FTPS协议来下载文件的免费软件。

它是一个非交互式工具,因此它可以很轻松地通过脚本、cron和终端来调用。

  • 下载单个文件 wget http://www.baidu.com/index.html
  • 使用wget -O下载并以不同的文件名保存 wget -O 1.txt http://www.baidu.com/index.html
  • 使用wget –limit -rate限速下载 wget –limit-rate=300k http://www.baidu.com/index.html
  • 使用wget -c断点续传,重新启动下载中断的文件 , 需要继续中断的下载时可以使用-c参数 wget -c http://www.baidu.com/index.html
  • 使用wget -b后台下载 , 对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载 wget -b http://www.baidu.com/index.html
  • 你可以使用以下命令来察看下载进度 tail -f wget-log
  • 使用 wget –reject 过滤指定格式下载 , 你想下载一个网站,但你不希望下载图片,你可以使用以下命令。wget –reject=gif http://www.baidu.com

sort

排序

  • -n:使用数字排序(非 字符排序)。避免2比10大的情况
  • -t -k:使用第几列进行排序,-t自定分隔符,-k指定第几列
  • -r:reverse,逆序
  • -f:忽略大小写
  • -u:去除重复行
1
curl localhost:9200/_cat/indices | grep project_s | sort -n -k 2 -t " "

crontab

添加任务

通过crontab -e命令编辑crontab任务,增加内容如下:

1
*/30 * * * * /home/pi/shared/bash/timing_camera.sh

查看任务

添加后,可以使用 crontab -l查看.

增加了crontab任务后,在/var/spool/cron目录下会有一个当前登录账号命名的文件。比如我的登录账号是root。则会存在一个root文件。该文件的内容就是刚添加的crontab任务。

1
cat /var/spool/cron/root

删除任务

如果想删除任务,就可以直接编辑/var/spool/cron/root的文件.比如直接删除那一行

也使用sed命令来处理/var/spool/cron/root 文件,将含timing.sh的行的内容删除掉。

1
sed -i '/home/pi/shared/raspi_camera/bash/timing.sh/d' /var/spool/cron/root 

启动cron

1
sudo systemctl start crond

inotifywait

由于每次前端同学的vue项目push到git后,都需要私下告诉我,然后我更新代码并重新构建,嫌麻烦,但由于本地环境的ip非公网ip,webhook不可达,所以只能使用crontab定时拉取代码,再配合inotifywait监听文件变化,自动build构建代码,遂写此文记录下inotifywait的安装和基本使用,以便后续查阅。

Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。

inotify-tools 是一个C库和一组命令行的工作,提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywaitinotifywatch这两条命令:

  • inotifywait命令 可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify
  • inotifywatch命令 用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

检测系统内核是否支持inotify

  • 方式一:使用 uname -r 命令检查Linux内核,如果低于2.6.13,就需要重新编译内核加入inotify的支持。
  • 方式二:使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。
1
2
3
4
5
6
$ ll /proc/sys/fs/inotify

total 0
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_queued_events
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_instances
-rw-r--r-- 1 root root 0 Jan 4 15:41 max_user_watches

安装

可直接使用Linux系统自带的包管理工具进行安装,也可以手动从源码编译安装。

包管理工具进行安装

以centos系统自带等yum为例

其他Linux发行版安装方法可以参见:https://github.com/rvoicilas/inotify-tools/wiki#wiki-getting

1
2
3
$ yum search inotify-tools
$ yum info inotify-tools
$ sudo yum install inotify-tools

源码编译安装

1
2
3
4
$ wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
$ tar zxf inotify-tools-3.14.tar.gz
$ cd inotify-tools-3.14/
$ ./configure && make && make install

如果遇到以下错误

1
inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory

解决方法:

1
2
32位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib/libinotifytools.so.0
64位系统:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

inotifywait 基本使用

安装完成后可简单尝试下,执行以下命令监听log.txt文件

1
2
3
4
5
6
$ inotifywait -m log.txt
# 这里 -m 参数指明持续监听,不加的话会在一个事件后退出

Setting up watches.
Watches established.
# 此时持续监听,有事件出发会输出到屏幕

然后通过其他窗口执行以下命令向log.txt文件写入内容

1
$ echo >> log.txt

可观察到上一个屏幕输出了,因为监听到了文件打开、修改、关闭的事件。

1
2
3
log.txt OPEN
log.txt MODIFY
log.txt CLOSE_WRITE,CLOSE

参数说明

常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--timefmt 时间格式
%y年 %m月 %d日 %H小时 %M分钟
--format 输出格式
%T时间 %w路径 %f文件名 %e状态

-m 始终保持监听状态,默认触发事件即退出
-r 递归查询目录
-q 减少不必要的输出(只打印事件信息)

-e 定义监控的事件,可用参数:
open 打开文件
access 访问文件
modify 修改文件
delete 删除文件
create 新建文件
attrib 属性变更

--exclude <pattern> 指定要排除监控的文件/目录

全部参数

建议通过 man inotifywait 命令查看文档中全部参数

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
-h,–help
输出帮助信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon
跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile
输出事情到一个文件而不是标准输出。
-s, –syslog
输出错误信息到系统日志
-r, –recursive
监视一个目录下的所有子目录。
-q, –quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-t , –timeout
设置超时时间,如果为0,则无限期地执行下去。
-e , –event
指定监视的事件。
-c, –csv
输出csv格式。
–timefmt
指定时间格式,用于–format选项中的%T格式。
–format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

可监听事件

  • access 访问,读取文件。
  • modify 修改,文件内容被修改。
  • attrib 属性,文件元数据被修改。
  • move 移动,对文件进行移动操作。
  • create 创建,生成新文件
  • open 打开,对文件进行打开操作。
  • close 关闭,对文件进行关闭操作。
  • delete 删除,文件被删除。

使用示例

以监听vue项目,发现有文件变化后,执行 npm run build 命令构建代码为例

假设vue项目文件目录为: /production/sites/vue-program

根据vue项目基本目录结构,则我们需要监听该目录下的src目录,且只监听文件变化的事件

1
2
3
4
5
6
inotifywait /production/sites/vue-program/src #只监听src目录,因为package.json等文件在构建完成后也会被修改
-r #监听所有子目录文件
--timefmt '%d/%m/%y %H:%M' #时间输出格式,如果--format设置了%f,则必须指明
--format "%T %f" #输出格式
-e MODIFY #只监听文件修改事件
--exclude '^.*.swp$' #如果直接使用vim等编辑工具改动文件,会触发 .swp 临时文件的修改事件,所以我们需要排除所有正则形如 /^\.((?!\.swp$).)*$/ 的文件,但此表达式在linux中貌似不行,所以用的.*.swp

以上为了方便阅读,对每个参数换行并加了注释,整理为一行如下:

1
inotifywait /production/sites/vue-program/src -r --timefmt '%d/%m/%y %H:%M' --format "%T %f" -e MODIFY --exclude '^.*.swp$'

运行可以观察是我们想要的效果,那我们监听到事件后加入构建代码到指令,创建shell文件 auto_build.sh

1
2
3
4
5
6
7
8
#!/bin/bash

projectDir=/production/sites/vue-program;

while inotifywait $projectDir/src -r --timefmt '%d/%m/%y %H:%M' --format "%T %f" -e MODIFY --exclude '^.*.swp$'
do
cd $projectDir && git pull && npm run build
done

此处由于 -m 参数会监听多个文件,所以git一次提交可能会触发多个修改事件,因此没有使用 -m ,而是通过while去触发inotifywait监听,然后等待在这里;而事件触发后再执行一遍 git pull是因为第一个文件修改事件触发后,git未必将所有文件替换完,为保证npm run build指令执行时代码全部更新,所以在此处又主动执行了一遍 git pull

之后就可以启动脚本了

1
nohup /bin/bash auto_build.sh >> /tmp/auto_build.log 2>&1 

这样,配合crontab定时拉取代码,当前端代码文件变化后,就会自动构建了,省去了每次手动操作的繁琐和遗漏。

示例二:

1
/usr/bin/inotifywait -m -o log.txt --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib var
1
nohup sh inotifywait.sh > /dev/null 2>&1

rsync

https://www.cnblogs.com/george-guo/p/7718515.html

简介

  • Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快
  • Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具

原理

  • Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配置文件;Rsync可以通过rsh或ssh使用,也能以daemon模式去运行
  • 在以daemon方式运行时Rsync server会打开一个873 端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份

特点

  1. 可以镜像保存整个目录树和文件系统;
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;
  3. 无须特殊权限即可安装;
  4. 优化的流程,文件传输效率高;
  5. 可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
  6. 支持匿名传输

参数

  • -r表示递归,即包含子目录。注意,-r是必须的,否则 rsync 运行不会成功。
  • -a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以-a-r更有用。
  • 如果不确定 rsync 执行后会产生什么结果,可以先用-n--dry-run参数模拟执行的结果。
  • --delete 参数:默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件。
  • --exclude 参数:同步时排除某些文件或目录
  • --exclude-from参数:如果排除模式很多,可以将它们写入一个文件,每个模式一行
  • --include参数用来指定必须同步的文件模式,往往与--exclude结合使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rsync -r source destination
rsync -r source1 source2 destination # source1、source2都会被同步到destination目录。

rsync -a source destination # 目标目录destination如果不存在,rsync 会自动创建。

rsync -anv source/ destination # -n参数模拟命令执行的结果,并不真的执行命令。-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。

rsync -av --delete source/ destination # --delete参数会使得destination成为source的一个镜像。

rsync -av --exclude='*.txt' source/ destination # 除了所有 TXT 文件。
rsync -av --exclude 'dir1/*' source/ destination # 排除某个目录里面的所有文件,但不希望排除目录本身
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination # 多个排除模式

rsync -av --exclude-from='exclude-file.txt' source/ destination

rsync -av --include="*.txt" --exclude='*' source/ destination # 指定同步时,排除所有文件,但是会包括 TXT 文件
  • -a--archive参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。
  • --append参数指定文件接着上次中断的地方,继续传输。
  • --append-verify参数跟--append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。
  • -b--backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix参数指定的文件后缀名,默认是~
  • --backup-dir参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups
  • --bwlimit参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
  • -c--checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。
  • --delete参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。
  • -e参数指定使用 SSH 协议传输数据。
  • --exclude参数指定排除不进行同步的文件,比如--exclude="*.iso"
  • --exclude-from参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。
  • --existing--ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。
  • -h参数表示以人类可读的格式输出。
  • -h--help参数返回帮助信息。
  • -i参数表示输出源目录与目标目录之间文件差异的详细情况。
  • --ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。
  • --include参数指定同步时要包括的文件,一般与--exclude结合使用。
  • --link-dest参数指定增量备份的基准目录。
  • -m参数指定不同步空目录。
  • --max-size参数设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k')。
  • --min-size参数设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k)。
  • -n参数或--dry-run参数模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去。
  • -P参数是--progress--partial这两个参数的结合。
  • --partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append--append-verify配合使用。
  • --partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append--append-verify配合使用。
  • --progress参数表示显示进展。
  • -r参数表示递归,即包含子目录。
  • --remove-source-files参数表示传输成功后,删除发送方的文件。
  • --size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。
  • --suffix参数指定文件名备份时,对文件名添加的后缀,默认是~
  • -u--update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。
  • -v参数表示输出细节。-vv表示输出更详细的信息,-vvv表示输出最详细的信息。
  • --version参数返回 rsync 的版本。
  • -z参数指定同步时压缩数据。

ssh模式

本地间同步

环境: 172.16.22.12

1
2
3
4
5
6
mkdir src
touch src/{1,2,3,4}
mkdir dest
rsync -av src/ dest/ # 将 src 目录里的所有的文件同步至 dest 目录(不包含src本身)
rsync -av src dest/ # 将 src 目录包括自己整个同步至 dest 目录
rsync -avR src/ dest/ # 即使 src 后面接有 / ,效果同上

局域网间同步

1
2
rsync -av source/ username@remote_host:destination
rsync -av username@remote_host:source/ destination

环境: 172.16.22.11

1
2
3
4
5
6
7
8
mkdir src
touch src/{a,b,c,d}
mkdir dest
rsync -av 172.16.22.12:/data/test/src/ dest/ # 远程同步至本地,需输入root密码
rsync -av src/ 172.16.22.12:/data/test/dest/ # 本地文件同步至远程
rsync -av src 172.16.22.12:/data/test/dest/ # 整个目录同步过去
rm -rf src/d # 删除一个文件 d
rsync -av --delete src/ 172.16.22.12:/data/test/dest/ # delete,从目标目录里面删除无关的文件

局域网指定用户同步

1
2
3
4
5
6
7
8
9
# --172.16.22.12
useradd george
passwd george
mkdir /home/george/test
touch /home/george/test/g{1,2,3,4}

# --172.16.22.11
rsync -av src '-e ssh -l george' 172.16.22.12:/home/george # 本地同步至远程
rsync -av 172.16.22.12:/home/george/test/g* '-e ssh -l george -p 22' dest/

daemon模式

环境:192.168.22.11

服务启动方式

对于负荷较重的 rsync 服务器应该使用独立运行方式

1
2
yum install rsync xinetd # 服务安装
/usr/bin/rsync --daemon

对于负荷较轻的 rsync 服务器可以使用 xinetd 运行方式

1
2
3
4
5
6
yum install rsync xinetd  # 服务安装
vim /etc/xinetd.d/rsync # 配置托管服务,将下项改为 no
disable = no
/etc/init.d/xinetd start # 启动托管服务 xinetd
chkconfig rsync on
netstat -ntpl | grep 873 # 查看服务是否启动

rsync 协议

除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::

1
$ rsync -av source/ 192.168.122.32::module/destination

注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。

如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令。

1
$ rsync rsync://192.168.122.32

rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。

1
$ rsync -av source/ rsync://192.168.122.32/module/destination

ifconfig查看当前IP

1
ifconfig | grep "inet " | grep -v 127.0.0.1