12

我已经搜索了超过 5 天,尝试了许多技巧和技巧,甚至试图让 lsync 的作者提供帮助,但都是徒劳的。

我有 2 个 Red Hat 6.3 Web 服务器,需要在上传图像时同步它们的图像目录。我们无法控制它被上传到哪台服务器,但在上传时它不会被加载到另一台服务器。

我只需要能够告诉 lsync 使用除 root 以外的其他用户的凭据。我们的信息安全团队不允许无密码根访问。不能说我怪他们。

我有一个具有 sudo 访问权限的帐户,可以执行将文件发送到目的地所需的一切。虽然我可以让 rsync 很好地执行同步,但从 lsync 运行时它会失败并出现权限被拒绝错误。

我什至可以从日志中复制 lsync 执行的命令,删除方括号并成功同步。所以,我很确定是 lsync 导致了这个问题。仅仅因为它是以root身份运行的。shell 脚本强制它以 root 身份运行。我什至尝试将其更改为非 root 帐户,并且所有支持文件都与脚本一起更改,但它仍然拒绝同步。

以下是我拥有的脚本和文件的详细信息: 操作系统:Red Hat Linux 版本 6.3 (Santiago) lsyncd 配置文件:

 ----
 -- User configuration file for lsyncd.
 --
 -- Simple example for default rsync, but executing moves through on the target.
 --
 -- For more examples, see /usr/share/doc/lsyncd*/examples/
 -- 
 -- sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}

settings{
    logfile = "/var/log/lsyncd.log",
    statusFile = "/var/log/lsyncd-status.log",
    delay = 1,
}
sync {
    default.rsyncssh,
    source="<Absolute path to source directory>",
    host      = "<Host IP>",
    targetdir = "<Absolute path to target directory>",
    rsync = {
        binary = "/usr/bin/rsync",
        rsh = "sudo -u <Domain>\\<User ID> ssh",
        sparse = true,
        update = true,
        links = true,
        times = true,
    }
}

rsyncd.conf 文件:

log file = /var/log/rsyncd.log
pid file = /var/log/rsyncd.pid
allow = localhost
deny = *
list = true
uid = 16777218
gid = 16777222
read only = false
timeout=600
use chroot = true

[Test1]
path = "<Absolute path to target/source>"
comment = Test for remote transfer

rsyncd.conf 文件已更改为使用不同的 uid/gid,因为这是我希望将其更改为的内容。

这是来自 lsyncd.log 的错误日志:

Thu Aug 22 07:58:57 2013 Debug: daemonizing now.
Thu Aug 22 07:58:57 2013 Function: Inotify.addWatch(<Absolute Path to Source> )
Thu Aug 22 07:58:57 2013 Inotify: addwatch( <Absolute Path to Source> )-> 1 
Thu Aug 22 07:58:57 2013 Call: getAlarm( )
Thu Aug 22 07:58:57 2013 Alarm: runner.getAlarm returns: (true)
Thu Aug 22 07:58:57 2013 Masterloop: immediately handling delays.
Thu Aug 22 07:58:57 2013 Call: cycle( )
Thu Aug 22 07:58:57 2013 Function: invokeActions( "Sync1", (Timestamp: 5491559.47) )
Thu Aug 22 07:58:57 2013 Normal: recursive startup rsync: <Absolute Path to Target> -> <Host IP>:<Absolute Path to Target>
Thu Aug 22 07:58:57 2013 Exec: /usr/bin/rsync [--delete] [--ignore-errors] [-usltS] [--rsh=sudo -u <Domain>\<User ID> ssh] [-r] [<Absolute Path to Source>] [<Host IP>:<Absolute Path to Target>]
Thu Aug 22 07:58:57 2013 Function: write( (Timestamp: 5491559.47) )
Thu Aug 22 07:58:57 2013 Statusfile: writing now
Thu Aug 22 07:58:57 2013 Call: getAlarm( )
Thu Aug 22 07:58:57 2013 Alarm: runner.getAlarm returns: (false)
Thu Aug 22 07:58:57 2013 Masterloop: going into select ( no timeout )
rsync: Failed to exec sudo: Permission denied (13)
rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6]
Thu Aug 22 07:58:57 2013 Call: collectProcess( )
Thu Aug 22 07:58:57 2013 Delay: collected an event
Thu Aug 22 07:58:57 2013 Error: Temporary or permanent failure on startup of "<Absolute Path to Target>". Terminating since "insist" is not set.

注意:我对文件进行了清理,并假设我理解应用程序的所有意图,即源和目标应该在哪里。

所以,只要我们明确目标:

  1. 我有 2 个负载平衡的 Web 服务器。
  2. 图像将被上传,而无法控制它们去往哪个服务器。
  3. 我正在设计一个使用 lsyncd/rsync 作为守护进程的同步架构,以便在上传时更新两台服务器。这意味着两台服务器都需要运行 lsyncd/rsyncd 而不删除。无删除假设如果两个服务器同时获得不同的图像,那么哪个服务器首先检查目标,它将删除目标上的文件,因为它不在源上。

他们正在讨论如何将图像定向到一台服务器,然后我们可以使用删除选项使两台服务器准确同步,而不必担心两台服务器上都有同步服务,并且可能会因为时间问题而丢失一个。另外,不知道如果一个文件打开而另一台服务器试图删除它会发生什么。

我很绝望,因为我什至无法得到作者的帮助。也许它无法完成,但看起来如此强大的应用程序会有一个愚蠢的小缺陷,这将使它完全无法被那些有安全问题的人使用。

谢谢!

4

3 回答 3

10

您必须在 lsyncd.conf 文件的 rsyncopts 部分中设置用户名和密钥文件(在 ubuntu 上是 /etc/lsyncd/lsyncd.conf.lua)。密钥文件必须存在于运行 lsyncd 守护程序的主机上。

sync{
  default.rsyncssh,
  source="/path/to/source",
  host="target.example.org",
  targetdir="/path/on/target",
  rsyncOpts={"-e", "/usr/bin/ssh -l someuser123 -i /home/someuser123/.ssh/id_rsa"}
}
于 2014-10-09T12:07:19.123 回答
2
settings {
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/var/log/lsyncd/lsyncd.status"
}

sync {
        default.rsyncssh,
        source = "/home/vagrant/local",
        host = "vagrant@192.168.33.11",
        targetdir = "/home/vagrant/remote",
        rsync = {
                rsh = "/usr/bin/ssh -l vagrant -i /home/vagrant/.ssh/id_rsa -o StrictHostKeyChecking=no"
        }
}
于 2017-03-18T17:57:29.440 回答
1

似乎随着时间的推移,支持非 root 登录会更容易。

这是我当前的配置,没有操作 rsync 选项,但在 ssh 配置中有一个附加选项表:

sync {
            default.rsyncssh,
            [... more config stuff...]
            ssh = {
                    port = 22,
                    identityFile = "/root/.ssh/id_rsa_somespecialprivatekey",
                    options = {
                            User = "someuser"
                    }
            }
    }

因此,ssh 选项表中的每个条目都将传递给 ssh 命令,就像您使用“-o”参数一样。

于 2020-12-27T21:37:24.000 回答