Comment puis-je copier plusieurs fichiers sur scp en une seule commande?

20

Je dois transporter beaucoup de fichiers d'un PC à un autre (les deux Linux). Je voudrais l'utiliser scppour cela, mais scpne permet que le transfert d'un fichier à la fois.

Comment puis-je faire ceci?

j'ai

  • Aucune possibilité d'utiliser rsync ou tout autre protocole
  • Pas de possibilité d'utiliser des certificats sans phrase de passe (mais avoir un certificat avec une phrase de passe)
  • Une liste de fichiers à transférer et une liste avec le chemin de destination des fichiers sur l'autre serveur
  • Les fichiers sont répartis sur de nombreux répertoires, et pas tous les fichiers dans les répertoires que je veux copier

Si possible, je voudrais compresser et décompresser de manière transparente pour économiser la bande passante!

Est-ce possible?

Peter Smit
la source

Réponses:

31

Utilisation tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
akira
la source
2
Voici le format du fichier: "En mode c, tar lira les noms à archiver à partir du nom de fichier. Le nom spécial -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''."
Kousha
14

Je voudrais utiliser scp pour cela, mais scp ne permet de transférer qu'un fichier à la fois.

Je suis presque sûr que ce n'est pas vrai, du moins pas pour la scpcommande fournie par OpenSSH incluse avec la plupart des distributions Linux.

J'utilise scp file1 file2 ... fileN user@host:/destination/directory/assez fréquemment.

Pour une compression transparente, le protocole SSH a cela intégré et scppeut l'utiliser si vous fournissez l' -Coption sur la ligne de commande. Pour de nombreux petits fichiers similaires, vous trouverez que l'option tar + gz suggérée par akira gagne une meilleure compression car elle peut utiliser la similitude entre ces fichiers où scpchaque fichier est compressé en tant qu'entité distincte. Je préfère généralement utiliser scp car il est plus facile de reprendre un transfert partiel (ou, bien que je sache que dans cette situation le questionneur n'a pas l'option) rsynccar c'est à la fois encore plus facile à reprendre et partage l'ensemble de l'option tar + gz -avantage de compression de flux.

David Spillett
la source
C'est la bonne réponse, mais elle ne transfère vraiment qu'un seul fichier à la fois. Néanmoins, il utilisera pleinement la bande passante disponible et devrait fonctionner aussi vite que possible.
Benjamin Bannier
4

Ça ne scp -r yourdir otherhost:/otherdirmarche pas ?

Essayez ceci ensuite:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

le z-flag to tar fait la compression. Ou vous pouvez utiliser -C pour ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
Jimmy Hedman
la source
qu'est-ce que ça -Cfait?
Nathan Fellman
1
Le problème est que j'ai une liste de fichiers. Les fichiers sont répartis sur de nombreux répertoires, et pas tous les fichiers dans les répertoires que je veux copier
Peter Smit
2
@Nathan: -C est de laisser ssh faire la compression.
Jimmy Hedman
1

Sur RHEL5, voici le seul moyen que je connaisse pour sécuriser la copie d'une liste de fichiers contenant des caractères spéciaux (comme un espace). Créez un script shell et incluez les éléments suivants:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
Brian Thomas
la source
0

Cela peut être fait sans trop de problèmes.

Je crée simplement une liste de fichiers avec le nom d'hôte à côté de chaque fichier et scp semble bien l'analyser. c'est à dire.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp semble bien fonctionner avec cette syntaxe. Comme je l'ai essayé sans le nom d'hôte à côté de chaque fichier, il a échoué après le premier fichier. Il semble que je me souvienne d'une autre syntaxe que j'ai utilisée pour cela auparavant et je la publierai une fois que je la trouverai.

Ernie M.
la source
Cela fonctionne, mais est assez lent - il semble démarrer une connexion pour chaque fichier ... (je suis venu ici à la recherche d'une solution pour la copie lente ...) ~/peut généralement être laissé de côté - SCP fonctionne par rapport au répertoire personnel. .. Si vous avez une liste ailleurs dans $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Cela cassera pour les noms de fichiers avec des espaces)
Gert van den Berg
-1

Je recommanderais aux pièces d'utiliser une commande comme celle-ci pour créer une archive à partir de votre liste de fichiers

tar -cvf allfiles.tar -L mylist.txt

Utilisez ensuite scp pour télécharger l'archive.

utilisateur scp @ remotehost: ~ / allfiles.tar

/programming/8033857/tar-archiving-that-takes-input-from-a-list-of-files

Justin Kubicek
la source