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.

Argelbargel
la source
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).

Pat Notz
la source
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 [email protected]:/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 [email protected]:/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
KevinS
la source
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 "[email protected]"

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

mustafaturan
la source
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.

gWay
la source
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/
MBerg
la source
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.

Prabhjeet
la source
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;
}
Espo
la source
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"
Shen JI
la source
3

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

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/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 [email protected]:/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.

hi15
la source
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

Kevin Chui
la source
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 [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Production:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
JohnMudd
la source
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.

rjray
la source
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/

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

étapes pour obtenir sshpass Pour rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

source: https://community.mapr.com/thread/9040

Longue
la source
-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.

valk
la source
22
et comment fournissez-vous exactement votre mot de passe ici?
infografnet le