来自 bash 脚本端口故障的 rsync
rsync from bash script port failure
注意,文件夹和ip有obv。已更改为能够在 SO 上 post ;)
基于以下 post:Rsync syntax error when run from bash script 我构建了以下 bash 脚本来尝试 运行 一个 rsync 命令..但是我无法得到东西工作。
通过将选项设置为数组,这没有传递端口号...
#!/bin/bash
options=("-avz" "--delete" "--chmod=ug=rwx,o=rx" "--exclude '.idea*" "--exclude '*.git*" "--exclude 'node-sass'" "-e'ssh -p 44'")
src="/cygdrive/d/Work/site/"
trg="john@12.12.12.12:/var/node/john.site.com/"
rsync "${options[@]}" "$src" "$trg"
或者将选项作为字符串传递..
#!/bin/bash
options="-avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '*.git*' --exclude 'node-sass' -e'ssh -p 44'"
src="/cygdrive/d/Work/site/"
trg="john@12.12.12.12:/var/node/john.site.com/"
rsync "$options" "$src" "$trg"
作为字符串刚返回一个错误:
rsync: -avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude
'.git' --exclude 'node-sass' -e'ssh -p 44'#015: unknown option
这是工作中的 rsync:
rysnc -avz --delete --chmod=ug=rwx,o=rx --exclude ".idea*" --exclude "*.git*" --exclude "node-sass" -e "ssh -p 44" /cygdrive/d/Work/site/ john@12.12.12.12:/var/node/john.site.com/
根据以下帮助进行新尝试:
我已经创建了一个 ssh 配置条目来绕过将端口号设置到 rsync 选项中的要求,删除了所有排除项,输入了 he opts into a single quoted string 并通过 herestring:
#!/bin/bash
opts='-avz --delete --chmod=ug=rwx,o=rx'
src="/cygdrive/d/Work/site/"
trg="john@mysite:/var/node/john.site.com/"
rsync <<<$opts "$src" "$trg"
通过 cli 的新命令看起来像(并且有效):
rsync -avz --delete --chmod=ug=rwx,o=rx /cygdrive/d/Work/site/ john@mysite:/var/node/john.site.com/
但我得到:
rsync: link_stat "/cygdrive/d/Work/site/\#015" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1165) [sender=3.1.1]
引用时不要重新分组选项。试试这个:
options=(-avz --delete --chmod=ug=rwx,o=rx --exclude ".idea*" --exclude "*.git*" --exclude "node-sass" -e "ssh -p 44")
src=/cygdrive/d/Work/site/
trg="john@87.87.87.87:/var/node/john.site.com/"
rsync "${options[@]}" "$src" "$trg"
导致麻烦的微妙问题是 -e "ssh -p 44"
选项。使用 -e
或 --rsh=COMMAND
时:
Command-line arguments are permitted in COMMAND provided that COMMAND
is presented to rsync as a single argument.
将 -e "ssh -p 44"
移出选项字符串可以使其按预期工作。数组方法看起来像:
opts=( -avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '*.git*' --exclude node-sass )
如评论中所述,从最佳实践的角度来看,不建议使用单个变量。但是,您可以确认以下内容也有效:
opts='-avz --delete --chmod=ug=rwx,o=rx --exclude .idea* --exclude *.git* --exclude node-sass'
您可以任意指定来源和目的地:
src="/cygdrive/d/Work/site/"
dest="john@12.12.12.12:/var/node/john.site.com/"
使用选项数组的 rsync
调用变为:
rsync ${opts[@]} -e "ssh -p 44" "$src" "$dest"
或者,出于测试目的,您可以按如下方式使用单个变量:
rsync $opts -e "ssh -p 44" "$src" "$dest"
配置 ssh
以将 port 44
用于主机 12.12.12.12
注意: 如果您将在 port 44
上定期与 12.12.12.12
通信,那么 更有意义 提供 ~/.ssh/config
规范告诉 ssh
(rsync
的 默认 传输)12.12.12.12
在 port 44
。 HOST
PORT
配置格式在 ~/.ssh/config
例如:
Host 12.12.12.12
Port 44
创建或编辑文件,添加以上选项,之后就可以完全去掉-e "ssh -p 44"
选项了。
注意,文件夹和ip有obv。已更改为能够在 SO 上 post ;)
基于以下 post:Rsync syntax error when run from bash script 我构建了以下 bash 脚本来尝试 运行 一个 rsync 命令..但是我无法得到东西工作。
通过将选项设置为数组,这没有传递端口号...
#!/bin/bash
options=("-avz" "--delete" "--chmod=ug=rwx,o=rx" "--exclude '.idea*" "--exclude '*.git*" "--exclude 'node-sass'" "-e'ssh -p 44'")
src="/cygdrive/d/Work/site/"
trg="john@12.12.12.12:/var/node/john.site.com/"
rsync "${options[@]}" "$src" "$trg"
或者将选项作为字符串传递..
#!/bin/bash
options="-avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '*.git*' --exclude 'node-sass' -e'ssh -p 44'"
src="/cygdrive/d/Work/site/"
trg="john@12.12.12.12:/var/node/john.site.com/"
rsync "$options" "$src" "$trg"
作为字符串刚返回一个错误:
rsync: -avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '.git' --exclude 'node-sass' -e'ssh -p 44'#015: unknown option
这是工作中的 rsync:
rysnc -avz --delete --chmod=ug=rwx,o=rx --exclude ".idea*" --exclude "*.git*" --exclude "node-sass" -e "ssh -p 44" /cygdrive/d/Work/site/ john@12.12.12.12:/var/node/john.site.com/
根据以下帮助进行新尝试: 我已经创建了一个 ssh 配置条目来绕过将端口号设置到 rsync 选项中的要求,删除了所有排除项,输入了 he opts into a single quoted string 并通过 herestring:
#!/bin/bash
opts='-avz --delete --chmod=ug=rwx,o=rx'
src="/cygdrive/d/Work/site/"
trg="john@mysite:/var/node/john.site.com/"
rsync <<<$opts "$src" "$trg"
通过 cli 的新命令看起来像(并且有效):
rsync -avz --delete --chmod=ug=rwx,o=rx /cygdrive/d/Work/site/ john@mysite:/var/node/john.site.com/
但我得到:
rsync: link_stat "/cygdrive/d/Work/site/\#015" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1165) [sender=3.1.1]
引用时不要重新分组选项。试试这个:
options=(-avz --delete --chmod=ug=rwx,o=rx --exclude ".idea*" --exclude "*.git*" --exclude "node-sass" -e "ssh -p 44")
src=/cygdrive/d/Work/site/
trg="john@87.87.87.87:/var/node/john.site.com/"
rsync "${options[@]}" "$src" "$trg"
导致麻烦的微妙问题是 -e "ssh -p 44"
选项。使用 -e
或 --rsh=COMMAND
时:
Command-line arguments are permitted in COMMAND provided that COMMAND is presented to rsync as a single argument.
将 -e "ssh -p 44"
移出选项字符串可以使其按预期工作。数组方法看起来像:
opts=( -avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '*.git*' --exclude node-sass )
如评论中所述,从最佳实践的角度来看,不建议使用单个变量。但是,您可以确认以下内容也有效:
opts='-avz --delete --chmod=ug=rwx,o=rx --exclude .idea* --exclude *.git* --exclude node-sass'
您可以任意指定来源和目的地:
src="/cygdrive/d/Work/site/"
dest="john@12.12.12.12:/var/node/john.site.com/"
使用选项数组的 rsync
调用变为:
rsync ${opts[@]} -e "ssh -p 44" "$src" "$dest"
或者,出于测试目的,您可以按如下方式使用单个变量:
rsync $opts -e "ssh -p 44" "$src" "$dest"
配置 ssh
以将 port 44
用于主机 12.12.12.12
注意: 如果您将在 port 44
上定期与 12.12.12.12
通信,那么 更有意义 提供 ~/.ssh/config
规范告诉 ssh
(rsync
的 默认 传输)12.12.12.12
在 port 44
。 HOST
PORT
配置格式在 ~/.ssh/config
例如:
Host 12.12.12.12
Port 44
创建或编辑文件,添加以上选项,之后就可以完全去掉-e "ssh -p 44"
选项了。