来自bash脚本端口失败的rsync

时间:2015-05-15 19:32:36

标签: linux bash rsync

注意,文件夹和ip有obv。已被更改为能够在SO上发布;)

基于以下帖子: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:未知选项

这是工作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/

NEW ATTEMPT以下帮助: 我创建了一个ssh配置条目,以绕过将端口号设置为rsync选项的要求,删除所有排除项,输入后他选择使用单引号字符串并通过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]

2 个答案:

答案 0 :(得分:2)

引用时不要重新分组选项。试试这个:

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"

答案 1 :(得分:-2)

导致问题的微妙问题是-e "ssh -p 44"选项。使用-e--rsh=COMMAND

  

COMMAND中允许使用命令行参数   作为单个参数呈现给rsync。

-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

注意:如果您定期与12.12.12.12 port 44进行通信,则更有意义提供~/.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"的{​​{1}} { new FileWriter(..)中的FileReader file1配置格式就是:

file2

创建或编辑文件,添加上述选项,然后您可以完全删除file1选项。