站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#41
Linux 系统 / Rsync参数说明及使用文档
上次发布者 jvip_chen - 2022-5月-25 01:55 下午
一. 参数说明
①.daemon(服务端)模式:
用途: rsync --daemon [选项]...

选项
 --address=ADDRESS 绑定到指定的地址
 --bwlimit=RATE 限制套接字I/O带宽
 --config=FILE 不使用默认位置的rsyncd.conf文件,额外指定
 -M, --dparam=OVERRIDE 覆盖全局守护进程配置参数
 --no-detach 不要进行fork并后台运行
 --port=PORT 监听指定的端口
 --log-file=FILE 输出日志到指定文件
 --log-file-format=FMT 用指定格式更新日志
 --sockopts=OPTIONS 指定自定义的TCP选项
 -v, --verbose 详细模式输出
 -4, --ipv4 偏向于使用IPv4
 -6, --ipv6 偏向于使用IPv6
 --help 显示帮助信息
②.普通(客户端)模式:
用途: rsync [OPTION]... SRC [SRC]... DEST
通过远程shell访问方式:
rsync [选项]... [用户名@]HOST:SRC [DEST]
rsync [选项]... SRC [SRC]... [用户名@]HOST:DEST
通过rsync daemon访问方式:
rsync [选项]... [用户名@]HOST::SRC [DEST]
rsync [选项]... SRC [SRC]... [用户名@]HOST::DEST
rsync [选项]... SRC [SRC]... rsync://[用户名@]HOST[:PORT]/DEST
rsync [选项]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

请注意,':'会使用ssh来远程连接,而'::'以及'rsync://'则用于以tcp方式连接一个rsync daemon服务器,这个需要SRC(源),以及包含模块名字的DEST(目的)

选项
 -v, --verbose 详细模式输出
 --info=FLAGS 输出INFO级别
 --debug=FLAGS 输出DEBUG级别
 --msgs2stderr 用于调试的特殊输出处理
 -q, --quiet 忽略非error的输出
 --no-motd 忽略Daemon模式的MOTD
 -c, --checksum 让自动跳过基于校验和而非默认的修改时间以及文件大小
 -a, --archive 归档(压缩)模式,表示以递归方式传输文件,并保持所有文件属性等同于-rlptgoD(无 -H,-A,-X)
 --no-OPTION 关闭隐含的选项(例如 --no-D)
 -r, --recursive 对子目录以递归模式处理
 -R, --relative 使用相对路径信息
 --no-implied-dirs 不使用--relative发送隐含的目录
 -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename.可以使用--suffix选项来指定不同的备份文件前缀
 --backup-dir=DIR 将备份文件(如~filename)存放在指定目录下
 --suffix=SUFFIX 定义备份文件前缀,默认是~
 -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件(不覆盖更新的文件)
 --inplace update destination files in-place (SEE MAN PAGE)
 --append 将数据附加到较短的文件
 --append-verify 类似--append,但是对旧数据会计算校验和
 -d, --dirs 不使用递归传输目录
 -l, --links 不处理符号链接(保留符号链接)
 -L, --copy-links 将符号链接处理为具体的文件或者文件夹
 --copy-unsafe-links 只处理不安全的符号链接
 --safe-links 忽略不在SRC源目录的符号链接
 --munge-links munge符号链接使它们更安全(但会无法使用)
 -k, --copy-dirlinks 把指向文件夹的符号链接转换为文件夹
 -K, --keep-dirlinks 把接收端的指向文件夹的符号链接当做文件夹
 -H, --hard-links 保留硬链接
 -p, --perms 保留权限
 -E, --executability 保留文件的可执行属性
 --chmod=CHMOD 影响文件或文件夹的属性
 -A, --acls 保留ACLs (代表--perms)
 -X, --xattrs 保留扩展属性
 -o, --owner 保留所有者(仅限superuser)
 -g, --group 保留组
 --devices 保留设备文件(仅限superuser)
 --copy-devices 把设备文件内容当做文件一样进行复制处理
 --specials 保留特殊文件
 -D 和--devices --specials一样
 -t, --times 保留修改时间
 -O, --omit-dir-times 忽略文件夹的修改时间
 -J, --omit-link-times 忽略符号链接的修改时间
 --super 接收端尝试使用superuser进行操作
 --fake-super 使用xattrs来存储和恢复权限属性
 -S, --sparse 对稀疏文件进行特殊处理以节省空间
 --preallocate 在写入前预分配DST文件
 -n, --dry-run 执行一个没有实际更改的试运行,只会显示文件会被如何操作
 -W, --whole-file 拷贝文件,不进行增量检测
 -x, --one-file-system 不要跨越文件系统边界
 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
 -e, --rsh=COMMAND 指定使用rsh,ssh方式进行数据同步
 --rsync-path=PROGRAM 指定远程服务器上的rsync命令所在路径
 --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
 --ignore-existing 跳过更新已存在于DST的文件
 --remove-source-files 发送方删除非文件夹的源文件
 --del --delete-during的一个alias
 --delete 删除那些DST中SRC没有的文件
 --delete-before 传输前删除,而非传输过程中
 --delete-during 在传输过程中删除
 --delete-delay 在传输过程中确定要删除的,在传输结束后进行删除
 --delete-after 在传输结束后删除,而非传输过程中
 --delete-excluded 同样删除接收端那些被该选项指定排除的文件
 --ignore-missing-args 忽略丢失的源参数不输出错误
 --delete-missing-args 从DEST删除丢失的源参数
 --ignore-errors 即使出现I/O错误也进行删除
 --force 即使文件夹非空也强制删除
 --max-delete=NUM 不删除超过指定数量的文件
 --max-size=SIZE 不传输超过指定大小的文件
 --min-size=SIZE 不传输小于指定大小的文件
 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输(即断点续传)
 --partial-dir=DIR 将因故没有完全传输的文件放到指定文件夹
 --delay-updates 在传输末尾把所有更新的文件放到位
 -m, --prune-empty-dirs 从文件列表中删除空目录链
 --numeric-ids 不要把uid/gid值映射为用户/组名
 --usermap=STRING 自定义用户名映射
 --groupmap=STRING 自定义组名映射
 --chown=USER:GROUP 简单的用户/组名映射
 --timeout=SECONDS 设置I/O超时,单位为秒
 --contimeout=SECONDS 设置Daemon连接超时,单位为秒
 -I, --ignore-times 不跳过那些有同样的时间和大小的文件
 -M, --remote-option=OPTION 只把指定选项发送到远端
 --size-only 只跳过大小相同的文件
 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
 -T, --temp-dir=DIR 在指定文件夹中创建临时文件
 -y, --fuzzy 如果DEST没有任何文件,查找类似的文件
 --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
 --copy-dest=DIR 和上面的类似,但是还会复制指定文件夹中的没有改变的文件
 --link-dest=DIR 和上面类似,只是没有改变的文件会被硬链接到DST
 -z, --compress 在传输过程中进行压缩
 --compress-level=NUM 指定压缩级别0-9,默认为6
 --skip-compress=LIST 跳过压缩文件后缀在指定列表中的文件
 -C, --cvs-exclude 自动跳过CVS的生成文件
 -f, --filter=RULE 添加一个文件过滤规则
 -F 等于--filter='dir-merge /.rsync-filter'
    重复的: --filter='- .rsync-filter'
 --exclude=PATTERN 排除符合匹配规则的文件
 --exclude-from=FILE 从指定文件中读取需要排除的文件
 --include=PATTERN 包含(不排除)符合匹配规则的文件
 --include-from=FILE 从指定文件中读取需要包含(不排除)的文件
 --files-from=FILE 从指定文件中读取SRC源文件列表
 -0, --from0 从文件中读取的文件名以'\0'终止
 -s, --protect-args 没有空格分隔;只有通配符的特殊字符
 --address=ADDRESS 绑定到指定的地址
 --port=PORT 指定其他的rsync服务端口
 --sockopts=OPTIONS 指定自定义的TCP选项
 --blocking-io 对远程shell使用阻塞IO
 --stats 提供某些文件的传输状态
 -8, --8-bit-output 在输出中留下高比特的字符
 -h, --human-readable 用人类可读的格式输出数字
 --progress 在传输过程中显示进度
 -P 等同于--partial --progress
 -i, --itemize-changes 输出对所有更新的变更摘要
 --out-format=FORMAT 用指定格式输出更新
 --log-file=FILE 将日志保存到指定文件
 --log-file-format=FMT 用指定格式更新日志
 --password-file=FILE 从文件读取Daemon服务器密码
 --list-only 不复制而是只列出
 --bwlimit=RATE 限制套接字I/O带宽
 --outbuf=N|L|B 设置输出缓冲,为None,Line或者Block
 --write-batch=FILE 写入批量更新到指定文件
 --only-write-batch=FILE 和上面类似,但是对DST进行只写的更新
 --read-batch=FILE 从指定文件读取一个批量更新
 --protocol=NUM 强制使用指定的老版本协议
 --iconv=CONVERT_SPEC 对文件名进行字符编码转换
 --checksum-seed=NUM 设置块/文件的校验和种子
 -4, --ipv4 偏向于使用IPv4
 -6, --ipv6 偏向于使用IPv6
 --version 打印版本号
