È possibile utilizzare i comandi Unix per cp un file nella mia sottodirectory in un computer remoto tramite SSH?


17

Ho una serie di file software scaricati nella mia sottodirectory ~/Downloadssul mio personal computer. Sto anche usando bash per connettermi in remoto a un computer utilizzando ssh.

È possibile trasferire questo file sshsul computer remoto?


La domanda si riferisce a un singolo file ( this file) e più file ( a series of software files), la soluzione migliore dipende dal fatto che tu abbia un singolo file o più file.
user2768

Risposte:


42

Si consiglia di utilizzare scpper questo scopo. È un mezzo sicuro per trasferire file usando il protocollo SSH.

Ad esempio, per copiare un file chiamato yourfile.txtda ~/Downloadsun computer remoto, utilizzare:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

Puoi vedere altri esempi qui .


5
Penso che rsyncpossa funzionare anche adesso, ora che ci penso
ShanZhengYang il

1
rsync è troppo complesso per solo una o una mano piena di file ...
Paebbels

14
@Paebbels Al contrario, sostituisci scpsopra con rsynce dovrebbe funzionare bene.
8

Tendo a usarlo rsyncper tutto, anche per i singoli file, perché "funziona" nei casi semplici e può essere molto più efficiente in altri casi. Se si utilizza uno scpo rsyncsu tutto quanto non già compressi e / o cifrati, ricordarsi di attivare l'opzione di compressione su ( -Cper scp, -zo --compressper rsync). In effetti lo accendo per abitudine - è molto raro trovare una circostanza in cui rallenta le cose (forse se stai usando un dispositivo lento a bassa potenza con potenza CPI limitata come un rPi).
David Spillett,

37

Sebbene scpsia chiaramente lo strumento giusto per questo, se per qualche motivo non puoi usarlo puoi fare qualcosa come il seguente dal tuo computer locale per copiare, diciamo, una struttura di directory sul computer remoto:

tar -c . | ssh <remote> tar -x

Questa sarà tarla directory corrente sul computer locale e scriverà quella tara stdoutcui verrà quindi reindirizzato a un sshcomando in cui eseguirà un comando remoto per decomprimere il file da cui leggestdin

Modificato per riflettere il commento di Dietrich Epp -f -sull'essere il default sia in termini di creazione che di estrazione, quindi non necessario specificarlo esplicitamente.


7
Probabilmente vorrai aggiungere un -C basedirargomento per tarestrarre altrove dalla tua home directory se lo stai facendo.
Dougal,

17

Se vuoi farlo in più di una rara occasione, suggerirei di montare il filesystem remoto con sshfsse stai usando un Unix-like che supporta FUSE (Linux, * BSD, Mac OS X). Crea una directory sotto la tua home directory, per esempio, chiamata ~ / remote-server:

    $ mkdir ~/remote-server

Quindi montare il filesystem remoto con sshfs. Sostituisci "yourserver.com" con il nome host del tuo computer remoto e "nome della directory remota" con la directory che stai utilizzando sul sistema remoto.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

Una volta fatto, la directory remota fa parte del tuo filesystem e puoi usare tutti i tuoi normali strumenti su di esso, tra cui cp:

    $ cp ~/Downloads/your-files ~/remote-server

Se non hai già sshfsinstallato, dovresti essere in grado di installarlo sul tuo computer usando il tuo gestore pacchetti (cerca i pacchetti denominati sshfso fuse-sshfs). Per ulteriori informazioni, puoi leggere un tutorial online .

Questo, a proposito, è il mio modo preferito di gestire i file su server remoti. Di solito mantengo un server di produzione e due server di sviluppo montati in questo modo e utilizzo il mio normale flusso di lavoro di esplorazione dei file.


E poi controlla quali opzioni sshfs ti aiuteranno a fare il tuo lavoro al meglio. Ad esempio a partire dalla mappatura dell'ID utente / gruppo -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_othere -Cper la compressione se la banda è scarsa. Non appena funziona bene, aggiungo personalmente gli alias per i comandi per montare rapidamente i filesystem distanti su ssh. @Benjamin_Staton Non userei sudo o root qui, non senza una corretta mappatura utente / gruppo.
tuk0z,

9

La prima volta, non c'è alcuna differenza reale tra scp(copia su ssh) e rsync.

Le esecuzioni successive trarranno vantaggio dal fatto che rsync non copierà i file già esistenti.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a per tutti i file
  • -v per prolisso
  • -H per "basta capire i collegamenti simbolici e fare la cosa giusta"
  • quindi i percorsi di origine e destinazione. È possibile utilizzare i caratteri jolly nell'origine o semplicemente sincronizzare l'intera directory.

Altre bandiere utili includono:

  • --delete per eliminare i file nella destinazione che non esistono più sull'origine.
  • --dry-run per i test - molto utile se combinato con --delete.

Questo userà le sshchiavi anche per fare un login senza password, se le hai impostate.

Alla fine della corsa, rsyncti dirò quante volte è stato più veloce eseguire di nuovo la copia normale.


1
-Hè in realtà per i collegamenti reali, interrompe l'invio dello stesso contenuto due o più volte quando è collegato in più di un posto nella struttura della directory di origine (ma può rendere il processo meno efficiente per le strutture di directory di grandi dimensioni). non ha alcun effetto sui collegamenti simbolici, ma alcune delle opzioni incluse in -a/ --archiveinfluenzano il modo in cui i collegamenti simbolici vengono elaborati.
David Spillett,

4

Aggiungere alle risposte sopra. A volte non sono esattamente sicuro del percorso remoto. In questi casi, utilizzo sftpprima per spostarmi nella posizione richiesta, quindi utilizzo get o put per scaricare o caricare un file.

Se vuoi anche mantenere qualcosa di sempre sincronizzato e vuoi persino eseguire localmente alcuni file che si trovano sul computer remoto, sshfsfunziona benissimo.


-1

Sto facendo qualcosa di molto simile con ssh. Ho creato uno strumento di generazione personalizzato per Visual Studio e fondamentalmente sto eseguendo VS un comando ssh che copia il mio codice su un computer di destinazione e quindi lo compila su quel computer di destinazione.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand'

Si noti l'uso di virgolette singole e punti e virgola. Il primo incapsula i comandi su hostB tramite ssh e il secondo consente di eseguire più comandi di sistema hostB in un comando ssh da hostA.

Per far funzionare tutto ciò, è necessario impostare le chiavi ssh sulla macchina di avvio in modo da poter essere userA @ hostA e accedere a hostB come userB. Il processo per la creazione di una chiave ssh pubblica per userA @ hostA è ben documentato. Se non crei una chiave pubblica su hostA per userA e copi quella chiave su hostB come userB, allora sarai costretto a inserire la password ogni volta, il che rovina la gioia dell'automazione.


Qualcuno che ha effettuato il downgrade ha lasciato un commento sul perché ha effettuato il downgrade? I voti negativi sono insignificanti senza feedback informativo. Grazie. Ho affrontato la domanda specifica del PO con una risposta direttamente correlata. Non sto introducendo nuove tecnologie o suggerendo percorsi alternativi. Perché? forse OP non vuole usare percorsi alternativi.
Andrew,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.