Vraag Hoe _MOVE_ bestanden met scp?


Hoe kopieer en verplaats je bestanden niet van de ene naar de andere server (beide Linux)?

man scp gaf me niets nuttigs. Ik kan 'scp' en 'rm' niet gebruiken omdat ik moet zorgen dat het bestand met succes wordt overgedragen. Als er een fout optreedt tijdens de overdracht, mag het bestand niet worden verwijderd.

Misschien zou ik op de een of andere manier exitcode moeten gebruiken, maar hoe? Er zijn ook veel bestanden en als het laatste bestand faalt, zou het niet zo'n goede optie zijn om het geheel van succesvol overgebrachte bestanden te bewaren.

Misschien is er iets naast SCP?


40
2018-02-26 20:11


oorsprong




antwoorden:


rsync over ssh is waarschijnlijk uw beste weddenschap met de --remove-source-files keuze

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

een snelle test geeft;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Zoals @SvenW al zei, -e ssh is de standaard, dus kan worden weggelaten.


41
2018-02-26 20:15



-e ssh is de impliciete standaard voor vele jaren, er is meestal geen noodzaak om deze parameter meer te gebruiken. - Sven♦
@SvenW ah goed om te weten! Ik heb niet veel behoefte aan rsync van dag tot dag, omdat scp voor de meeste doeleinden de recursieve modus ondersteunt. - Tom H
Gebruik daarna om lege mappen op te ruimen (rsync zal ze niet verwijderen): serverfault.com/a/95935/58568 - bmaupin
Net toegevoegd smv() { rsync -az --remove-source-files "$@"; } naar mijn gereedschapskist. Dank je. - Rhys Ulerich
Wat als je geen rsync hebt? OpenWrt heeft bijvoorbeeld geen rsync en ik moet scp gebruiken om bestanden te verplaatsen. Wat nu te doen? - valentt


Gebruik rsync in plaats van scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Meer info met man rsync.


16
2018-02-26 20:18





Deze vraag is prima beantwoord en het antwoord is geaccepteerd, maar aangezien het naar de top van de voorpagina is gedirigeerd, dacht ik dat ik het op zijn minst beter zou proberen te beantwoorden, zij het minder elegant. Ja, u kunt de retourcode gebruiken van scpen ik doe het vaak. In bash:

scp foo user@server:/destination && rm foo

Ik neem uw punt over meerdere bestanden om te kopiëren en afhandelen van storingen in de stapel op de juiste manier, dus voor meerdere bestanden:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Dit laatste is alleen praktisch als je gebruikt ssh-agent, maar ik hoop van harte.


15
2018-04-18 14:23



Ik vind dat dit het antwoord had moeten zijn. Het beantwoordt de precies gestelde vraag. - Travis Griggs
Omdat SCP geen (AFAIK) bandbreedte-beperking aan kan, heb ik uw hanswer met rsync gebruikt om bestanden één voor één te verplaatsen naar een gedefinieerde bandbreedte. Bedankt ! - Moonchild
@Moonchild, scp kan zelfs bandbreedtelimieten hanteren met behulp van de -l vlag. bv -l 8192 om overdrachten te beperken tot 8192 kb / s - Spencer Doak


in mijn situatie is ssh poort geen 22, dus

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

werkt voor mij.


2
2017-09-24 05:47



Het is veel beter om aangepaste ssh-poortnummers in je ssh-configuratiebestand (~ / .ssh / config) te plaatsen dan ze voor elke opdracht op te geven. Het kan globaal, per-host of voor een reguliere expressie die overeenkomt met de hostnaam worden gespecificeerd. - sneak
Hoe individuele poorten zowel voor de bron als voor de bestemming in te stellen? - Brethlosze


als je een oudere doelserver hebt zoals ik, kun je die niet gebruiken

--remove-source-files

maar je moet gebruiken

--remove-sent-files --protocol=29

in plaats daarvan.


2
2018-01-23 17:23





Als het in twee stappen doen geen probleem is, kunt u gebruiken scp om het bestand van de externe server te kopiëren en vervolgens uit te voeren ssh -e "rm /path/to/file" om van schijf te verwijderen. Bij het verplaatsen van bestanden, met name tussen machines, kunnen er dingen misgaan, dus het kan goed zijn om de kopie en de verwijdering afzonderlijk uit te voeren en het bestand alleen te verwijderen als u zeker weet dat het eerst als eerste is gekopieerd.


2
2017-07-01 08:39