문제

나는 절대적으로 좋아한다 원격 디렉토리를 최신 상태로 유지 기능 Winscp.불행하게도 OS X나 Linux에서 사용하기 쉬운 것을 찾을 수 없습니다.나도 똑같은 일이 일어날 수 있다는 걸 알아 이론적으로 사용하여 달성하다 변경된 파일 또는 재동기화, 그러나 저는 항상 두 도구에 대한 튜토리얼이 부족하거나 모순된다는 것을 알았습니다.

기본적으로 OSX 또는 Linux에서 작동하고 로컬 디렉터리를 변경하는 동안 원격 디렉터리를 로컬 디렉터리와 동기화(미러링) 상태로 유지하는 도구가 필요합니다.


업데이트

솔루션을 살펴보면서 원격 디렉터리를 로컬 디렉터리와 동기화하는 일반적인 문제를 해결하는 몇 가지 방법을 발견했습니다. 수동으로.나는 매분마다 rsync를 실행하도록 cron 작업을 설정할 수 있다는 것을 알고 있으며 이는 실시간에 상당히 가깝습니다.

이것은 wincp가 이 작업을 수행하면서 내가 찾던 정확한 솔루션이 아닙니다.이는 디렉터리에서 파일 변경 사항을 감지하고(작업하는 동안) 자동으로 변경 사항을 원격 서버에 푸시합니다.이것이 최선의 솔루션(코드 저장소 없음)은 아니라는 것을 알고 있지만 이를 통해 개발하는 동안 서버에서 코드를 매우 빠르게 테스트할 수 있습니다.이 기능을 얻기 위해 rsync를 다른 명령과 결합하는 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

어떻게 "실시간"으로 동기화를 원하시나요?rsync가 두 플랫폼(Windows도 cygwin 포함)에서 완벽하게 지원되고 cron 작업을 통해 실행할 수 있다는 것을 알고 있기 때문에 저는 여전히 rsync를 선호합니다.내 시스템에서 실행하는 매우 간단한 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에서는)는 유니코드 파일 이름을 지원하지 않습니다(2008년 8월 16일 기준).

다른 팁

lsyncd 완벽한 솔루션인 것 같습니다.그것은 결합한다 inotify (디렉토리 트리에서 파일 변경을 감시하는 커널 내장 기능) 및 재동기화 (크로스 플랫폼 파일 동기화 도구).

lsyncd -rsyncssh /home remotehost.org backup-home/

github에서 인용:

Lsyncd는 로컬 디렉터리 트리 이벤트 모니터 인터페이스(inotify 또는 fsevents)를 감시합니다.몇 초 동안 이벤트를 집계하고 결합한 다음 하나 이상의 프로세스를 생성하여 변경 사항을 동기화합니다.기본적으로 이는 rsync입니다.따라서 Lsyncd는 새로운 파일 시스템이나 블록 장치가 필요하지 않고 비교적 설치가 쉽고 로컬 파일 시스템 성능을 방해하지 않는 경량 라이브 미러 솔루션입니다.

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

디렉토리 구조가 매우 크고 폴링의 오버헤드를 줄여야 하는 경우 'find'를 사용할 수 있습니다.

# 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

그리고 크론이 과잉일 수도 있다고 말했죠?그러나 최소한 이 모든 작업은 명령줄에서 수행되며 Ctrl-C를 통해 중지할 수 있습니다.

kb

변경된 파일을 감지하려면 fam(파일 변경 모니터) 또는 inotify를 사용해 볼 수 있습니다.후자는 Linux에만 해당되며, fam에는 OS X에서 작동할 수 있는 bsd 포트가 있습니다.둘 다 rsync와 함께 스크립트에서 사용할 수 있는 사용자 공간 도구를 가지고 있습니다.

나는 같은 문제가 있습니다.나는 Winscp "원격 디렉토리를 최신 상태로 유지" 명령을 좋아했습니다.그러나 Windows를 제거하려는 과정에서 Winscp를 잃어버렸습니다.나는 실시간에 훨씬 더 가까운 유사한 작업을 수행하기 위해 fileschanged 및 rsync를 사용하는 스크립트를 작성했습니다.