(-h) --help 显示帮助信息

二. 服务端配置
服务端配置文件默认位置/etc/rsyncd.conf

分为两块,最开头的是全局参数,部分可以由daemon进程运行参数覆盖,如下
参数说明默认值
address在独立运行时,用于指定的服务器运行的 IP 地址。由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代。本地所有IP
port指定 rsync 守护进程监听的端口号。 由 xinetd 运行时将忽略此参数,使用命令行上的–port 选项替代。873
motd file指定一个消息文件,当客户连接服务器时该文件的内容显示给客户。
pid filersync 的守护进程将其 PID 写入指定的文件。
log file指定 rsync 守护进程的日志文件,而不将日志发送给 syslog。
syslog facility指定 rsync 发送日志消息给 syslog 时的消息级别。daemon
socket options指定自定义 TCP 选项。
     
另外的就是模块参数了

1.基础参数
参数说明默认值
path指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的。
comment给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。

2.控制参数
参数说明默认值
use chroot若为 true,则 rsync 在传输文件之前首先 chroot 到 path 参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要 root 权限,并且不能备份指向 path 外部的符号连接所指向的目录文件。true
uid指定该模块以指定的 UID 传输文件。nobody
gid指定该模块以指定的 GID 传输文件。nobody
max connections指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。0(没有限制)
lock file指定支持 max connections 参数的锁文件。/var/run/rsyncd.lock
list指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,可以创建隐藏的模块。true
read only指定是否允许客户上传文件。若为 true 则不允许上传;若为 false 并且服务器目录也具有读写权限则允许上传。true
write only指定是否允许客户下载文件。若为 true 则不允许下载;若为 false 并且服务器目录也具有读权限则允许下载。false
ignore errors指定 在 rsync 服务器上运行 delete 操作时是否忽略 I/O 错误。一般来说 rsync 在出现 I/O 错误时将将跳过 –delete 操作,以防止因为暂时的资源不足或其它 I/O 错误导致的严重问题。true
ignore nonreadable指定 rysnc 服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些不应该被备份者获得的文件时是有意义的。false
timeout 该选项可以覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来说,理想的数字是 600(单位为秒)。0 (未限制)
dont compress用来指定那些在传输之前不进行压缩处理的文件。该选项可以定义一些不允许客户对该模块使用的命令选项列表。必须使用选项全名,而不能是简称。当发生拒绝某个选项的情况时,服务器将报告错误信息然后退出。例如,要防止使用压缩,应该是:"dont compress = *"。*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
   
3.文件过滤参数
参数说明默认值
exclude指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。
exclude from指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义。
include指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式 。
include from指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义。

一个模块只能指定一个 exclude 参数、一个 include 参数。

结合 include 和 exclude 可以定义复杂的 exclude/include 规则 。

这几个参数分别与相应的 rsync 客户命令选项等价,唯一不同的是它们作用在服务器端。

4.用户认证参数
参数说明默认值
auth users指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。(匿名方式)
secrets file指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。
strict modes指定是否监测口令文件的权限。若为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。true
       
rsync 认证口令文件的权限一定是 600,否则客户端将不能连接服务器。

rsync 认证口令文件中每一行指定一个"用户名:口令"对,格式为:

# 以 "#" 开始的行为注释行
username:passwd
# 一般来说口令最好不要超过8个字符。

5.访问控制参数
参数说明默认值
hosts allow用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。*
hosts deny用一个主机列表指定哪些主机客户不允许连接该模块。
       
客户主机列表定义可以是以下形式:
单个IP地址。例如:192.168.0.1
整个网段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
可解析的单个主机名。例如:centos,centos.smartraining.cn
域内的所有主机。例如:*.smartraining.cn
"*"则表示所有。
多个列表项要用空格间隔。
6.日志参数
参数说明默认值
transfer logging使 rsync 服务器将传输操作记录到传输日志文件。false
log format 指定传输日志文件的字段。 "%o %h [%a] %m (%u) %f %l"
   
设置了"log file"参数时,在日志每行的开始会添加"%t [%p]"。

可以使用的日志格式定义符如下所示:
%a - 远程IP地址
%h - 远程主机名
%l - 文件长度字符数
%p - 该次 rsync 会话的 PID
%o - 操作类型:"send" 或 "recv"
%f - 文件名
%P - 模块路径
%m - 模块名
%t - 当前时间
%u - 认证的用户名(匿名时是 null)
%b - 实际传输的字节数
%c - 当发送文件时,记录该文件的校验码
举个列子方便解释
cat >/etc/rsyncd.conf<<'EOF'
#指定传输文件时守护进程具有的用户ID,这里表示默认为nobady
uid=nobady
#指定传输文件时守护进程具有的用户组ID,这里表示默认为nobady
gid=nobody
#禁止切换目录
use chroot=no
#客户端的最大连接数
max connection=10
#检查口令文件的权限,口令文件的权限用户属组必须是root,权限必须是600
strict modes=yes
#pid文件的位置
pid file=/var/run/rsyncd.pid
#lock文件的位置
lock file=/var/run/rsyncd.lock
#日志文件的位置
log file=/var/log/rsyncd.log
 
#定义模块名,这玩意就是客户端命令跟在IP后面的,作为DST的一部分
[plex]
#指定这个模块需要同步的路径,或者说作为base目录
path=/home/plex/movie
#这个是注释 可以自己定义
comment=plex library
#忽略一些无关的IO错误
ignore errors
#no代表客户端可以上传文件,yes表示只读取
read only=no
#no表示客户端可以下载文件,yes表示不能下载
write only=no
#表示允许连接的主机地址
hosts allow=1.2.3.4
#表示不允许连接的主机地址
hosts deny=*
#不允许该模块被客户端列出
list=false
#指定传输文件时守护进程具有的用户ID,
uid=root
#指定传输文件时守护进程具有的用户组ID,
gid=root
#用来指定连接该模块的用户名,用户名可以自定义,这个是客户端命令跟在IP前面那个
auth users=plex
#指定密码文件,文件里面记录的是用户名:密码
secrets file=/etc/srs.pass
EOF
 
echo "用户名:密码" >/etc/srs.pass
#权限必须600,不然GG
chmod 600 /etc/srs.pass
#开机启动
echo "rsync --daemon --config=/etc/rsyncd.conf" >>/etc/rc.local
#立即运行服务端,其实这儿的配置文件位置就是默认的,可以不加--config
rsync --daemon --config=/etc/rsyncd.conf
三. 客户端命令
如果配置了密码,请务必先丢个密码文件,然后保证它的权限为600

echo "密码" >/etc/rsyncd.pass
chmod 600 /etc/rsyncd.pass

