Ruby脚本中rsync二进制文件的问题

Ruby脚本中rsync二进制文件的问题,ruby,rsync,Ruby,Rsync,我正在编写一个脚本,它将利用rsync从主服务器推送到几个子节点。我不会让你对我的大部分脚本感到厌烦(尽管在我的Ruby幼年时期,我特别为它感到骄傲),但是当Ruby运行rsync二进制文件时,我遇到了一个问题。我使用相同的参数创建了rsync standalone,它可以工作,但不能通过脚本工作。以下是我得到的输出: rsync: link_stat "/Shared Items/Share/\#012" failed: No such file or directory (2) rsync:

我正在编写一个脚本,它将利用rsync从主服务器推送到几个子节点。我不会让你对我的大部分脚本感到厌烦(尽管在我的Ruby幼年时期,我特别为它感到骄傲),但是当Ruby运行rsync二进制文件时,我遇到了一个问题。我使用相同的参数创建了rsync standalone,它可以工作,但不能通过脚本工作。以下是我得到的输出:

rsync: link_stat "/Shared Items/Share/\#012" failed: No such file or directory (2) rsync: push_dir#3 "/Users/ckbrumb/Desktop/Projects/ruby_sync/@/Shared Items/Share" failed: No such file or directory (2) rsync error: errors selecting input/output files, dirs (code 3) at /SourceCache/rsync/rsync-42/rsync/main.c(580) [receiver=2.6.9] rsync: connection unexpectedly closed (8 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at /SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9]
@master_share
是一个初始化变量,通过读取脚本在第一次运行时放置的首选项文件的第一行来设置。它在所有测试中返回正确的路径。用于目标共享(
shr)_user@shr_server:shr_path
),该文件的其余行的格式如下:
。脚本使用
作为分隔符拆分此行,并根据数组中的关联位置设置变量

对于错误的第一行,我尝试了使用no
\
来逃逸空间,并使其保持原样,两种情况下的结果相同。
\\012
把我甩了,但我还没能找到那个(转义码?)

对于“协议数据流中的错误”问题,我确实看到提到rsync在服务器上的不同位置。不过,我会研究一下,我将从10.8.3升级到10.8.3,而且我没有弄乱任何二进制位置,所以这几乎不可能是问题所在

我仍有一些研究要做,但这个问题只存在于从我的脚本调用rsync时,我希望有人能看到问题所在,并将我推向正确的方向


更新:只是取得了一点进展。错误的第一部分是因为@master_share变量如何传递字符串。我把它拿出来,直接在引号里写下共享的路径,它就越过了那个点。现在它在询问密码时挂断。将不接受正确的密码。最后,我将设置一个正确的authorized_keys文件,但现在我只是在脚本运行时rsync请求输入密码时输入密码。是否有可能我输入的密码没有通过脚本传递到rsync?

只是取得了一些进展。错误的第一部分是因为@master_share变量如何传递字符串。我把它拿出来,直接在引号里写下共享的路径,它就越过了那个点。现在它在询问密码时挂断。将不接受正确的密码。最后,我将设置一个正确的authorized_keys文件,但现在我只是在脚本运行时rsync请求输入密码时输入密码。是否有可能我输入的密码没有通过脚本传递到rsync?请编辑您的问题,而不是发布实质上修改了您的问题的评论。感谢协议提示。我想原封不动地保留原来的帖子,以防里面有什么东西对新版本有所帮助。我将使用底部我的评论中的文本对其进行编辑。再次感谢。我建议您先看看是否可以通过bash构造一个可以任意工作的
rsync
命令,然后再考虑如何从ruby脚本中正确地分派它。一条建议当您到达那里时,的tokens-in-a-array形式或任何变体在确保sub命令正确解释args方面都优于单字符串形式。感谢您的提示。我想我已经提到了它,但我已经在bash中构建了命令,完全可以工作。我将尝试你关于我建立命令的方式的建议。
def perform_sync

    File.foreach(@filename) do |line|

        serv_path_array = line.split(":")
        shr_server = serv_path_array[0]
        shr_path = serv_path_array[1]
        shr_user = serv_path_array[2]

        `rsync -avrpogz --delete -e ssh "#{@master_share}" "#{shr_user}@#{shr_server}:#{shr_path}"` 
    end
end