Est-il possible d'utiliser des commandes Unix pour cp un fichier dans mon sous-répertoire dans un ordinateur distant via SSH?

17

J'ai une série de fichiers logiciels téléchargés dans mon sous-répertoire ~/Downloadssur mon ordinateur personnel. J'utilise également bash pour me connecter à distance à un ordinateur en utilisant ssh.

Est-il possible de transférer ce fichier via sshsur l'ordinateur distant?

ShanZhengYang
la source
La question se réfère à un fichier unique ( this file) et à plusieurs fichiers ( a series of software files), la meilleure solution dépend de si vous avez un seul fichier ou plusieurs fichiers.
user2768

Réponses:

42

Vous voudrez peut-être utiliser scpà cette fin. Il s'agit d'un moyen sécurisé pour transférer des fichiers à l'aide du protocole SSH.

Par exemple, pour copier un fichier nommé yourfile.txtde ~/Downloadsvers un ordinateur distant, utilisez:

scp ~/Downloads/yourfile.txt [email protected]:/some/remote/directory

Vous pouvez voir plus d'exemples ici .

ARG
la source
5
Je pense que cela rsyncpeut fonctionner aussi bien, maintenant que j'y pense
ShanZhengYang
1
rsync est loin d'être complexe pour un seul ou une main pleine de fichiers ...
Paebbels
14
@Paebbels Au contraire, remplacez scpci-dessus par rsyncet cela devrait très bien fonctionner.
8bittree
J'ai tendance à utiliser rsyncpour tout, même les fichiers simples, car cela "fonctionne" dans les cas simples et peut être beaucoup plus efficace dans d'autres cas. Si vous utilisez soit scpou rsyncsur quoi que ce soit pas déjà comprimé et / ou crypté, pensez à activer l'option de compression ( -Cpour scp, -zou --compresspour rsync). En fait, je l'allume par habitude - il est très rare que vous trouviez une circonstance où cela ralentit les choses (peut-être si vous utilisez un appareil lent à faible puissance avec une puissance CPI limitée comme un rPi).
David Spillett
37

Bien que ce scpsoit clairement le bon outil pour cela, si pour une raison quelconque vous ne pouvez pas l'utiliser, vous pouvez faire quelque chose comme ce qui suit à partir de votre machine locale pour copier, disons, une structure de répertoire sur la machine distante:

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

Ce sera tarle répertoire en cours sur la machine locale, et écrire ce tarvers stdoutlequel sera ensuite redirigé vers une sshcommande où il exécutera une commande à distance pour décompresser le fichier à partir duquel il litstdin

Modifié pour refléter le commentaire de Dietrich Epp sur -f -la valeur par défaut à la fois à la fin de la création et de l'extraction, il n'est donc pas nécessaire de le spécifier explicitement.

Eric Renouf
la source
7
Vous voudrez probablement ajouter un -C basedirargument pour tarextraire ailleurs que votre répertoire personnel si vous faites cela.
Dougal
17

Si vous voulez faire cela plus que rarement, je vous suggère de monter le système de fichiers distant sshfssi vous utilisez un type Unix qui prend en charge FUSE (Linux, * BSD, Mac OS X). Créez un répertoire sous votre répertoire personnel, par exemple, appelé ~ / remote-server:

    $ mkdir ~/remote-server

Montez ensuite le système de fichiers distant avec sshfs. Remplacez "yourserver.com" par le nom d'hôte de votre machine distante et "nom du répertoire distant" par le répertoire que vous utilisez sur le système distant.

    $ sudo sshfs [email protected]:/name/of/remote/directory ~/remote-server/

Une fois cela fait, le répertoire distant fait partie de votre système de fichiers et vous pouvez utiliser tous vos outils normaux dessus, y compris cp:

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

Si vous ne l'avez pas déjà sshfsinstallé, vous devriez pouvoir l'installer sur votre ordinateur en utilisant votre gestionnaire de paquets (recherchez les paquets nommés sshfsou fuse-sshfs). Pour plus d'informations, vous pouvez lire un tutoriel en ligne .