这样能列出服务端可同步的文件(如果搞单向同步你肯定就用不着这个了

rsync --list-only --password-file=/etc/rsyncd.pass plex@1.2.3.4::plex
rsync --list-only --password-file=/etc/rsyncd.pass rsync://plex@1.2.3.4/plex
然后手动同步我们可以这样(当然手动是可以不指定password-file的,反正会提示你输密码,如果写到脚本或者crontab里就必须带上了)

rsync -avzP --delete --exclude "*.torrent" /home/complete/ plex@1.2.3.4::plex
rsync -avzP --delete /home/complete/ rsync://plex@1.2.3.4/plex
P参数是给你看着玩的,不然鬼知道同步到啥程度了,写脚本里就别带了,单向传输脚本里如果要那个断点续传请自己做好命令返回状态的判断,因为单向传输是一次性的,如果是同步就没必要了,毕竟你会隔阵子就运行

z是压缩,如果你cpu不行或者需要降低资源消耗,可以带上–compress-level来减小下压缩率,0-9哦,从低到高资源消耗越来越大,当然你也可以不压缩,文本内容我觉得开个1或者2就很给力了

四. 常见错误
问题一:

@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题

问题二:

@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端该模块(backup)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败
提供正确的用户名密码解决此问题

问题三:

@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题

问题四:

password file must not beother-accessible
continuing without password file
Password:

原因:
这是因为rsyncd.pwd rsyncd.secrets的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd

问题五:

rsync: failed to connect to218.107.243.2: No route to host (113)
rsync error: error in socket IO(code 10) at clientserver.c(104) [receiver=2.6.9]

原因:
对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp的873端口打开

问题六:

rsync error: error startingclient-server protocol (code 5) at main.c(1524) [Receiver=3.0.7]

原因:
/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件

问题七:

rsync: chown "" failed:Invalid argument (22)

原因:
权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)
问题八:

@ERROR: daemon security issue –contact admin
rsync error: error starting client-server protocol (code 5) at main.c(1530)[sender=3.0.6]

原因:
同步的目录里面有软连接文件,需要服务器端的/etc/rsyncd.conf打开use chroot = yes。掠过软连接文件
#42
Linux 系统 / linux rsync命令详解
上次发布者 jvip_chen - 2022-5月-25 01:19 下午
在Linux操作系统中,"rsync的"代表远程同步。它是一种用于将文件和目录从源 (SRC) 同步(复制)到目标 (DEST) 的实用程序。

文件和目录可以在本地主机上同步,也可以与远程主机同步。在 SRC 上,文件和目录将被同步。而在 DEST 上,将发生同步的文件和目录。

此外,rsync 命令可以递归复制文件和目录、复制符号链接、保留(权限、组、修改时间和所有权)文件身份。

Rsync 可以使用两种不同的方式来同步/复制文件或目录:

使用远程 shell:ssh 或 rsh
直接通过 TCP 使用 rsync 守护进程
更重要的是,rsync 使用增量传输算法,该算法仅在 SRC 和 DEST 之间复制/同步不同的数据。

本教程将通过动手实践和示例介绍使用 rsync 命令的多种方法。我们还将详细解释 rsync 命令的最常用选项。

Rsync 命令语法
在深入研究 rsync 命令的使用方法之前,让我们先来看看它的语法:

rsync [options] 
在本地机器上复制/同步文件
Rsync 命令可用于在本地机器上复制/同步文件。

假设您要将文件从名为 '/home/jack' 的用户 'jack' 的主目录复制到文件夹 '/opt/test'。

$ sudo rsync -zvh /home/jack/computer-networking.pdf /opt/test/
computer-networking.pdf

sent 1.01K bytes  received 35 bytes  2.10K bytes/sec
total size is 3.03K  speedup is 2.89
-z: 压缩

-v: 详细输出

-h: 人类可读

在本地机器上复制/同步目录
要将所有文件从 SRC 本地目录传输到 DEST 目录,请运行带有选项的 rsync 命令-zavh。

假设您要将名为 '/home/jack' 的用户 'jack' 的主目录复制到文件夹 '/opt/backup'。

$ sudo rsync -zavh /home/jack/ /opt/backup/

sending incremental file list
./
.bash_history
.bash_logout
.bashrc
.lesshst
.profile
.sudo_as_admin_successful
.viminfo
computer-networking.pdf
.ssh/
.ssh/known_hosts

sent 4.85K bytes  received 198 bytes  10.10K bytes/sec
total size is 9.59K  speedup is 1.90
-a: 在复制/同步过程中存档数据

您可以验证 rsync 命令是否成功,运行以下命令:

$ ls /opt/backup/ -la
total 40
drwxr-xr-x 3 jack jack 4096 Thg 6 15 16:02 .
drwxr-xr-x 4 root     root     4096 Thg 6 15 16:25 ..
-rw------- 1 jack jack  817 Thg 6 15 16:01 .bash_history
-rw-r--r-- 1 jack jack  220 Thg 6 11 15:58 .bash_logout
-rw-r--r-- 1 jack jack 3771 Thg 6 11 15:58 .bashrc
-rw-rw-r-- 1 jack jack 3028 Thg 2 25  2017 computer-networking.pdf
-rw------- 1 jack jack   40 Thg 6 15 15:51 .lesshst
-rw-r--r-- 1 jack jack  807 Thg 6 11 15:58 .profile
drwx------ 2 jack jack 4096 Thg 6 13 17:58 .ssh
-rw-r--r-- 1 jack jack    0 Thg 6 15 16:02 .sudo_as_admin_successful
-rw------- 1 jack jack  680 Thg 6 14 16:50 .viminfo
使用特定端口通过 ssh 进行 Rsync
您可以使用 ssh(安全外壳)复制/同步数据,您的数据将通过加密的安全连接传输。当您的数据在 Internet 上传输时,没有人可以读取您的数据。当您使用 rsync 命令时,您需要提供用户/root 密码来完成特定任务。使用 SSH 选项将以加密方式发送您的登录信息,以便您的密码安全。

使用特定的 ssh 端口将文件从远程复制到本地。为了使用 rsync 命令指定协议,您需要使用-e带有要使用的协议名称的选项。

例如,以下 rsync 命令将通过远程外壳将文件"deploy.yaml"从远程机器复制到用户"jack"的主目录。

$ rsync -avz -e "ssh -p 22" cas@10.9.8.41:/home/cas/deploy.yaml /home/jack/
cas@10.9.8.41's password:
receiving incremental file list

sent 20 bytes  received 60 bytes  32.00 bytes/sec
total size is 239  speedup is 2.99
从本地机器复制/同步文件和目录到远程机器
假设您要将本地主机中用户 'jack' 的主目录中的文件夹 'test-data' 复制/同步到远程机器 'cas@10.9.8.41' 的主目录,请运行命令:

$ rsync -azrvh /home/jack/computer-networking.pdf cas@10.9.8.41:
cas@10.9.8.41's password:
sending incremental file list
computer-networking.pdf

sent 1.04K bytes  received 35 bytes  430.80 bytes/sec
total size is 3.03K  speedup is 2.81
-r: 递归复制

从远程机器复制/同步文件和目录到本地机器
rsync 命令可帮助您传输要复制到本地主机中的远程目录"文档"。

假设您要将文件/目录从远程主机"cas@10.9.8.41"复制/同步到用户"jack"的主目录。

例如:

$ rsync -zavhr cas@10.9.8.41:document /home/jack
cas@10.9.8.41's password:
receiving incremental file list
document/
document/kubernetes.txt

sent 47 bytes  received 139 bytes  74.40 bytes/sec
total size is 0  speedup is 0.00
rsync -include 和 -exclude 选项
这两个选项允许我们通过使用这些选项指定参数来包含和排除文件,这有助于我们指定要包含在同步中的文件或目录,并排除 您不想传输的文件和文件夹。

在此示例中,rsync 命令将仅包含以 'k' 开头的文件和目录,并排除所有其他文件和目录。
$ rsync -avhz -e "ssh -p 22" --include 'k*' --exclude '*' cas@10.9.8.41: /home/jack

cas@10.9.8.41's password:
receiving incremental file list
./
k8s.yaml
kubernetes.yaml
kuber/

sent 88 bytes  received 280 bytes  147.20 bytes/sec
total size is 73  speedup is 0.20
设置最大文件大小
您可以指定要传输或同步的最大文件大小。您可以使用"–max-size"选项来完成。

在以下示例中,最大文件大小为 200k,因此此命令将仅传输等于或小于 200k 的文件。

$ rsync -zavhr --max-size='200k' cas@10.9.8.41: /home/jack
cas@10.9.8.41's password:
receiving incremental file list
.bash_history
.bash_logout
.bashrc
.profile
.sudo_as_admin_successful
.viminfo
computer-networking.pdf

