0

我正在编写一个脚本,该脚本将利用 rsync 从主服务器推送到多个子节点。我不会对我的大部分脚本感到厌烦(尽管在我的 Ruby 婴儿期我为此感到特别自豪),但是当 Ruby 运行 rsync 二进制文件时我遇到了一个问题。我已经使用相同的参数独立运行 rsync 并且它可以工作,但不能通过脚本工作。这是我得到的输出:

rsync:link_stat“/Shared Items/Share/\#012”失败:没有这样的文件或目录(2)
rsync:push_dir#3“/Users/ckbrumb/Desktop/Projects/ruby_sync/@/Shared Items/Share”失败:没有这样的文件或目录(2)
rsync 错误:在 /SourceCache/rsync/rsync-42/rsync/main.c(580) [receiver=2.6.9] 处选择输入/输出文件、目录(代码 3)时出错
rsync:连接意外关闭(到目前为止已收到 8 个字节)[发送者]
rsync 错误:/SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9] 处的 rsync 协议数据流(代码 12)错误

这是脚本的那部分:

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

@master_share是通过读取脚本在其第一次运行期间放置的第一行首选项文件设置的初始化变量。它在所有测试中返回正确的路径。对于目标共享 ( shr_user@shr_server:shr_path),该文件的其余行的格式如下:<serverName>:<user>:<path>. 脚本将此行与:分隔符分隔开,变量是根据数组中的关联位置设置的。

对于错误的第一行,我尝试了 no\来逃避空间并保持原样,在两种情况下都得到相同的结果。这\#012让我失望,但我还无法追踪(转义码?)。

对于“协议数据流中的错误”问题,我确实看到了为什么这个 rsync 连接在 Windows 上意外关闭?这提到 rsync 在服务器上的不同位置。我会调查一下,但是,我要从 10.8.3 升级到 10.8.3,而且我没有弄乱任何二进制位置,所以这几乎不可能是问题所在。

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

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

4

0 回答 0