Păstrați actualizările la distanță

Îmi place foarte mult caracterul Păstrați actualizarea la distanță în Winscp . Din păcate, nu găsesc nimic atât de simplu de folosit în OS X sau Linux. Știu că același lucru poate fi realizat folosind changedfiles sau rsync , dar am găsit întotdeauna tutorialele pentru ambele instrumente să fie lipsite și/sau contradictorii.

În principiu, am nevoie doar de un instrument care funcționează în OSX sau Linux și păstrează un director la distanță în sincronizare (oglindit) cu un director local în timp ce fac modificări în directorul local.


Actualizare

Privind prin soluții, văd un cuplu care rezolvă problema generală de păstrare a unui director la distanță în sincronizare cu un director local manual . Știu că pot seta o sarcină cron pentru a rula rsync în fiecare minut, iar acest lucru ar trebui să fie destul de aproape de timpul real.

Aceasta nu este soluția exactă pe care o căutam, deoarece winscp face acest lucru și mai mult: detectează modificările fișierelor într-un director (în timp ce lucrez la ele) și apoi împinge automat modificările la serverul de la distanță. Știu că nu este cea mai bună soluție (nu există un depozit de coduri), dar îmi permite să test foarte repede codul pe un server în timp ce îl dezvolt. Știe cineva cum să combine rsync cu alte comenzi pentru a obține această funcție?

0
fr hi bn
getdropbox.com (menționat de Scott) va detecta schimbările fișierelor în directorul și subdirectoarele contul de transfer securizat sale (în timp ce lucrați pe ele) și apoi în mod automat va împinge modificările la toate calculatoarele care sunt conectate la contul Dropbox.
adăugat autor jfs, sursa

15 răspunsuri

De asemenea, puteți utiliza funcția Fetch ca și client SFTP, apoi puteți edita fișierele direct pe server din interiorul acestuia. Există, de asemenea, SSHFS (montarea unui folder ssh ca volum). Acest lucru este în concordanță cu ceea ce a spus stimulentele - sunteți sigur că vreți ca lucrurile să fie sincronizate sau doar doriți să editați fișiere pe server?

OS X are propriul sistem de notificări de fișiere - acesta este motivul pe care se bazează Spotlight. Nu am auzit de vreun program care folosește acest lucru pentru a păstra lucrurile în sincronizare, dar este cu siguranță imaginabil.

Eu personal folosesc RCS pentru acest tip de lucru: - în timp ce are un aspect manual, este puțin probabil să vreau să împing ceva chiar și pe serverul de testare de la mașina mea dev, fără să-l testez mai întâi. Și dacă lucrez la un server de dezvoltare, atunci folosesc una dintre opțiunile de mai sus.

0
adăugat

Aveți întotdeauna posibilitatea de a utiliza controlul versiunii, cum ar fi SVN, astfel încât tot ce trebuie să faceți este să rulați serverul în fiecare noapte într-un dosar. Acest lucru se întâmplă în probleme de securitate dacă vă partajați fișierele în mod public, dar funcționează.

Dacă utilizați Linux, deși, învățați să utilizați rsync. Nu este chiar atât de dificil, deoarece puteți testa fiecare comandă cu -n. Mergeți prin pagina mană , formatul de bază pe care îl veți dori este

rsync [OPȚIUNI ...] SRC ... [USER @] HOST: DEST

comanda pe care o conduc de la serverul meu de școală la mașina mea de rezervă de acasă este asta

rsync -avi --delete ~ [email protected]:~/School/ >> BackupLog.txt

Acest lucru ia toate fișierele din directorul meu de acasă (~) și folosește modul de arhivare al lui rsync (-a), verbosly (-v), listează toate modificările făcute (-i), în timp ce șterg orice fișiere care nu mai există (--delete) și pune în folderul/home/me/School/pe serverul meu de la distanță. Toate informațiile pe care le imprimă (ceea ce a fost copiat, ceea ce a fost șters etc.) este, de asemenea, atașat la fișierul BackupLog.txt

