421 votes

Comment transmettre un mot de passe à scp?

Je sais que ce n'est pas recommandé, mais est-il possible de transmettre le mot de passe de l'utilisateur à scp?

J'aimerais copier un fichier via scp dans le cadre d'un travail en lot et le serveur de réception a bien sûr besoin d'un mot de passe et je ne peux pas facilement le remplacer par une authentification à base de clés.

2 votes

Voir aussi (plus tard) la question : stackoverflow.com/questions/1462284/… où une réponse mentionne une autre façon possible de le faire. (N.B. ce n'est pas une question en double - c'est l'original que les autres dupliquent.)

0 votes

0 votes

Au lieu de vous connecter via scp et de copier, vous pouvez d'abord configurer une connexion maître avec ssh, puis exécuter scp pour copier le fichier via la connexion maître, sans mot de passe. Voir unix.stackexchange.com/a/2869/17823

709voto

KevinS Points 619

Utilisez sshpass:

sshpass -p "mot de passe" scp -r utilisateur@example.com:/some/remote/path /some/local/path

ou pour que le mot de passe ne s'affiche pas dans l'historique bash

sshpass -f "/chemin/vers/fichier_mot_de_passe" scp -r utilisateur@example.com:/some/remote/path /some/local/path

Le code ci-dessus copie le contenu du chemin de l'hôte distant vers votre ordinateur local.

Installation :

  • ubuntu/debian
    • apt install sshpass
  • centos/fedora
    • yum install sshpass
  • mac avec macports
    • port install sshpass
  • mac avec brew
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

1 votes

Cela m'a récemment évité beaucoup de problèmes sur un projet, merci :)

20 votes

Sur Ubuntu 12.04, cela n'a fonctionné que pour moi avec des guillemets simples sur le mot de passe (par exemple, 'password' au lieu de "password").

7 votes

@odedfos, oui, vous devez utiliser des guillemets simples car certains caractères générés de mot de passe peuvent avoir une interprétation spéciale dans l'interpolation de chaîne entre guillemets doubles

64voto

mustafaturan Points 397

Just generate a ssh key like:

ssh-keygen -t rsa -C "your_email@youremail.com"

copy the content of ~/.ssh/id_rsa.pub and lastly add it to the remote machines ~/.ssh/authorized_keys

make sure remote machine have the permissions 0700 for ~./ssh folder and 0600 for ~/.ssh/authorized_keys

il suffit de générer une clé SSH comme suit :

ssh-keygen -t rsa -C "your_email@youremail.com"

copiez le contenu de ~/.ssh/id_rsa.pub et enfin ajoutez-le aux ~/.ssh/authorized_keys de la machine distante

assurez-vous que la machine distante dispose des autorisations 0700 pour le dossier ~./ssh et 0600 pour ~/.ssh/authorized_keys

65 votes

Comme je l'ai écrit: Non, je ne peux pas facilement passer à l'authentification basée sur une clé.

3 votes

Est-ce que vous voulez dire .authorized_keys plutôt que . authorization_keys?

2 votes

Un usage valide de ceci serait un script bash exécutant plusieurs appels scp/ssh vers un serveur où vous souhaitez demander à l'utilisateur le mot de passe pour le serveur distant. Le mot de passe ne s'affichera pas dans l'historique et vous avez toujours l'avantage de demander le mot de passe... mais une seule fois. Je ne veux pas utiliser un fichier clé car je souhaite toujours authentifier l'utilisateur du script.

59voto

user524607 Points 91

Si vous vous connectez au serveur à partir de Windows, la version Putty de scp ("pscp") vous permet de passer le mot de passe avec le paramètre -pw.

Cela est mentionné dans la documentation ici.

1 votes

Montrer un exemple, s'il vous plaît.

0 votes

De plus, vous pouvez ajouter C:\Program Files (x86)\PuTTY à votre chemin d'accès pour utiliser ces commandes.

4 votes

@SDsolar Voici un exemple de syntaxe : pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest (Je déteste utiliser Putty de cette façon, mais cela fonctionne)

42voto

Pat Notz Points 46841

Vous pouvez le scripter avec un outil tel que expect (il existe également des liaisons pratiques, comme Pexpect pour Python).

1 votes

Le lien vers expect.nist.gov est brisé. Peut-être ceci?: expect.sourceforge.net

1 votes

Sudo apt-get install expect

2 votes

>> info brasserie sshpass Erreur : Aucune formule disponible avec le nom "sshpass" Nous ne rajouterons pas sshpass car cela rend trop facile aux utilisateurs novices de SSH de compromettre la sécurité de SSH. ;)

9voto

Espo Points 24318

Voici un exemple de comment le faire avec l'outil expect:

sub copier {
    $scp = Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}/$file");
    $scp->expect(30,"ssword: ") || die "Jamais reçu de demande de mot de passe de $dest:$!\n";
    print $scp 'motdepasse' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Jamais reçu de prompt du système parent :$!\n";
    $scp->soft_close();
    return;
}

3 votes

Ceci est en perl, désolé je n'ai pas écrit ça. (Il y a 5 ans :) )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X