사용하는 방법:

  • 파일 변경이 설치되어 있는지 확인하십시오
  • 이 스크립트를 /usr/local/bin/livesync 또는 $PATH에서 접근할 수 있는 곳에 저장하고 실행 가능하게 만드세요.
  • Nautilus를 사용하여 원격 호스트(sftp 또는 ftp)에 연결합니다.
  • livesync를 수행하여 이 스크립트를 실행하세요. 소스 대상
  • 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: $0 SOURCE DEST"    
}


case "$1" in
  rsyncThis)
    HOMEDIR=$2
    REMOTEDIR=$3
    echo "HOMEDIR=$HOMEDIR"
    echo "REMOTEDIR=$REMOTEDIR"
    upload_files
    ;;

  help)
    help
    ;;

  *)
    if [ -n "$1" ] && [ -n "$2" ]
    then
        fileschanged -r "$1" | "$0" rsyncThis "$1" "$2"
    else
        help
    fi
    ;;
esac

SVN과 같은 버전 제어를 언제든지 사용할 수 있으므로 매일 밤 서버에서 폴더에 대해 svn을 실행하기만 하면 됩니다.파일을 공개적으로 공유하는 경우 보안 문제가 발생하지만 작동합니다.

하지만 Linux를 사용하는 경우 rsync 사용법을 배우십시오.-n을 사용하여 모든 명령을 테스트할 수 있으므로 실제로 그렇게 어렵지 않습니다.을 통해 이동 매뉴얼 페이지, 원하는 기본 형식은 다음과 같습니다.

rsync [옵션...] SRC...[USER@]호스트:DEST

학교 서버에서 집 백업 머신으로 실행하는 명령은 다음과 같습니다.

rsync -avi --delete ~ me@homeserv:~/School/ >> BackupLog.txt

이것은 내 홈 디렉토리(~)에 있는 모든 파일을 가져오고 rsync의 아카이브 모드(-a), 자세한 정보(-v)를 사용하고 모든 변경 사항을 나열(-i)하는 동시에 더 이상 존재하지 않는 파일을 삭제합니다. (--delete) 및 원격 서버의 /home/me/School/ 폴더에 넣습니다.인쇄되는 모든 정보(복사된 내용, 삭제된 내용 등)도 BackupLog.txt 파일에 추가됩니다.

나는 그것이 rsync의 회오리바람 투어라는 것을 알고 있지만 그것이 도움이 되기를 바랍니다.

그만큼 rsync 솔루션은 정말 좋습니다. 특히 한 방향으로만 변경 사항을 추진하는 경우라면 더욱 그렇습니다.또 다른 훌륭한 도구는 unison -- 변경 사항을 양방향으로 동기화하려고 시도합니다.자세한 내용은 다음에서 확인하세요. 유니슨 홈페이지.

아마도 잘못된 문제를 해결하고 있는 것 같습니다.원격 컴퓨터에서 파일을 편집하려는 경우 jedit용 ftp 플러그인과 같은 것을 사용해 볼 수 있습니다. http://plugins.jedit.org/plugins/?FTP 이렇게 하면 파일 버전이 하나만 있으므로 동기화되지 않을 수 없습니다.

SVN에 대한 icco의 제안을 바탕으로 실제로 소스 제어에 Subversion 또는 이와 유사한 기능을 사용하는 경우(그렇지 않은 경우 시작해야 함) 다음 명령을 입력하여 프로덕션 환경을 최신 상태로 유지할 수 있다고 제안합니다. 저장소를 커밋 후 후크로 업데이트합니다.

이를 수행하는 방법에는 많은 변수가 있지만 제가 본 작업은 개발 또는 라이브 사이트를 작업 복사본으로 만든 다음 커밋 후 강제 명령과 함께 ssh 키를 사용하도록 하는 것입니다. 원격 사이트에 로그인하고 작업 복사본에서 svn up을 트리거하십시오.또는 사후 커밋 후크에서 원격 시스템에서 svn 내보내기를 트리거하거나 로컬(svn 저장소에 대한) svn 내보내기를 트리거한 다음 원격 시스템에 대한 rsync를 트리거할 수 있습니다.