Știu că este un tur de vârtej al rsync, dar sper că ajută.

0
adăugat

Cum "în timp real" doriți sincronizarea? M-aș sprijini în continuare spre rsync, deoarece știți că va fi pe deplin susținut pe ambele platforme (Windows, de asemenea, cu cygwin) și îl puteți executa printr-un job cron. Am un fișier super bash simplu pe care îl rulez pe sistemul meu (acest lucru nu elimina fișierele vechi):

#!/bin/sh
rsync -avrz --progress --exclude-from .rsync_exclude_remote . [email protected]_computer:remote_dir    

# options
#   -a  archive
#   -v  verbose
#   -r  recursive
#   -z  compress 

Cel mai bun pariu este să îl configurați și să-l încercați. Opțiunea -n (-dry-run) este prietenul tău!

Rețineți că rsync (cel puțin în cygwin) nu acceptă nume de fișiere unicode (din 16 august 2008).

0
adăugat
@dwj, poate că doriți să modificați răspunsul pentru a utiliza SSH, deoarece rsync poate fi uneori un port închis (mai des decât SSH).
adăugat autor einpoklum, sursa
Ce fel de sincronizare va face asta? Păstrați directoarele la distanță la zi cu cele locale? Invers? Sau va sincroniza ambele direcții și va păstra cel mai nou?
adăugat autor Chris Smith, sursa
Este aceasta bidirecțională?
adăugat autor ThorSummoner, sursa
De fapt, -a implică -r . Consultați man rsync .
adăugat autor Anton Rudeshko, sursa

lsyncd seems to be the perfect solution. it combines inotify (kernel builtin function which watches for file changes in a directory trees) and rsync (cross platform file-syncing-tool).

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

Citat de github:

Lsyncd urmărește o interfață de monitorizare a evenimentului local de copaci (inotify sau fsevents). Agregează și combină evenimentele pentru câteva secunde și apoi produce un proces (sau mai multe) pentru a sincroniza modificările. Implicit aceasta este rsync. Prin urmare, Lsyncd este o soluție în oglindă live cu greutate redusă, care este relativ ușor de instalat, care nu necesită sisteme de fișiere noi sau blochează și nu împiedică performanțele sistemului de fișiere local.

0
adăugat
Ce se întâmplă dacă schimbările au loc în timp ce computerul nu este conectat la telecomandă? Va păstra lsyncd o evidență a acestor modificări pentru mai târziu?
adăugat autor einpoklum, sursa
Acest lucru este mai bine, va sincroniza numai fișierele pe modificările detectate.
adăugat autor FaceBro, sursa
arata ca ceea ce cautam de acum cateva saptamani! Am încercat unison, niște servere de partajare a fișierelor grase, sshfs: toate nu au fost bune. IMHO rsync nu merită să ne uităm la această sarcină (cu excepția cazului în care dorim să petrecem timpul configurându-l împreună cu inotify sau echivalent) ... lsyncd arată bine până acum!
adăugat autor Shautieh, sursa

Se pare că ați rezolvat problema greșită. Dacă încercați să editați fișiere pe un computer la distanță, atunci puteți încerca să utilizați ceva de genul plugin-ul ftp pentru unitate. http://plugins.jedit.org/plugins/?FTP Acest lucru vă asigură că aveți doar o singură versiune a fișierului, astfel încât nu poate fi niciodată sincronizată.

0
adăugat

Folosesc acest mic Ruby-Script:

#!/usr/bin/env ruby
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rsyncs 2Folders
#
# watchAndSync by Mike Mitterer, 2014 
# with credit to Brett Terpstra 
# and Carlo Zottmann 
# 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

Adaptați-o pentru nevoile dvs.!

0
adăugat

Soluțiile rsync sunt cu adevărat bune, mai ales dacă doar împingeți modificările într-un singur sens. Un alt instrument excelent este unison - încercarea de a sincroniza modificările în ambele direcții. Citește mai mult la pagina de pornire Unison .