sent 2.58K bytes  received 51.60K bytes  21.67K bytes/sec
total size is 113.24K  speedup is 2.09
传输成功后删除源文件
现在,假设您有一台 Web 服务器和一台数据备份服务器,您创建了每日备份并将其与您的备份服务器同步,现在您不想在您的 Web 服务器中保留备份的本地副本。那么,您会等待传输完成然后手动删除该本地备份文件吗?当然不。这种自动删除可以使用"–remove-source-files"选项来完成。

$ ls /home/directory
computer-networking.pdf  deploy.yaml  document  k8s.yaml  kuber  kubernetes.yaml

------
$ rsync -azvh --remove-source-files /home/jack/deploy.yaml cas@10.9.8.41:
cas@10.9.8.41's password:
sending incremental file list

sent 70 bytes  received 20 bytes  36.00 bytes/sec
total size is 239  speedup is 2.66
再次运行'ls'命令,可以看到SRC上的'deploy.yaml'文件被删除了。

$ ls
computer-networking.pdf  document  k8s.yaml  kuber  kubernetes.yaml
查找src和dest在文件和目录上的区别
为了找到 SRC 和 DEST 之间目录文件的任何差异,您可以使用 '-i' 选项运行 rsync 命令。

$ rsync -avzi /home/jack/cloud cas@10.9.8.41:
cas@10.9.8.41's password:
sending incremental file list
cd+++++++++ cloud/
限制带宽
您可以在使用 '--bwlimit=<KB/s>' 选项运行 rsync 命令时设置带宽限制。

假设要将数据传输速率限制为 300KB/s,请运行以下命令:

$ rsync -avzh --bwlimit=300 /home/jack/coursera.png cas@10.9.8.41:

cas@10.9.8.41's password:
sending incremental file list
coursera.png

sent 2.93M bytes  received 35 bytes  234.48K bytes/sec
total size is 3.00M  speedup is 1.02
scp失败时恢复传输
有时,您必须通过 scp 命令传输一个非常大的文件,但在复制时出错,由于文件大且耗时,因此无法使用 scp 命令再次开始传输。

在这种情况下,您可以使用 rsync 命令从出现错误的位置开始复制文件。例如,将主目录中的大型 ISO 文件复制到远程主机 'cas@10.9.8.41'

$ scp /home/jack/ubuntu-18.04.4-live-server-amd64.iso cas@10.9.8.41:

cas@10.9.8.41's password:
ubuntu-18.04.4-live-server-amd64.iso                                                                                                                                              32%  278MB  86.7MB/s   00:06 ETA
该进程已被用户杀死。当时,传输了 32% 的文件。现在,您可以通过运行 rsync 继续当前的工作:

$ rsync -P -avzh ubuntu-18.04.4-live-server-amd64.iso cas@10.9.8.41:

cas@10.9.8.41's password:
sending incremental file list
ubuntu-18.04.4-live-server-amd64.iso
        912.26M 100%   15.89MB/s    0:00:54 (xfr#1, to-chk=0/1)

sent 541.25M bytes  received 132.44K bytes  9.25M bytes/sec
total size is 912.26M  speedup is 1.69
rsync 命令恢复传输文件
传输数据时显示进度
如果要在运行 rsync 命令时查看传输的进度,可以使用"--progress"选项。

它将显示文件和完成复制的剩余时间。

例如:

$ rsync -avh --progress /home/jack/cloud/ cas@10.9.8.41:
cas@10.9.8.41's password:
sending incremental file list
./
computer-networking.pdf
          3.03K 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=8/10)
