Comment passer le mot de passe à scp?


297

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

Je voudrais copier un fichier via scp dans le cadre d'un travail par lots et le serveur de réception a bien sûr besoin d'un mot de passe et, non, je ne peux pas facilement changer cela en authentification basée sur les clés.


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

Réponses:


35

Vous pouvez l'écrire avec un outil comme expect (il existe également des liaisons pratiques, comme Pexpect pour Python).


1
Le lien vers expect.nist.gov est rompu. Peut-être que cela?: Expect.sourceforge.net
Katapofatico

sudo apt-get install expect
SDsolar

>> brew info sshpass Erreur: Aucune formule disponible avec le nom "sshpass" Nous n'ajouterons pas sshpass car il est trop facile pour les utilisateurs novices de SSH de ruiner la sécurité de SSH. ;)
Lukas NP Egger

528

Utilisez sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

ou alors le mot de passe n'apparaît pas dans l'historique de bash

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Ce qui précède copie le contenu du chemin de l'hôte distant vers votre local.

Installer:

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

14
Sur Ubuntu 12.04, cela ne fonctionnait que pour moi avec des guillemets simples sur le mot de passe (par exemple «mot de passe» au lieu de «mot de passe»).
odedfos

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

7
Voici comment installer sshpassapt-get install sshpass
Jan-Terje Sørensen

6
Sur CentOS c'estyum -y install sshpass
jgritty

19
La façon la plus sûre de le faire est d'utiliser un fichier de mot de passe , comme celui-ci: sshpass -f listes passwdfile` scp [...] . This way, the password won't show up in ps`, etc. et vous pouvez protéger le mot de passe avec des autorisations de fichier.
Christopher Schultz

50

il suffit de générer une clé ssh comme:

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

copier le contenu de ~/.ssh/id_rsa.pub et enfin l'ajouter aux machines distantes~/.ssh/authorized_keys

assurez-vous que la machine distante dispose des autorisations 0700 for ~./ssh folderet0600 for ~/.ssh/authorized_keys


35
Comme je l'ai écrit: Non, je ne peux pas facilement passer à l'authentification par clé.
Argelbargel

3
Voulez-vous dire .authorized_keys plutôt que. clés_autorisation?
HelloWorld

2
Une utilisation valide pour cela serait un script bash qui effectue plusieurs appels scp / ssh vers un serveur sur lequel vous souhaitez demander à l'utilisateur le mot de passe du serveur distant. Le mot de passe n'apparaîtra alors pas dans l'historique et vous avez toujours la possibilité de contester le mot de passe ... mais une seule fois. Je ne veux pas utiliser de fichier de clé car je veux toujours authentifier l'utilisateur du script.
Wes Grant

2
Une autre utilisation valide serait si vous ne pouvez pas facilement activer l'authentification par clé sur la cible. Exemple: l'un des principaux producteurs de NAS - Synology avec leur DSM 6.0 - ne le prend pas en charge même en 2016. Bien sûr, vous pourriez jouer avec les fichiers de configuration et espérer qu'une mise à jour ne le remplacera pas simplement (la mise à jour fréquente de DSM annule les modifications personnalisées) ). Parfois - en particulier lorsque l'OP écrit expressément qu'ils savent déjà que ce n'est pas optimal - les gens ont juste besoin d'une solution.
Aaa

3
Vous devez utiliser ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>pour copier la clé sur le serveur distant
RousseauAlexandre

39

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

Ceci est mentionné dans la documentation ici.


1
Montrez un exemple, s'il vous plaît.
SDsolar

Vous pouvez également vouloir ajouter C: \ Program Files (x86) \ PuTTY à votre chemin pour utiliser ces commandes.
SDsolar

1
@SDsolar voici un exemple de syntaxe: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(je déteste utiliser du mastic comme ça, mais ça marche)
geneorama

29

curl peut être utilisé comme alternative à scp pour copier un fichier et il prend en charge un mot de passe sur la ligne de commande.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

Il est plus lent que «scp» mais il fait très bien l'affaire.
Victor

J'ai trouvé cela plus rapide lorsque la destination est configurée avec un énorme délai d'invite de mot de passe. scpdoit attendre 30+ secondes pour me laisser entrer un mot de passe, mais a curlfonctionné immédiatement.
Ghost8472

@ Ghost8472 configuré oui, mais parfois ce délai résout le nom d'hôte, et se produit également pour sftp.
mckenzm

1
J'ai "curl: (1) le protocole" sftp "n'est pas pris en charge ou désactivé dans libcurl"
kronuus

21

Vous pouvez utiliser le script 'expect' sur unix / terminal

Par exemple, créez 'test.exp':

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

exécuter le script

expect test.exp 

J'espère que ça aide.


7
Prérequis: sudo apt-get install expect
SDsolar

10

Voici un exemple de la façon dont vous le faites avec l' expectoutil:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
C'est en perl, désolé de ne pas l'avoir écrit. (Il y a 5 ans :))
Espo


3

Vous pouvez utiliser ssh-copy-idpour ajouter la clé ssh:

$which ssh-copy-id #check whether it exists

S'il existe:

ssh-copy-id  "user@remote-system"

3

Une fois que vous avez configuré ssh-keygencomme expliqué ci-dessus, vous pouvez faire

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Si vous voulez réduire la frappe à chaque fois, vous pouvez modifier votre .bash_profilefichier et mettre

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Ensuite, depuis votre terminal, faites source ~/.bash_profile. Ensuite, si vous tapez remote_scpvotre terminal, il devrait exécuter la scpcommande sans mot de passe.


2
  1. assurez-vous de disposer de l'outil "attendre" avant, sinon, faites-le

    # apt-get install expect

  2. créer un fichier de script avec le contenu suivant. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. exécuter le fichier de script avec l'outil "expect"

    # expect /root/scriptfile


1

Voici un pauvre homme de Linux / Python / Attendez -vous comme par exemple basé sur ce blog: Mise à niveau coquilles simples à TTY entièrement interactifs . J'en avais besoin pour les anciennes machines où je ne peux pas installer Expect ou ajouter des modules à Python.

Code:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Production:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Une alternative serait d'ajouter la moitié publique de la clé de l'utilisateur au fichier de clés autorisées sur le système cible. Sur le système à partir duquel vous lancez le transfert, vous pouvez exécuter un démon ssh-agent et ajouter la moitié privée de la clé à l'agent. Le travail par lots peut ensuite être configuré pour utiliser l'agent pour obtenir la clé privée, plutôt que de demander le mot de passe de la clé.

Cela devrait être possible sur un système UNIX / Linux ou sur une plate-forme Windows en utilisant pageant et pscp.


4
La question disait qu'il ne pouvait pas utiliser l'authentification par clé.
Barmar du

2
De plus, si c'était moi, je suppose que je ne peux pas modifier l'autre serveur - tout ce que je veux, c'est copier un fichier.
SDsolar

-1

Toutes les solutions mentionnées ci-dessus ne peuvent fonctionner que si vous avez installé l'application ou si vous devez avoir les droits d'administrateur pour installer except ou sshpass.

J'ai trouvé ce lien très utile pour démarrer simplement le scp en arrière-plan.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
Comment exécuter le scp en arrière-plan entrerait-il le mot de passe ??
thomas.han


-9

J'ai trouvé cette réponse vraiment utile ici .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Non seulement vous pouvez y passer le mot de passe, mais il affichera également la barre de progression lors de la copie. Vraiment génial.


22
et comment fournissez-vous exactement votre mot de passe ici?
infografnet le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.