0
adăugat

DropBox ( http://www.getdropbox.com/ ) face ceea ce vrei?

0
adăugat

Construind sugestia de SVN de la SVN, aș sugera de fapt că dacă folosiți subversiune sau similar pentru controlul sursă (și dacă nu, probabil că ar trebui să începeți), puteți păstra actualizarea mediului de producție prin punerea comenzii pentru a actualiza depozitul în cârligul de post-comitere.

Există o mulțime de variabile în modul în care ați dori să faceți acest lucru, dar ceea ce am văzut este ca dezvoltarea site-ului sau a site-ului să fie o copie de lucru și apoi să utilizați ulterior o cheie ssh cu o comandă forțată conectați-vă la site-ul de la distanță și declanșați un svn pe copia de lucru. Ca alternativă, în cârligul post-comitere, puteți declanșa exportul svn pe mașina de la distanță sau exportul local (spre magazinul svn) svn și apoi un rsync la mașina de la distanță.

Mi-ar face griji cu privire la lucrurile care detectează schimbările și le împing, și chiar mă îngrijorează de lucrurile care au fugit în fiecare minut, doar din cauza condițiilor de rasă. De unde știți că nu va transfera fișierul în aceeași clipă în care este scris? Poți să faci o dată sau de două ori și vei pierde toate avantajele de economisire a timpului pe care le-ai avut prin rsyncing sau similar.

0
adăugat

Pentru a detecta fișierele modificate, puteți încerca programul fam (modificarea fișierelor) sau inotify. Ultimul este linux-specific, fam are un port bsd care ar putea funcționa pe OS X. Ambele au instrumente de utilizator care ar putea fi folosite într-un script împreună cu rsync.

0
adăugat

Ceea ce doriți să faceți pentru accesul la distanță de la Linux este să utilizați 'sshfs' - sistemul de fișiere SSH.

# sshfs [email protected]:path/to/directory local_dir

Apoi tratați-l ca o rețea de montare, care este ...

A bit more detail, like how to set it up so you can do this as a regular user, on my blog

Dacă doriți comportamentul asincron al winSCP, veți dori să utilizați rsync combinat cu ceva care îl execută periodic. Soluția cron de mai sus funcționează, dar poate fi depășită pentru cazul de utilizare winscp.

Următoarea comandă va executa rsync la fiecare 5 secunde pentru a împinge conținutul la gazda la distanță. Puteți ajusta timpul de somn după cum este necesar pentru a reduce încărcarea serverului.

# while true; do rsync -avrz localdir [email protected]:path; sleep 5; done

Dacă aveți o structură de directoare foarte mare și trebuie să reduceți cheltuielile generale, puteți folosi "găsi":

# touch -d 01/01/1970 last; while true; do if [ "`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir [email protected]:path; else echo -ne .; fi; sleep 5; done

Și i-am spus că Cron poate fi suprasolicitat? Dar cel puțin acest lucru este făcut doar din linia de comandă și poate fi oprit printr-un ctrl-C.

kb

0
adăugat
Uhh, link-ul dvs. de blog nu intră în niciun detaliu cu privire la tratarea sshfs ca o rețea de montare.
adăugat autor ThorSummoner, sursa
Ce avantaj are sshfs în legătură cu sincronizarea directă cu gazda la distanță în această situație? se pare ca un overhead inutile și în experiența mea sshfs poate deconecta ocazional.
adăugat autor nick fox, sursa

Am aceeași problemă. Mi-a plăcut comanda winscp "țineți comanda la distanță până la data de". Cu toate acestea, în căutarea mea de a scăpa de Windows, am pierdut winscp. Am scris un script care folosește fileschanged și rsync pentru a face ceva similar mult mai aproape de timpul real.

Cum se utilizează:

  • Make sure you have fileschanged installed
  • Save this script in /usr/local/bin/livesync or somewhere reachable in your $PATH and make it executable
  • Use Nautilus to connect to the remote host (sftp or ftp)
  • Run this script by doing livesync SOURCE DEST
  • The DEST directory will be in /home/[username]/.gvfs/[path to ftp scp or whatever]

Un dezavantaj de cuplu:

  • Este mai lent decât winscp (presupun că se întâmplă deoarece trece prin Nautilus și trebuie să detecteze modificări și prin rsync)
  • Trebuie să creați manual directorul de destinație dacă acesta nu există deja. Deci, dacă adăugați un director, acesta nu va detecta și nu va crea directorul pe partea DEST.
  • Probabil mai mult pe care nu l-am observat încă
  • De asemenea, nu încercați să sincronizați un director SRC numit "rsyncThis". Aceasta probabil că nu va fi bună:)