나는 변화를 감지하고 밀어붙이는 것에 대해 걱정할 것이고, 단지 경쟁 조건 때문에 매 순간 실행되는 것에 대해서도 걱정할 것입니다.파일이 기록되는 바로 그 순간에 파일을 전송하지 않을 것이라는 것을 어떻게 알 수 있습니까?한두 번 우연히 발견하면 지속적으로 재동기화하거나 유사한 방식으로 시간을 절약해 주던 이점을 모두 잃게 됩니다.

드롭박스(http://www.getdropbox.com/) 원하는 대로 하세요?

이를 자동화하려면 watcher.py 및 rsync를 사용하세요.여기에서 다음 단계별 지침을 읽어보세요.

http://kushellig.de/linux-file-auto-sync-directories/

저는 Windows에서 귀하와 동일한 설정을 사용했습니다. 즉, 로컬 파일 트리(버전 지정)와 원격 서버의 테스트 환경으로, WinSCP를 통해 실시간으로 미러링되었습니다.Mac으로 전환했을 때 만족하기까지 꽤 많은 조사를 거쳐야 했지만 결국 다음을 사용하게 되었습니다.

  • SmartSVN 내 전복 클라이언트로
  • 숭고한 텍스트 2 내 편집자(Windows에서는 이미 사용함)
  • 저장 시 업로드를 처리하는 ST2의 SFTP 플러그인(죄송합니다. 링크를 2개 이상 게시할 수 없습니다)

이 설정을 정말 추천할 수 있습니다. 도움이 되기를 바랍니다!

Fetch를 SFTP 클라이언트로 사용한 다음 서버에서 직접 파일을 편집할 수도 있습니다.SSHFS(ssh 폴더를 볼륨으로 마운트) 옵션도 있습니다.이것은 stimms가 말한 것과 일치합니다. 정말로 동기화를 유지하고 싶습니까, 아니면 단지 서버에서 파일을 편집하고 싶습니까?

OS X에는 자체 파일 알림 시스템이 있습니다. 이것이 Spotlight의 기반입니다.나는 이것을 사용하여 동기화를 유지하는 프로그램에 대해 들어본 적이 없지만 확실히 상상할 수 있습니다.

저는 개인적으로 이러한 유형의 작업에 RCS를 사용합니다. 수동적인 측면이 있지만 먼저 테스트하지 않고 내 개발 컴퓨터에서 테스트 서버로 무언가를 푸시하고 싶지 않을 것입니다.개발 서버에서 작업하는 경우 위에 제공된 옵션 중 하나를 사용합니다.

글쎄, 나는 같은 종류의 문제가 있었고 이것을 함께 사용하는 것이 가능합니다.rsync, SSH 비밀번호 없는 로그인, Watchdog(Python 동기화 유틸리티) 및 Terminal Notifier(Ruby로 만든 OS X 알림 유틸리티)필요하지는 않지만 동기화가 언제 완료되었는지 아는 데 도움이 됩니다).

  1. Dreamhost wiki의 이 튜토리얼을 사용하여 비밀번호 없는 로그인에 대한 키를 만들었습니다. http://cl.ly/MIw5

    1.1.완료되면 모든 것이 괜찮은지 테스트하십시오. 비밀번호 없이 로그인할 수 없다면 afp 마운트를 시도해야 할 수도 있습니다.Dreamhost(내 사이트가 있는 곳)는 afp 마운트를 허용하지 않지만 비밀번호 없는 로그인은 허용합니다.터미널에 다음을 입력하세요.

    ssh username@host.com 비밀번호를 묻지 않고 로그인해야 합니다 :P

  2. Github 페이지에서 Terminal Notifier를 설치했습니다. http://cl.ly/MJ5x

    2.1.Gem 설치 프로그램 명령을 사용했습니다.터미널에 다음을 입력합니다.

    gem install terminal-notifier

    2.3.알림이 작동하는지 테스트합니다. 터미널에 다음을 입력합니다.

    terminal-notifier -message "Starting sync"

  3. rsync + 알림을 테스트하는 sh 스크립트를 만듭니다.원하는 이름으로 원하는 곳에 저장하세요.이 예에서는 이렇게 부르겠습니다. ~/스크립트/sync.sh ".sh 확장자를 사용했지만 필요한지 모르겠습니다.

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"

    3.1.이 sh 스크립트에 실행 권한을 부여하는 것을 잊지 마세요.터미널에 다음을 입력합니다.

    sudo chmod 777 ~/Scripts/sync.sh 3.2.스크립트를 실행하고 메시지가 올바르게 표시되고 rsync가 실제로 로컬 폴더와 원격 폴더를 동기화하는지 확인합니다.

  4. 마지막으로 Github 페이지에서 Watchdog을 다운로드하여 설치했습니다. http://cl.ly/MJfb

    4.1.먼저 Brew를 사용하여 libyaml 종속성을 설치했습니다(OS X의 "적성"과 같은 Brew 설치 방법에 대한 많은 도움말이 있습니다).터미널에 다음을 입력합니다.

    brew install libyaml

    4.2.그런 다음 "easy_install 명령"을 사용했습니다.Watchdog 폴더로 이동하여 터미널에 다음을 입력하세요.

    easy_install watchdog

  5. 이제 모든 것이 설치되었습니다! 동기화하려는 폴더로 이동하세요., 이 코드를 필요에 맞게 변경하세요, 를 누르고 터미널에 다음을 입력합니다.

      watchmedo shell-command
          --patterns="*.php;*.txt;*.js;*.css" \
          --recursive \
          --command='~/Scripts/Sync.sh' \
          .
    

    그건 그래야만 해 정확히 이렇게 하면 슬래시와 줄 바꿈이 있으므로 이 줄을 텍스트 편집기에 복사하고 스크립트를 변경한 다음 터미널에 붙여넣고 Return 키를 눌러야 합니다.

    줄 바꿈 없이 시도했지만 작동하지 않습니다!

    내 Mac에서는 항상 오류가 발생하지만 아무 영향도 미치지 않는 것 같습니다.

    /Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.

    이제 폴더 안의 파일을 일부 변경하고 마술을 지켜보세요!

