Commande SCP avec le fichier et les répertoires sélectionnés pour le téléchargement, demandez le mot de passe pour chaque nouveau fichier ou répertoire

9

Sur mon système Fedora 20, j'utilise beaucoup scp, et c'est la deuxième fois que je rencontre cela, lorsque j'exécute cette commande:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

il me demande le mot de passe pour chaque fichier / répertoire qu'il transfère.

user@host's password: "password here"

Question:

Que se passe-t-il ici?

Est-ce normal, je pense que c'est un comportement très particulier?

quelque chose quelque chose
la source

Réponses:

13

Votre shell local (probablement bash) se développe

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

dans:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

Au lieu de cela, vous pouvez faire:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

ou, si vous savez que le shell de connexion de l'utilisateur à l'extrémité distante est bash, vous pouvez également utiliser l'extension d'accolade:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

pour que le shell distant divise la chaîne en arguments au lieu du shell local.

geirha
la source
5

Oui, c'est normal. Ce qui se passe, c'est que votre shell développe les accolades avant d'exécuter la commande, donc ce que vous exécutez réellement est

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Fondamentalement, scpvoit plusieurs demandes de connexion ouvre donc une nouvelle connexion pour chacun d'eux. Une manièreLa manière la plus simple(utiliser des guillemets comme suggéré par @geirha est plus simple pour une opération ponctuelle) pour résoudre ce problème, il faut configurer sans mot de passe ssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Après avoir exécuté ces deux commandes une fois (et répondu aux invites si nécessaire), vous pourrez ssh/ scpsans utiliser de mot de passe pour toutes les futures connexions ssh. C'est i) en fait plus sûr et ii) beaucoup plus pratique.

terdon
la source
+1, façon agréable (bien sûr, ssh-keygen & ssh-copy-id ne doit être créé qu'une seule fois). Je dirais que c'est plus sécurisé ... seulement si vous vous assurez que la partie privée est "inaccessible" par quiconque sauf cet utilisateur ... Ce qui n'est pas toujours facile.
Olivier Dulac
@OlivierDulac que voulez-vous dire? Le id.rsaaura des 600autorisations par défaut et sshne fonctionnera même pas s'il ne le fait pas. Cela signifie qu'il est à l'abri de tout le monde mais rootque rien n'est vraiment à l'abri root, certainement pas les mots de passe.
terdon
Je voulais juste ajouter ce commentaire, afin que les personnes qui configurent un accès sans mot de passe prennent en compte (et grok) le fait que la clé privée doit être dans un environnement sûr et illisible / non partagé / etc. (c'est-à-dire, c'est une manière douce de le souligner, car ceux qui demandent ne savent peut-être pas toutes les implications que pourrait avoir le partage / la permission d'accéder à la clé privée)
Olivier Dulac
@OlivierDulac ah, assez juste. Je ne pensais pas que cela valait la peine d'être mentionné car 1) cela se produit automatiquement lors de l'utilisation ssh-keygenet 2) ssh / scp se plaindra et demandera un mot de passe si le fichier est lisible par quelqu'un d'autre. Au moins sous Linux de toute façon.
terdon
4

scp n'est pas très intelligent: lorsqu'il reçoit plusieurs arguments de ligne de commande qui sont des fichiers du même hôte distant, il ouvre une nouvelle connexion pour chaque argument.

Vous pouvez utiliser à la rsyncplace de scp, c'est plus intelligent de cette façon (et d'autres manières).

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Une autre approche consiste à passer un seul argument à scpcelui qui décrit plusieurs fichiers .

Une approche différente consiste à configurer votre système afin que vous n'ayez pas à vous authentifier tout le temps. De préférence, configurez l'authentification par clé , qui est dans la plupart des scénarios à la fois plus pratique et plus sécurisée. Vous pouvez également, ou en plus, configurer le partage de connexion , de sorte que vous ne devez vous authentifier qu'une seule fois par session. Dans tous les cas, configurez un alias pour ne pas avoir à spécifier le nom d'utilisateur et le port à chaque fois. Dans votre ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Exécutez ssh -Nf nickpour ouvrir une connexion, puis toutes les connexions suivantes nickseront superposées à la connexion existante. Maintenant, vous pouvez simplement exécuter

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Gilles 'SO- arrête d'être méchant'
la source