#!/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
0
adăugat

Am obtinut aceeasi setare sub Windows ca si tine, un fisier local (versiune) si un mediu de testare pe un server de la distanta, pe care l-am mentinut oglindit in timp real cu WinSCP. Când am trecut la Mac, a trebuit să fac destul de săpat înainte de a fi fericit, dar în cele din urmă am ajuns să folosesc:

  • SmartSVN as my subversion client
  • Sublime Text 2 as my editor (already used it on Windows)
  • SFTP-plugin to ST2 which handles the uploading on save (sorry, can't post more than 2 links)

Pot să recomand cu adevărat acest set, sper că vă ajută!

0
adăugat

Ei bine, am avut același tip de problemă și este posibilă utilizarea acestora împreună:. Rsync, SSH Passwordless Conectare, watchdog (Python sincronizare de utilitate) și Terminal Notifier (un utilitar de notificare OS X face cu ruby Nu este necesar, dar ajută să știe când sa terminat sincronizarea).

  1. I created the key to Passwordless Login using this tutorial from Dreamhost wiki: http://cl.ly/MIw5

    1.1. When you finish, test if everything is ok? if you can't Passwordless Login, maybe you have to try afp mount. Dreamhost (where my site is) does not allow afp mount, but allows Passwordless Login. In terminal, type:

    ssh [email protected] You should login without passwords being asked :P

  2. I installed the Terminal Notifier from the Github page: http://cl.ly/MJ5x

    2.1. I used the Gem installer command. In Terminal, type:

    gem install terminal-notifier

    2.3. Test if the notification works.In Terminal, type:

    terminal-notifier -message "Starting sync"

  3. Create a sh script to test the rsync + notification. Save it anywhere you like, with the name you like. In this example, I'll call it ~/Scripts/sync.sh I used the ".sh extension, but I don't know if its needed.

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ [email protected]:site_folder/ terminal-notifier -message "Sync has finished"

    3.1. Remember to give execution permission to this sh script. In Terminal, type:

    sudo chmod 777 ~/Scripts/sync.sh 3.2. Run the script and verify if the messages are displayed correctly and the rsync actually sync your local folder with the remote folder.

  4. Finally, I downloaded and installed Watchdog from the Github page: http://cl.ly/MJfb

    4.1. First, I installed the libyaml dependency using Brew (there are lot's of help how to install Brew - like an "aptitude" for OS X). In Terminal, type:

    brew install libyaml

    4.2. Then, I used the "easy_install command". Go the folder of Watchdog, and type in Terminal:

    easy_install watchdog

  5. Now, everything is installed! Go the folder you want to be synced, change this code to your needs, and type in Terminal:

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

    It has to be EXACTLY this way, with the slashes and line breaks, so you'll have to copy these lines to a text editor, change the script, paste in terminal and press return.

    I tried without the line breaks, and it doesn't work!

    In my Mac, I always get an error, but it doesn't seem to affect anything:

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

    Now, made some changes in a file inside the folder, and watch the magic!

0
adăugat

Utilizatorii watcher.py și rsync pentru a automatiza acest lucru. Citiți următoarele instrucțiuni pas cu pas aici:

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

0
adăugat