我已经搜索了超过 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.
注意:我对文件进行了清理,并假设我理解应用程序的所有意图,即源和目标应该在哪里。
所以,只要我们明确目标:
- 我有 2 个负载平衡的 Web 服务器。
- 图像将被上传,而无法控制它们去往哪个服务器。
- 我正在设计一个使用 lsyncd/rsync 作为守护进程的同步架构,以便在上传时更新两台服务器。这意味着两台服务器都需要运行 lsyncd/rsyncd 而不删除。无删除假设如果两个服务器同时获得不同的图像,那么哪个服务器首先检查目标,它将删除目标上的文件,因为它不在源上。
他们正在讨论如何将图像定向到一台服务器,然后我们可以使用删除选项使两台服务器准确同步,而不必担心两台服务器上都有同步服务,并且可能会因为时间问题而丢失一个。另外,不知道如果一个文件打开而另一台服务器试图删除它会发生什么。
我很绝望,因为我什至无法得到作者的帮助。也许它无法完成,但看起来如此强大的应用程序会有一个愚蠢的小缺陷,这将使它完全无法被那些有安全问题的人使用。
谢谢!