C'est d'ailleurs ma façon préférée de gérer les fichiers sur des serveurs distants. Je garde normalement un serveur de production et deux serveurs de développement montés de cette manière et j'utilise mon flux de travail de navigation de fichiers normal avec eux.

Benjamin Staton
la source
Ensuite, vérifiez quelles options sshfs vous aideront à faire votre travail au mieux. Par exemple, en commençant par le mappage des ID utilisateur / groupe -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otheret -Cpour la compression en cas de faible bande passante. Dès que cela fonctionne bien, j'ajoute personnellement des alias pour les commandes pour monter rapidement les systèmes de fichiers distants sur ssh. @Benjamin_Staton Je n'utiliserais pas sudo ou root ici, pas sans un mappage utilisateur / groupe approprié au moins.
tuk0z
9

La première fois, il n'y a pas de réelle différence entre scp(copier ssh) et rsync.

Les exécutions suivantes bénéficieront du fait que rsync ne copiera pas les fichiers qui existent déjà.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a pour tous les fichiers
  • -v pour verbeux
  • -H pour "juste trouver des liens symboliques et faire la bonne chose"
  • puis les chemins source et de destination. Vous pouvez utiliser des caractères génériques dans la source ou simplement synchroniser l'ensemble du répertoire.

D'autres indicateurs utiles incluent:

  • --delete pour supprimer les fichiers de la destination qui n'existent plus sur la source.
  • --dry-run pour les tests - très pratique lorsqu'il est combiné avec --delete.

Cela utilisera également des sshclés pour effectuer une connexion sans mot de passe, si vous les avez configurés.

À la fin de la course, rsyncvous dira combien de fois plus rapide était de refaire la copie en clair.

Criggie
la source
1
-Hest en fait pour les liens durs, il empêche le même contenu d'être envoyé deux fois ou plus lorsqu'il est lié à plusieurs endroits dans la structure de répertoires source (mais peut rendre le processus moins efficace pour les grandes structures de répertoires). cela n'a aucun effet sur les liens symboliques, mais certaines des options incluses par -a/ --archiveaffectent le traitement des liens symboliques.
David Spillett
4

Pour ajouter aux réponses ci-dessus. Parfois, je ne suis pas exactement sûr du chemin distant. Dans ces cas, j'utilise sftpd'abord pour naviguer jusqu'à l'emplacement requis, puis j'utilise get ou put pour télécharger ou télécharger un fichier.

Si vous souhaitez également garder quelque chose toujours synchronisé et même exécuter localement un fichier situé sur une machine distante, cela sshfsfonctionne très bien.

aragaer
la source
-1

Je fais quelque chose de très similaire avec ssh. J'ai créé un outil de génération personnalisé pour Visual Studio et j'ai essentiellement VS exécuter une commande ssh qui copie mon code sur un ordinateur cible, puis le compile sur cet ordinateur cible.

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

Notez l'utilisation de guillemets simples et de points-virgules. Le premier encapsule vos commandes vers hostB via ssh et le second vous permet d'exécuter plusieurs commandes système hostB dans une seule commande ssh depuis hostA.

Pour que cela fonctionne, vous devrez configurer des clés ssh sur votre machine de démarrage afin que vous puissiez être userA @ hostA et vous connecter à hostB en tant qu'utilisateurB. Le processus de création d'une clé ssh publique pour userA @ hostA est bien documenté. Si vous ne créez pas de clé publique sur hostA pour userA et copiez cette clé dans hostB en tant qu'utilisateurB, vous serez alors obligé de saisir votre mot de passe à chaque fois - ce qui ruine le plaisir de l'automatisation.

Andrew
la source
Est-ce que quelqu'un qui a downvoté peut laisser un commentaire expliquant pourquoi il a downvoté? Les votes négatifs n'ont aucun sens sans rétroaction informative. Merci. J'ai répondu à la question précise du PO avec une réponse qui se rapporte directement. Je n'introduis pas de nouvelles technologies ni ne suggère d'autres itinéraires. Pourquoi? peut-être que OP ne veut pas utiliser d'autres routes.
Andrew