保持远程目录为最新
我绝对喜欢Winscp中的"保持远程目录最新"功能。不幸的是,我找不到在OS X或者Linux中使用起来那么简单的东西。我知道使用更改文件或者rsync从理论上可以完成同一件事,但是我一直发现这两种工具的教程都缺乏和/或者矛盾。
我基本上只需要一个可以在OSX或者Linux上运行的工具,并在对本地目录进行更改时使远程目录与本地目录保持同步(镜像)。
更新
通过这些解决方案,我看到了一对夫妇,它们解决了手动保持远程目录与本地目录同步的一般问题。我知道我可以将cron任务设置为每分钟运行rsync,这应该非常接近实时。
这不是我一直在寻找的确切解决方案,因为winscp会执行此操作以及更多操作:它检测目录中的文件更改(当我处理它们时),然后自动将更改推送到远程服务器。我知道这不是最好的解决方案(没有代码存储库),但是它允许我在开发服务器时非常快速地在服务器上测试代码。有谁知道如何将rsync与其他命令结合使用以获得此功能?
解决方案
回答
我们希望同步如何"实时"?我仍然倾向于rsync,因为我们知道它将在两个平台(Windows,以及cygwin)上都得到完全支持,并且可以通过cron作业运行它。我有一个在系统上运行的超简单bash文件(这不会删除旧文件):
#!/bin/sh rsync -avrz --progress --exclude-from .rsync_exclude_remote . remote_login@remote_computer:remote_dir # options # -a archive # -v verbose # -r recursive # -z compress
最好的选择是进行设置并尝试一下。 -n(--dry-run)
选项是朋友!
请记住,rsync(至少在cygwin中)不支持unicode文件名(截至2008年8月16日)。
回答
我们可以始终使用版本控制,例如SVN,因此我们要做的就是每天晚上使服务器在文件夹中运行svn。如果我们要公开共享文件,则会遇到安全问题,但是它可以工作。
如果我们使用的是Linux,请学习使用rsync。确实没有那么困难,因为我们可以使用-n测试每个命令。浏览手册页,我们想要的基本格式是
rsync [OPTION...] SRC... [USER@]HOST:DEST
我从学校服务器运行到家庭备用计算机的命令是这个
rsync -avi --delete ~ me@homeserv:~/School/ >> BackupLog.txt
这将获取我主目录(〜)中的所有文件,并使用rsync的存档模式(-a),详细地(-v),列出所有已进行的更改(-i),同时删除不再存在的任何文件(--delete)并将其放在我的远程服务器上的文件夹/ home / me / School /中。它打印出的所有信息(复制的内容,删除的内容等)也都添加到文件BackupLog.txt中
我知道这是rsync的旋风之旅,但我希望它能对我们有所帮助。
回答
rsync解决方案确实非常好,特别是如果我们仅以一种方式推动更改的话。另一个很棒的工具是unison
-它试图同步两个方向上的更改。在Unison主页上了解更多信息。
回答
要检测更改的文件,我们可以尝试使用fam(文件更改监视器)或者inotify。后者是特定于linux的,fam具有一个bsd端口,该端口可能在OS X上运行。两者都具有可以在脚本中与rsync一起使用的用户空间工具。
回答
似乎我们正在解决错误的问题。如果我们要在远程计算机上编辑文件,则可以尝试使用诸如jedit的ftp插件之类的东西。 http://plugins.jedit.org/plugins/?FTP这样可确保我们只有该文件的一个版本,因此它永远不会不同步。
回答
我们也可以将Fetch用作SFTP客户端,然后直接在其中从服务器上编辑文件。还有SSHFS(将ssh文件夹安装为卷)选项。这与stimms所说的一致,我们确定要使内容保持同步,还是只想编辑服务器上的文件?
OS X具有它自己的文件通知系统,这是Spotlight所基于的。我还没有听说过任何使用它来保持同步的程序,但这当然是可以想象的。
我个人使用RCS进行此类操作:虽然它具有手动方面的功能,但我不太可能想在不先进行测试的情况下将某些东西从我的开发机甚至推送到测试服务器。如果我在开发服务器上工作,则可以使用上面给出的选项之一。
回答
根据icco对SVN的建议,我实际上建议,如果我们正在使用Subversion或者类似版本进行源代码控制(如果没有,则应该开始使用),可以通过放置命令来使生产环境保持最新将存储库更新为提交后挂钩。
在执行此操作时,有很多变量,但是我看到的工作是将开发或者活动站点作为工作副本,然后在提交后使用带有强制命令的ssh密钥进行操作。登录到远程站点并触发工作副本上的svn。或者,在提交后挂钩中,我们可以触发远程计算机上的svn导出,或者触发本地(到svn存储库)的svn导出,然后触发rsync到远程计算机。
我会担心会检测到变化并推动变化的事物,甚至会因为种族条件而担心每分钟运行的事物。我们怎么知道它不会在写入文件的那一刻传送文件?偶然碰到一次或者两次,我们将失去不断进行同步或者类似操作所具有的所有节省时间的优势。
回答
DropBox(http://www.getdropbox.com/)会做什么吗?
回答
对于Linux远程访问,我们要使用SSH文件系统'sshfs'。
# sshfs username@host:path/to/directory local_dir
然后将其视为网络安装,这是...
在我的博客上,详细介绍了一些细节,例如如何设置它,以便我们可以以普通用户的身份进行操作
如果我们想要winSCP的异步行为,则需要将rsync与定期执行它的东西结合使用。上面的cron解决方案可以工作,但是对于winscp用例而言可能会显得有些过时。
以下命令每5秒执行一次rsync,将内容推送到远程主机。我们可以根据需要调整睡眠时间以减少服务器负载。
# while true; do rsync -avrz localdir user@host:path; sleep 5; done
如果目录结构非常大并且需要减少轮询的开销,则可以使用"查找":
# touch -d 01/01/1970 last; while true; do if [ "`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir user@host:path; else echo -ne .; fi; sleep 5; done
我说过cron可能会过分杀人?但是至少这一切都是从命令行完成的,可以通过ctrl-C停止。
千位
回答
我有同样的问题。我喜欢winscp"保持远程目录最新"命令。但是,为了摆脱Windows,我丢失了winscp。我确实编写了一个脚本,该脚本使用fileschanged和rsync来进行类似于实时的操作。
如何使用:
- 确保我们已安装文件更改
- 将此脚本保存在/ usr / local / bin / livesync或者$ PATH可以访问的位置,并使其可执行
- 使用Nautilus连接到远程主机(sftp或者ftp)
- 通过执行livesync SOURCE DEST运行此脚本
- DEST目录位于/ home / [用户名] /。gvfs / [ftp scp或者其他路径]
几个缺点:
- 它比winscp慢(我猜是因为它通过Nautilus,并且还必须通过rsync检测更改)
- 如果目标目录尚不存在,则必须手动创建它。因此,如果要添加目录,它将不会在DEST端检测到目录并创建目录。
- 可能还有更多我还没有注意到的东西
- 另外,请勿尝试同步名为" rsyncThis"的SRC目录。那可能不是很好:)
#!/bin/sh upload_files() { if [ "$HOMEDIR" = "." ] then HOMEDIR=`pwd` fi while read input do SYNCFILE=${input#$HOMEDIR} echo -n "Sync File: $SYNCFILE..." rsync -Cvz --temp-dir="$REMOTEDIR" "$HOMEDIR/$SYNCFILE" "$REMOTEDIR/$SYNCFILE" > /dev/null echo "Done." done } help() { echo "Live rsync copy from one directory to another. This will overwrite the existing files on DEST." echo "Usage: ##代码## SOURCE DEST" } case "" in rsyncThis) HOMEDIR= REMOTEDIR= echo "HOMEDIR=$HOMEDIR" echo "REMOTEDIR=$REMOTEDIR" upload_files ;; help) help ;; *) if [ -n "" ] && [ -n "" ] then fileschanged -r "" | "##代码##" rsyncThis "" "" else help fi ;; esac