【问题标题】:rsync from bash script port failure来自 bash 脚本端口故障的 rsync
【发布时间】:2015-07-27 20:16:18
【问题描述】:

注意,文件夹和 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/

在以下帮助下的新尝试: 我创建了一个 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]

【问题讨论】:

  • 我强烈建议您在尝试抽象出选项并在运行时构建 rsync 命令之前专注于制作一个有效的 rsync 命令。
  • rsync 命令完美运行,只是在 bash 中不行
  • 我不明白。你有一个有效的 rsync 命令吗?这是什么?
  • 我将 iost 我当前在宏中使用的工作 rsync 命令.. 给我一点时间。
  • \#015 业务清楚地表明您的脚本被保存为 DOS 文本文件,而不是 UNIX 文件。使用dos2unix 转换它们,并且——在未来——考虑使用本机支持UNIX 文本文件的文本编辑器。 (例如,如果您使用vim,即使是 Windows 的图形 Vim,您也可以运行 :set fileformat=unix 以避免 DOS 换行问题)。

标签: linux bash rsync


【解决方案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"

【讨论】:

  • 尝试这个时我仍然得到“端口 22:连接被拒绝”:|
  • 然后将脚本中的shebang改成#! /bin/bash -x,看看bash如何运行rsync
  • @Charles Duffy:不,工作条目是这样的:-e "ssh -p 44"
  • facepalm。阅读理解失败,那里。
  • 我现在尝试通过在 ssh 配置文件中设置端口号和 ip 来消除对端口号的要求。但我使用上述$ bash runRsync rsync: link_stat "/cygdrive/d/Work/site/(-avz --delete --chmod=ug=rwx,o=rx)\#015" failed: No such file or directory (2) 得到以下错误
【解决方案2】:

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

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

-e "ssh -p 44" 移出选项字符串可以使其按预期工作。数组方法如下所示:

opts=( -avz --delete --chmod=ug=rwx,o=rx --exclude '.idea*' --exclude '*.git*' --exclude node-sass )

如 cmets 中所述,从最佳实践的角度来看,不建议使用单个变量。但是,您可以确认以下方法也可以:

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 4412.12.12.12 通信,那么提供~/.ssh/config 规范更有意义告诉sshrsync默认 传输)12.12.12.12port 44 上通信。 ~/.ssh/config 中的HOST PORT 配置格式例如:

Host 12.12.12.12
Port 44

创建或编辑文件,添加以上选项,从此你就可以完全去掉-e "ssh -p 44"选项了。

【讨论】:

  • 不,-p 44 应该是ssh 的一个选项。
  • 然后双引号。我考虑了一下,经常使用-e ssh blah...,没有遇到问题。
  • 我收到以下错误:runRsync: line 5: rysnc: command not found runRsync: line 6: $'\r': command not found
  • @David C. Rankin:不知道你为什么对我大喊大叫。我完全知道 OP 应该做什么,这就是为什么我在你的帖子中指出你的问题。 耸耸肩
  • @John typo 抱歉.. 我怀疑尝试执行 rysnc 会出错(这里也没有类似的命令 :p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多