저는 이 작은 Ruby-Script를 사용하고 있습니다.

#!/usr/bin/env ruby
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rsyncs 2Folders
#
# watchAndSync by Mike Mitterer, 2014 <http://www.MikeMitterer.at>
# with credit to Brett Terpstra <http://brettterpstra.com>
# and Carlo Zottmann <https://github.com/carlo/haml-sass-file-watcher>
# Found link on: http://brettterpstra.com/2011/03/07/watch-for-file-changes-and-refresh-your-browser-automatically/
#

trap("SIGINT") { exit }

if ARGV.length < 2
  puts "Usage: #{$0} watch_folder sync_folder"
  puts "Example: #{$0} web keepInSync"
  exit
end

dev_extension = 'dev'
filetypes = ['css','html','htm','less','js', 'dart']

watch_folder = ARGV[0]
sync_folder = ARGV[1]

puts "Watching #{watch_folder} and subfolders for changes in project files..."
puts "Syncing with #{sync_folder}..."

while true do
  files = []
  filetypes.each {|type|
    files += Dir.glob( File.join( watch_folder, "**", "*.#{type}" ) )
  }
  new_hash = files.collect {|f| [ f, File.stat(f).mtime.to_i ] }
  hash ||= new_hash
  diff_hash = new_hash - hash

  unless diff_hash.empty?
    hash = new_hash

    diff_hash.each do |df|
      puts "Detected change in #{df[0]}, syncing..."
      system("rsync -avzh #{watch_folder} #{sync_folder}")
    end
  end

  sleep 1
end

귀하의 필요에 맞게 조정하십시오!

원격 서버에서 Python을 개발하는 경우 Pycharm이 좋은 선택일 수 있습니다.pycharm 원격 개발 기능을 활용하여 원격 파일을 로컬 파일과 동기화할 수 있습니다.가이드 링크는 다음과 같습니다.https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top