coursera.png
          3.00M 100%  114.38MB/s    0:00:00 (xfr#2, to-chk=7/10)
k8s.yaml
             39 100%    1.52kB/s    0:00:00 (xfr#3, to-chk=6/10)
kubernetes.yaml
             34 100%    1.33kB/s    0:00:00 (xfr#4, to-chk=5/10)
ubuntu-18.04.4-live-server-amd64.iso
        912.26M 100%   89.60MB/s    0:00:09 (xfr#5, to-chk=4/10)
document/
document/kubernetes.txt
              0 100%    0.00kB/s    0:00:00 (xfr#6, to-chk=1/10)
kuber/
kuber/test.txt
              0 100%    0.00kB/s    0:00:00 (xfr#7, to-chk=0/10)

sent 915.49M bytes  received 164 bytes  79.61M bytes/sec
total size is 915.26M  speedup is 1.00

结论
在本教程中,我们通过一些示例学习了如何使用 rsync 命令来复制或同步文件/目录。
#43
VMware / 如何在 vSphere 5.5 中解锁并重置 SSO 管理员...
上次发布者 jvip_chen - 2022-5月-25 10:39 上午
在 Windows 服务器上
使用域管理员帐户登录到 vCenter Server。如果 vCenter Single Sign-On 未与 vCenter Server 安装在一起,则登录到 vCenter Single Sign-On 服务器。
打开提升的命令提示符。
通过运行以下命令导航到 vmdird 目录:
代码: 全选

cd Program Files\VMware\Infrastructure\VMware\CIS\vmdird
运行
c:\Program Files\VMware\Infrastructure\VMware\CIS\vmdird\vdcadmintool.exe
该控制台载入:
===============================
请选择:
0. 退出
1.测试 LDAP 连接
2.强制启动复制周期
3.重置帐户密码
4.设置日志级别和掩码
5.设置 vmdir 状态
===============================

按 3 进入重置帐户密码选项。
提示提供帐户 DN 时,输入:
cn=Administrator,cn=users,dc=vSphere,dc=local
此时新密码即生成。

使用新生成的密码登录到 administrator@vSphere.local 帐户。

注意:如果生成的密码包含感叹号 (!),请再次执行重新生成过程。

重新生成密码后,登录到 vSphere Web Client,并更改密码以使其符合 VMware 的受支持字符列表。有关详细信息,请参见 vSphere 5.5 Single Sign-On administrator@vsphere.local password issues (2060637)。
在 vCenter Server Appliance 中
通过 SSH 连接到 vCenter Server Appliance。
运行
/usr/lib/vmware-vmdir/bin/vdcadmintool

该控制台载入:

================================
请选择:
0. 退出
1. 测试 LDAP 连接
2. 强制启动复制周期
3. 重置帐户密码
4. 设置日志级别和掩码
5. 设置 vmdir 状态
================================

按 3 进入重置帐户密码选项。
提示提供帐户 DN 时,输入:
cn=Administrator,cn=users,dc=vSphere,dc=local
或者
administrator@vsphere.local
新密码即生成。

使用生成的密码登录到 administrator@vSphere.local 帐户。

注意:如果生成的密码包含感叹号 (!),请再次执行重新生成过程。

重新生成密码后,登录到 vSphere Web Client,并更改密码以使其符合 VMware 的受支持字符列表。
#44
VMware / vmrun命令行的使用(VMWare虚拟机)
上次发布者 jvip_chen - 2022-5月-25 10:37 上午
VMware Workstation 虚拟机中 vmrun 命令的使用

基本命令:
vmrun -T ws start "/opt/VMware/win2k8r2.vmx" nogui
# 启动无图形界面虚拟机 
#(-T 是区分宿主机的类型,ws|server|server1|fusion|esx|vc|player,比较常用的是ws、esx和player)
vmrun start "/opt/VMware/win2k8r2.vmx" gui
# 启动带图形界面虚拟机
vmrun stop "/opt/VMware/win2k8r2.vmx" hard | soft
# 强制关闭虚拟机(相当于直接关电源) | 正常关闭虚拟机
vmrun reset "/opt/VMware/win2k8r2.vmx" hard | soft
# 冷重启虚拟机 | 热重启虚拟机
vmrun suspend  "/opt/VMware/win2k8r2.vmx" hard | soft
# 挂起虚拟机(可能相当于休眠)
vmrun pause  "/opt/VMware/win2k8r2.vmx"
# 暂停虚拟机
vmrun unpause  "/opt/VMware/win2k8r2.vmx"
# 停止暂停虚拟机   
vmrun list
# 列出正在运行的虚拟机
ps aux | grep vmx
# 另一种查看正在运行虚拟机的方法
vmrun -T ws snapshot "/opt/VMware/win2k8r2.vmx" snapshotName
# 创建一个快照(snapshotName 快照名)
vmrun -T ws reverToSnapshot "/opt/VMware/win2k8r2.vmx" snapshotName
# 从一个快照中恢复虚拟机(snapshotName 快照名)
vmrun -T ws listSnapshots "/opt/VMware/win2k8r2.vmx"
# 列出虚拟机快照数量及名称
vmrun -T ws deleteSnapshot "/opt/VMware/win2k8r2.vmx" snapshotName
# 删除一个快照(snapshotName 快照名)
#45
VMware / vmware命令行
上次发布者 jvip_chen - 2022-5月-25 10:35 上午
本篇讲解几个简单的vmware的命令。
vmrun start "d:\\centos\\qs.vmx" nogui 无界面启动
vmrun start "d:\\centos\\qs.vmx" gui 图形化界面启动
vmrun list 列出正在运行的虚拟机
vmrun stop "d:\\centos\\qs.vmx" soft 正常关闭虚拟机
vmrun stop "d:\\centos\\qs.vmx" hard 强制关闭虚拟机
vmrun reset "d:\\centos\\qs.vmx" soft 热重启虚拟机
vmrun reset "d:\\centos\\qs.vmx" hard 冷重启虚拟机
vmrun sudpend "d:\\centos\\qs.vmx" soft 热挂起(休眠)
vmrun sudpend "d:\\centos\\qs.vmx" hard 冷挂起(休眠)
vmrun pause "d:\\centos\\qs.vmx" 暂停虚拟机
vmrun listsnapshots "d:\\centos\\qs.vmx" 查看某虚拟机有多少快照
vmrun snapshot "d:\\centos\\qs.vmx" snapshotcmdtest 创建快照
vmrun deleteSnapshot "d:\\centos\\qs.vmx" snapshotcmdtest 删除一个快照
vmrun revertToSnapshot "d:\\centos\\qs.vmx" snapshotcmdtest 从快照中恢复
Invalid argument: --help
vmrun version 1.15.0 build-2985596

Usage: vmrun [AUTHENTICATION-FLAGS] COMMAND [PARAMETERS]



AUTHENTICATION-FLAGS
--------------------
These must appear before the command and any command parameters.

-h <hostName> (not needed for Workstation)
-P <hostPort> (not needed for Workstation)
-T <hostType> (ws|server|server1|fusion|esx|vc|player)
for example, use '-T server' for Server 2.0
use '-T server1' for Server 1.0
use '-T ws' for VMware Workstation
use '-T ws-shared' for VMware Workstation (shared mode)
use '-T esx' for VMware ESX
use '-T vc' for VMware vCenter Server
-u <userName in host OS> (not needed for Workstation)
-p <password in host OS> (not needed for Workstation)
-vp <password for encrypted virtual machine>
-gu <userName in guest OS>
-gp <password in guest OS>

// 关于虚拟机电源的命令

POWER COMMANDS PARAMETERS DESCRIPTION
-------------- ---------- -----------
start Path to vmx file Start a VM or Team (vmrun start "d:\\centos\\qs.vmx" nogui 无界面启动)
[gui|nogui] (vmrun start "d:\\centos\\qs.vmx" gui 图形化界面启动)

stop Path to vmx file Stop a VM or Team (vmrun stop "d:\\centos\\qs.vmx" soft 正常关闭虚拟机)
[hard|soft] (vmrun stop "d:\\centos\\qs.vmx" hard 强制关闭虚拟机)

reset Path to vmx file Reset a VM or Team (vmrun reset "d:\\centos\\qs.vmx" soft 热重启虚拟机)
[hard|soft] (vmrun reset "d:\\centos\\qs.vmx" hard 冷重启虚拟机)

suspend Path to vmx file Suspend a VM or Team (vmrun sudpend "d:\\centos\\qs.vmx" soft 热挂起)
[hard|soft] (vmrun sudpend "d:\\centos\\qs.vmx" hard 冷挂起)

pause Path to vmx file Pause a VM (vmrun pause "d:\\centos\\qs.vmx" 暂停虚拟机)

unpause Path to vmx file Unpause a VM (vmrun unpause "d:\\centos\\qs.vmx" 从暂停中恢复虚拟机)

// 关于快照的命令

SNAPSHOT COMMANDS PARAMETERS DESCRIPTION
----------------- ---------- -----------
listSnapshots Path to vmx file List all snapshots in a VM
[showTree] (vmrun listSnapshots "d:\\centos\\qs.vmx" 查看某虚拟机有多少快照)

snapshot Path to vmx file Create a snapshot of a VM
Snapshot name (vmrun snapshot "d:\\centos\\qs.vmx" snapshotcmdtest 创建一个快照)

deleteSnapshot Path to vmx file Remove a snapshot from a VM
Snapshot name (vmrun deleteSnapshot "d:\\centos\\qs.vmx" snapshotcmdtest 删除一个快照)
[andDeleteChildren]

revertToSnapshot Path to vmx file Set VM state to a snapshot
Snapshot name (vmrun revertToSnapshot "d:\\centos\\qs.vmx" snapshotcmdtest 从快照中恢复)



GUEST OS COMMANDS PARAMETERS DESCRIPTION
----------------- ---------- -----------
runProgramInGuest Path to vmx file Run a program in Guest OS
[-noWait]
[-activeWindow]
[-interactive]
Complete-Path-To-Program
[Program arguments]

fileExistsInGuest Path to vmx file Check if a file exists in Guest OS
Path to file in guest

directoryExistsInGuest Path to vmx file Check if a directory exists in Guest OS
Path to directory in guest

setSharedFolderState Path to vmx file Modify a Host-Guest shared folder
Share name
Host path
writable | readonly

addSharedFolder Path to vmx file Add a Host-Guest shared folder
Share name
New host path

removeSharedFolder Path to vmx file Remove a Host-Guest shared folder
Share name

enableSharedFolders Path to vmx file Enable shared folders in Guest
[runtime]

disableSharedFolders Path to vmx file Disable shared folders in Guest
[runtime]

listProcessesInGuest Path to vmx file List running processes in Guest OS

killProcessInGuest Path to vmx file Kill a process in Guest OS
process id

runScriptInGuest Path to vmx file Run a script in Guest OS
[-noWait]
[-activeWindow]
[-interactive]
Interpreter path
Script text

deleteFileInGuest Path to vmx file Delete a file in Guest OS
Path in guest

createDirectoryInGuest Path to vmx file Create a directory in Guest OS
Directory path in guest

deleteDirectoryInGuest Path to vmx file Delete a directory in Guest OS
Directory path in guest

CreateTempfileInGuest Path to vmx file Create a temporary file in Guest OS

listDirectoryInGuest Path to vmx file List a directory in Guest OS
Directory path in guest

CopyFileFromHostToGuest Path to vmx file Copy a file from host OS to guest OS
Path on host Path in guest


CopyFileFromGuestToHost Path to vmx file Copy a file from guest OS to host OS
Path in guest Path on host


renameFileInGuest Path to vmx file Rename a file in Guest OS
Original name
New name

captureScreen Path to vmx file Capture the screen of the VM to a local file
Path on host

writeVariable Path to vmx file Write a variable in the VM state
[runtimeConfig|guestEnv|guestVar]
variable name
variable value

readVariable Path to vmx file Read a variable in the VM state
[runtimeConfig|guestEnv|guestVar]
variable name

getGuestIPAddress Path to vmx file Gets the IP address of the guest
[-wait]



GENERAL COMMANDS PARAMETERS DESCRIPTION
---------------- ---------- -----------
list List all running VMs (vmrun list 列出所有正在运行的虚拟机)

upgradevm Path to vmx file Upgrade VM file format, virtual hw

installTools Path to vmx file Install Tools in Guest

checkToolsState Path to vmx file Check the current Tools state

register Path to vmx file Register a VM

unregister Path to vmx file Unregister a VM

listRegisteredVM List registered VMs

deleteVM Path to vmx file Delete a VM (vmrun deleteVM vmname 删除名为vmname的虚拟机)

clone Path to vmx file Create a copy of the VM (克隆一个虚拟机:完全克隆/链接克隆)
Path to destination vmx file
full|linked
[-snapshot=Snapshot Name]
[-cloneName=Name]




Examples:


Starting a virtual machine with Workstation on a Windows host
   vmrun -T ws start "c:\my VMs\myVM.vmx"
Stopping a virtual machine on an ESX host
   vmrun -T esx -h https://myHost.com/sdk -u hostUser -p hostPassword stop "[storage1] vm/myVM.vmx"
Running a program in a virtual machine with Workstation on a Windows host with Windows guest
   vmrun -T ws -gu guestUser -gp guestPassword runProgramInGuest "c:\my VMs\myVM.vmx" "c:\Program Files\myProgram.exe"Running a program in a virtual machine with Server on a Linux host with Linux guest
vmrun -T server -h https://myHost.com:8333/sdk -u hostUser -p hostPassword -gu guestUser -gp guestPassword runProgramInGuest "[standard] vm/myVM.vmx" /usr/bin/X11/xclock -display :0


Creating a snapshot of a virtual machine with Workstation on a Windows host
   vmrun -T ws snapshot "c:\my VMs\myVM.vmx" mySnapshot
Reverting to a snapshot with Workstation on a Windows host
   vmrun -T ws revertToSnapshot "c:\my VMs\myVM.vmx" mySnapshot
Deleting a snapshot with Workstation on a Windows host
   vmrun -T ws deleteSnapshot "c:\my VMs\myVM.vmx" mySnapshot
Enabling Shared Folders with Workstation on a Windows host
   vmrun -T ws enableSharedFolders "c:\my VMs\myVM.vmx"
#46
VirtualBox / VirtualBox 常用命令汇总
上次发布者 jvip_chen - 2022-5月-25 10:31 上午
VirtualBox 命令汇总

在Linux平台安装的VirtualBox虚拟机,可以通过如下命令操作虚拟机:

查看有哪些虚拟机
VBoxManage list vms
查看虚拟的详细信息
VBoxManage list vms --long
查看运行着的虚拟机
VBoxManage list runningvms
开启虚拟机在后台运行
VBoxManage startvm backup -type headless
开启虚拟机并开启远程桌面连接的支持
VBoxManage startvm <vm_name> -type vrdp
改变虚拟机的远程连接端口,用于多个vbox虚拟机同时运行
VBoxManage controlvm <vm_name> vrdpprot <ports>
关闭虚拟机
VBoxManage controlvm <vm_name> acpipowerbutton
强制关闭虚拟机
VBoxManage controlvm <vm_name> poweroff
杀掉某个虚拟机的进程方法(强制关闭虚拟机)

经常遇到强制关闭虚拟机后,虚拟关不了的现象,状态一直是 stopping,而且一直卡死在这,没办法关闭,所以需要强制关闭这个虚拟机

(1) 查看所有virtualbox进程
ps -aux|grep virtualbox
会查出如下 信息:(蓝色背景文字 为 进程id 和 虚拟机名)

vnc 19499 54.7 3.3 3746624 2177960 ? Sl 15:46 55:49 /usr/lib/virtualbox/VirtualBox --comment SwiftSync2.0_Synctest25 --startvm 7fa1f49b-4dc2-4a7f-865d-5e0456f5482d --no-startvm-errormsgbox

....

然后强制杀进程id为 19499的进程,这个进程就是 虚拟机SwiftSync2.0_Synctest25的进程
kill -9 194999
#47
VirtualBox / Ubuntu下安装VirtualBox
上次发布者 jvip_chen - 2022-5月-25 10:29 上午
之前换了新硬盘,重装了ubuntu,由于学习需要还是要装个虚拟机。以前用过VMWare真的是神卡,这次换VirtualBox,希望开源社区能给我带来曙光:)
添加VirtualBox的源并安装5.1版本
虽然也可以直接安装deb包,但毕竟懒,添加源可以保持更新:
$ sed -i '$adeb http://download.virtualbox.org/virtualbox/debian xenial contrib' /etc/apt/sources.list
为apt-secure导入公钥:
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
通过apt安装VirtualBox和dkms,其中dkms包可以确保在下次通过apt upgrade更新内核时,VirtualBox的内核模块也正确地更新:
$ sudo apt-get update
$ sudo apt-get install virtualbox-5.1 dkms
安装Oracle VM VirtualBox扩展包
这个扩展包据说可以提供USB2.0/3.0、Webcam、远程桌面协议(RDP)、磁盘加密等的支持,对于我这种普通用户来说其实就是USB3.0和RDP的支持比较有用,主要还是本着一颗爱折腾的心。
这个包就不推荐通过apt源来安装了,首先直至目前apt源提供的ext-pack仍然是5.0版本,而最新的virtualBox是5.1版本,不匹配;其次还会遇到一些奇怪的问题导致安装不成功。
首先直接下载这个包:
$ axel -a -n 16 "http://download.virtualbox.org/virtualbox/5.1.6/Oracle_VM_VirtualBox_Extension_Pack-5.1.6-110634.vbox-extpack"然后打开VirtualBox,在管理-全局设定-扩展中选择添加新包。
#48
Linux 系统 / Linux下curl用法详解播
上次发布者 jvip_chen - 2022-5月-25 10:24 上午
Curl(CommandLine Uniform Resource Locator),即在命令行中利用URL进行数据或者文件传输,它是Linux下强大的http命令行工具,其功能十分强大,我们来看下帮助页面,参数非常丰富。

[root@mx ~]# curl -h
Usage: curl [options...] <url>
Options: (H) means HTTP/HTTPS only, (F) means FTP only
     --anyauth       Pick "any" authentication method (H)
 -a, --append        Append to target file when uploading (F/SFTP)
     --basic         Use HTTP Basic Authentication (H)
     --cacert FILE   CA certificate to verify peer against (SSL)
     --capath DIR    CA directory to verify peer against (SSL)
 -E, --cert CERT[:PASSWD] Client certificate file and password (SSL)
     --cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)
     --ciphers LIST  SSL ciphers to use (SSL)
     --compressed    Request compressed response (using deflate or gzip)
 -K, --config FILE   Specify which config file to read
     --connect-timeout SECONDS  Maximum time allowed for connection
 -C, --continue-at OFFSET  Resumed transfer offset
 -b, --cookie STRING/FILE  String or file to read cookies from (H)
 -c, --cookie-jar FILE  Write cookies to this file after operation (H)
     --create-dirs   Create necessary local directory hierarchy
     --crlf          Convert LF to CRLF in upload
     --crlfile FILE  Get a CRL list in PEM format from the given file
 -d, --data DATA     HTTP POST data (H)
     --data-ascii DATA  HTTP POST ASCII data (H)
     --data-binary DATA  HTTP POST binary data (H)
     --data-urlencode DATA  HTTP POST data url encoded (H)
     --delegation STRING GSS-API delegation permission
     --digest        Use HTTP Digest Authentication (H)
     --disable-eprt  Inhibit using EPRT or LPRT (F)
     --disable-epsv  Inhibit using EPSV (F)
 -D, --dump-header FILE  Write the headers to this file
     --egd-file FILE  EGD socket path for random data (SSL)
     --engine ENGINGE  Crypto engine (SSL). "--engine list" for list
 -f, --fail          Fail silently (no output at all) on HTTP errors (H)
 -F, --form CONTENT  Specify HTTP multipart POST data (H)
     --form-string STRING  Specify HTTP multipart POST data (H)
     --ftp-account DATA  Account data string (F)
     --ftp-alternative-to-user COMMAND  String to replace "USER [name]" (F)
     --ftp-create-dirs  Create the remote dirs if not present (F)
     --ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)
     --ftp-pasv      Use PASV/EPSV instead of PORT (F)
 -P, --ftp-port ADR  Use PORT with given address instead of PASV (F)
     --ftp-skip-pasv-ip Skip the IP address for PASV (F)
     --ftp-pret      Send PRET before PASV (for drftpd) (F)
     --ftp-ssl-ccc   Send CCC after authenticating (F)
     --ftp-ssl-ccc-mode ACTIVE/PASSIVE  Set CCC mode (F)
     --ftp-ssl-control Require SSL/TLS for ftp login, clear for transfer (F)
 -G, --get           Send the -d data with a HTTP GET (H)
 -g, --globoff       Disable URL sequences and ranges using {} and []
 -H, --header LINE   Custom header to pass to server (H)
 -I, --head          Show document info only
 -h, --help          This help text
     --hostpubmd5 MD5  Hex encoded MD5 string of the host public key. (SSH)
 -0, --http1.0       Use HTTP 1.0 (H)
     --ignore-content-length  Ignore the HTTP Content-Length header
 -i, --include       Include protocol headers in the output (H/F)
 -k, --insecure      Allow connections to SSL sites without certs (H)
     --interface INTERFACE  Specify network interface/address to use
 -4, --ipv4          Resolve name to IPv4 address
 -6, --ipv6          Resolve name to IPv6 address
 -j, --junk-session-cookies Ignore session cookies read from file (H)
     --keepalive-time SECONDS  Interval between keepalive probes
     --key KEY       Private key file name (SSL/SSH)
     --key-type TYPE Private key file type (DER/PEM/ENG) (SSL)
     --krb LEVEL     Enable Kerberos with specified security level (F)
     --libcurl FILE  Dump libcurl equivalent code of this command line
     --limit-rate RATE  Limit transfer speed to this rate
 -l, --list-only     List only names of an FTP directory (F)
     --local-port RANGE  Force use of these local port numbers
 -L, --location      Follow redirects (H)
     --location-trusted like --location and send auth to other hosts (H)
 -M, --manual        Display the full manual
     --mail-from FROM  Mail from this address
     --mail-rcpt TO  Mail to this receiver(s)
     --mail-auth AUTH  Originator address of the original email
     --max-filesize BYTES  Maximum file size to download (H/F)
     --max-redirs NUM  Maximum number of redirects allowed (H)
 -m, --max-time SECONDS  Maximum time allowed for the transfer
     --metalink      Process given URLs as metalink XML file
     --negotiate     Use HTTP Negotiate Authentication (H)
 -n, --netrc         Must read .netrc for user name and password
     --netrc-optional Use either .netrc or URL; overrides -n
     --netrc-file FILE  Set up the netrc filename to use
 -N, --no-buffer     Disable buffering of the output stream
     --no-keepalive  Disable keepalive use on the connection
     --no-sessionid  Disable SSL session-ID reusing (SSL)
     --noproxy       List of hosts which do not use proxy
     --ntlm          Use HTTP NTLM authentication (H)
 -o, --output FILE   Write output to <file> instead of stdout
     --pass PASS     Pass phrase for the private key (SSL/SSH)
     --post301       Do not switch to GET after following a 301 redirect (H)
     --post302       Do not switch to GET after following a 302 redirect (H)
     --post303       Do not switch to GET after following a 303 redirect (H)
 -#, --progress-bar  Display transfer progress as a progress bar
     --proto PROTOCOLS  Enable/disable specified protocols
     --proto-redir PROTOCOLS  Enable/disable specified protocols on redirect
 -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port
     --proxy-anyauth Pick "any" proxy authentication method (H)
     --proxy-basic   Use Basic authentication on the proxy (H)
     --proxy-digest  Use Digest authentication on the proxy (H)
     --proxy-negotiate Use Negotiate authentication on the proxy (H)
     --proxy-ntlm    Use NTLM authentication on the proxy (H)
 -U, --proxy-user USER[:PASSWORD]  Proxy user and password
     --proxy1.0 HOST[:PORT]  Use HTTP/1.0 proxy on given port
 -p, --proxytunnel   Operate through a HTTP proxy tunnel (using CONNECT)
     --pubkey KEY    Public key file name (SSH)
 -Q, --quote CMD     Send command(s) to server before transfer (F/SFTP)
     --random-file FILE  File for reading random data from (SSL)
 -r, --range RANGE   Retrieve only the bytes within a range
     --raw           Do HTTP "raw", without any transfer decoding (H)
 -e, --referer       Referer URL (H)
 -J, --remote-header-name Use the header-provided filename (H)
 -O, --remote-name   Write output to a file named as the remote file
     --remote-name-all Use the remote file name for all URLs
 -R, --remote-time   Set the remote file's time on the local output
 -X, --request COMMAND  Specify request command to use
     --resolve HOST:PORT:ADDRESS  Force resolve of HOST:PORT to ADDRESS
     --retry NUM   Retry request NUM times if transient problems occur
     --retry-delay SECONDS When retrying, wait this many seconds between each
     --retry-max-time SECONDS  Retry only within this period
 -S, --show-error    Show error. With -s, make curl show errors when they occur
 -s, --silent        Silent mode. Don't output anything
     --socks4 HOST[:PORT]  SOCKS4 proxy on given host + port
     --socks4a HOST[:PORT]  SOCKS4a proxy on given host + port
     --socks5 HOST[:PORT]  SOCKS5 proxy on given host + port
     --socks5-basic  Enable username/password auth for SOCKS5 proxies
     --socks5-gssapi Enable GSS-API auth for SOCKS5 proxies
     --socks5-hostname HOST[:PORT] SOCKS5 proxy, pass host name to proxy
     --socks5-gssapi-service NAME  SOCKS5 proxy service name for gssapi
     --socks5-gssapi-nec  Compatibility with NEC SOCKS5 server
 -Y, --speed-limit RATE  Stop transfers below speed-limit for 'speed-time' secs
 -y, --speed-time SECONDS  Time for trig speed-limit abort. Defaults to 30
     --ssl           Try SSL/TLS (FTP, IMAP, POP3, SMTP)
     --ssl-reqd      Require SSL/TLS (FTP, IMAP, POP3, SMTP)
 -2, --sslv2         Use SSLv2 (SSL)
 -3, --sslv3         Use SSLv3 (SSL)
     --ssl-allow-beast Allow security flaw to improve interop (SSL)
     --stderr FILE   Where to redirect stderr. - means stdout
     --tcp-nodelay   Use the TCP_NODELAY option
 -t, --telnet-option OPT=VAL  Set telnet option
     --tftp-blksize VALUE  Set TFTP BLKSIZE option (must be >512)
 -z, --time-cond TIME  Transfer based on a time condition
 -1, --tlsv1         Use => TLSv1 (SSL)
     --tlsv1.0       Use TLSv1.0 (SSL)
     --tlsv1.1       Use TLSv1.1 (SSL)
     --tlsv1.2       Use TLSv1.2 (SSL)
     --tlsv1.3       Use TLSv1.3 (SSL)
     --tls-max VERSION  Use TLS up to VERSION (SSL)
     --trace FILE    Write a debug trace to the given file
     --trace-ascii FILE  Like --trace but without the hex output
     --trace-time    Add time stamps to trace/verbose output
     --tr-encoding   Request compressed transfer encoding (H)
 -T, --upload-file FILE  Transfer FILE to destination
     --url URL       URL to work with
 -B, --use-ascii     Use ASCII/text transfer
 -u, --user USER[:PASSWORD]  Server user and password
     --tlsuser USER  TLS username
     --tlspassword STRING TLS password
     --tlsauthtype STRING  TLS authentication type (default SRP)
     --unix-socket FILE    Connect through this UNIX domain socket
 -A, --user-agent STRING  User-Agent to send to server (H)
 -v, --verbose       Make the operation more talkative
 -V, --version       Show version number and quit
 -w, --write-out FORMAT  What to output after completion
     --xattr        Store metadata in extended file attributes
 -q                 If used as the first parameter disables .curlrc
[root@mx ~]#
curl在Mac和Linux下是自带的命令行工具,如果你也想在Windows上使用,这里推荐使用"git for windows"这个工具,你可以使用此关键字在网络上检索下载。


安装完成后,点击桌面的"Git Bash"后,就可以在Windows下使用curl命令行工具了。

基本用法
curl是http工具,最简单的使用方法就是直接搭配网址使用,比如请求百度的内容:

[root@mx ~]# curl www.baidu.com

-s 选项:
加上此选项,不显示请求内容的进度信息。

-o 选项:
将获取内容存储到本地文件,-o后接文件名,如把请求的内容存储到1.txt中
# 搭配-s选项一起使用
[root@mx ~]# curl -s https://www.baidu.com -o 1.txt
# 不使用-s时,显示进度信息
[root@mx ~]# curl  https://www.baidu.com -o 2.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2443  100  2443    0     0  14183      0 --:--:-- --:--:-- --:--:-- 14203
[root@mx ~]# cat 1.txt
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head
......
[root@mx ~]#

详细用法
-A 选项:
-A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。下面命令将User-Agent改成 Chrome 浏览器。

$ 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
也可以通过-H参数直接指定标头,更改User-Agent。

$ curl -H 'User-Agent: php/1.0' https://google.com
-b 选项:
-b参数用来向服务器发送 Cookie。

$ curl -b 'foo=bar' https://google.com
上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。

$ curl -b 'foo1=bar;foo2=bar2' https://google.com
上面命令发送两个 Cookie。

$ curl -b cookies.txt https://www.google.com
上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。

-c 选项:
-c参数将服务器设置的 Cookie 写入一个文件。

$ curl -c cookies.txt https://www.google.com
上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。

-d 选项:
-d参数用于发送 POST 请求的数据体。

$ 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参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。

-d参数可以读取本地文本文件的数据,向服务器发送。

$ curl -d '@data.txt' https://google.com/login
上面命令读取data.txt文件的内容,作为数据体向服务器发送。

--data-urlencode--data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

$ curl --data-urlencode 'comment=hello world' https://google.com/login
上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。

-e 选项:
-e参数用来设置 HTTP 的标头Referer,表示请求的来源。

curl -e 'https://google.com?q=example' https://www.example.com
上面命令将Referer标头设为https://google.com?q=example。

-H参数可以通过直接添加标头Referer,达到同样效果。

引用curl -H 'Referer: https://google.com?q=example' https://www.example.com
-F 参数:
-F参数用来向服务器上传二进制文件。

$ curl -F 'file=@photo.png' https://google.com/profile
上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。

-F参数可以指定 MIME 类型。

$ curl -F 'file=@photo.png;type=image/png' https://google.com/profile
上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。

-F参数也可以指定文件名。

$ curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。

-G 选项:
-G参数用来构造 URL 的查询字符串。

$ curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略--G,会发出一个 POST 请求。

如果数据需要 URL 编码,可以结合--data--urlencode参数。

$ curl -G --data-urlencode 'comment=hello world' https://www.example.com
-H 选项:
-H参数添加 HTTP 请求的标头。

$ curl -H 'Accept-Language: en-US' https://google.com
上面命令添加 HTTP 标头Accept-Language: en-US。

$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
上面命令添加两个 HTTP 标头。

$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。

-i 选项:
-i参数打印出服务器回应的 HTTP 标头。

$ curl -i https://www.example.com
上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。

-I 选项:
-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。

$ curl -I https://www.example.com
上面命令输出服务器对 HEAD 请求的回应。

--head参数等同于-I。

$ curl --head https://www.example.com
-k 参数:
-k参数指定跳过 SSL 检测。

$ curl -k https://www.example.com
上面命令不会检查服务器的 SSL 证书是否正确。

-L 参数:
-L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。

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

$ curl --limit-rate 200k https://google.com
上面命令将带宽限制在每秒 200K 字节。

-o 选项:
-o参数将服务器的回应保存成文件,等同于wget命令。

$ curl -o example.html https://www.example.com
上面命令将www.example.com保存成example.html。

-O 选项:
-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

$ curl -O https://www.example.com/foo/bar.html
上面命令将服务器回应保存成文件,文件名为bar.html。

-s 选项:
-s参数将不输出错误和进度信息。

$ curl -s https://www.example.com
上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。

如果想让 curl 不产生任何输出,可以使用下面的命令。

$ curl -s -o /dev/null https://google.com
-S 选项:
-S参数指定只输出错误信息,通常与-s一起使用。

$ curl -s -o /dev/null https://google.com
上面命令没有任何输出,除非发生错误。

-u 选项:
-u参数用来设置服务器认证的用户名和密码。

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

curl 能够识别 URL 里面的用户名和密码。

$ curl https://bob:12345@google.com/login
上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。

$ curl -u 'bob' https://google.com/login
上面命令只设置了用户名,执行后,curl 会提示用户输入密码。

-v 选项:
-v参数输出通信的整个过程,用于调试。

$ curl -v https://www.example.com
--trace参数也可以用于调试,还会输出原始的二进制数据。

$ curl --trace - https://www.example.com
-x 选项:
-x参数指定 HTTP 请求的代理。

$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。

如果没有指定代理协议,默认为 HTTP。

$ curl -x james:cats@myproxy.com:8080 https://www.example.com
上面命令中,请求的代理使用 HTTP 协议。

-X 选项:
-X参数指定 HTTP 请求的方法。

$ curl -X POST https://www.example.com
上面命令对https://www.example.com发出 POST 请求。
#49
PHP 开发 / PHP CURL中CURLOPT_CONNECTTIMEOU...
上次发布者 cloud - 2022-5月-23 03:11 下午
写了一个简单的curl请求

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //限制响应时间200毫秒
$data = curl_exec($ch);
curl_close($ch);

再A服务器运行没有然后问题,到了B服务器发现$data返回false
这就令我百思不得其解了?
来我们开始排坑

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //限制响应时间200毫秒
$data = curl_exec($ch);
if($data === false){ //抓取错误信息
     print_r('---------------------start------------------------'.PHP_EOL);
     var_dump(curl_errno($ch));
     var_dump(curl_error($ch));
     print_r('---------------------end------------------------');
    exit();
}
curl_close($ch);
然后我们发现它告诉我们errno:28 超时了!!!
超时了那好解决啊,想当然的我把超时时间从200ms提升倒了600ms,要知道我们这个接口测试的时候是直接绑定host,响应也是直接返回一个json数据.600ms绝对足够了.

curl_setopt($ch, CURLOPT_TIMEOUT_MS, 600); //限制响应时间600毫秒
还是超时!
这就有点不对劲了!
继续修改时间

curl_setopt($ch, CURLOPT_TIMEOUT, 1); //限制响应时间1秒
成功了!那么问题就出在CURLOPT_TIMEOUT_MS上面了!

原来 CURLOPT_CONNECTTIMEOUT_MS 的等待的时间,以毫秒为单位。
真确的开启方式是

    curl_setopt($ch, CURLOPT_NOSIGNAL, true);//libcurl支持毫秒
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
#50
PHP框架-Yii / 数据格式
上次发布者 jvip_chen - 2022-5月-22 05:38 下午
数据格式取决于 HTTP 消息内容组合或解析的方式,例如: 它将确定 yii\httpclient\Message::$data 通过何种方式转换为 yii\httpclient\Message::$content,反之亦然。

默认情况下支持以下格式:

  • yii\httpclient\Client::FORMAT_JSON - JSON format
  • yii\httpclient\Client::FORMAT_URLENCODED - urlencoded by RFC1738 query string
  • yii\httpclient\Client::FORMAT_RAW_URLENCODED - urlencoded by PHP_QUERY_RFC3986 query string
  • yii\httpclient\Client::FORMAT_XML - XML format
每个格式由2个实体覆盖: "formatter" 和 "parser" 。 Formatter 决定请求中数据的组成方式。 Parser 决定如何将原始响应内容解析为数据。

yii\httpclient\Client 自动为上述所有格式选择相应的 formatter 和 parser 。 但是,可以使用 yii\httpclient\Client::$formatters 和 yii\httpclient\Client::$parsers 更改此行为。 可以使用这些字段添加自定义格式或更改标准的格式。 例如:

use yii\httpclient\Client;

$client = new Client([
    'formatters' => [
        'myformat' => 'app\components\http\MyFormatter', // add new formatter
        Client::FORMAT_XML => 'app\components\http\MyXMLFormatter', // override default XML formatter
    ],
]);
在创建自定义的解析器时,应该实现 yii\httpclient\ParserInterface ,同时创建formatter - yii\httpclient\FormatterInterface。 例如:

use yii\httpclient\FormatterInterface;
use yii\httpclient\ParserInterface;
use yii\httpclient\Response;

class ParserIni implements ParserInterface
{
    public function parse(Response $response)
    {
        return parse_ini_string($response->content);
    }
}

class FormatterIni implements FormatterInterface
{
    public function format(Request $request)
    {
        $request->getHeaders()->set('Content-Type', 'text/ini   ; charset=UTF-8');

        $pairs = []
        foreach ($request->data as $name => $value) {
            $pairs[] = "$name=$value";
        }

        $request->setContent(implode("\n", $pairs));
        return $request;
    }
}