Comment transmettre le mot de passe à scp ?
-
09-06-2019 - |
Question
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 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 le changer en authentification par clé.
La solution
Vous pouvez le scripter avec un outil comme attendre (il existe aussi des liaisons pratiques, comme Attendez-vous pour Python).
Autres conseils
Utiliser 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 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 hôte local.
Installer :
- Ubuntu/Debian
apt install sshpass
- centos/fedora
yum install sshpass
- mac avec macports
port install sshpass
- mac avec infusion
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
générez simplement une clé ssh comme :
ssh-keygen -t rsa -C "your_email@youremail.com"
copier le contenu de ~/.ssh/id_rsa.pub
et enfin ajoutez-le aux machines distantes ~/.ssh/authorized_keys
assurez-vous que la machine distante dispose des autorisations 0700 for ~./ssh folder
et 0600 for ~/.ssh/authorized_keys
Si vous vous connectez au serveur depuis Windows, la version Putty de scp ("pscp") vous permet de transmettre le mot de passe avec le -pw
paramètre.
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 cela aide.
curl peut être utilisé comme alternative à scp pour copier un fichier et prend en charge un mot de passe sur la ligne de commande.
curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
Voici un exemple de la façon dont vous procédez avec expect
outil:
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;
}
Personne n'en a parlé, mais Mastic scp (pscp) a une option -pw pour le mot de passe.
La documentation peut être trouvée ici : https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp
assurez-vous d'avoir l'outil "attendre" avant, sinon, faites-le
# apt-get install expect
créez 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
exécuter le fichier de script avec l'outil "expect"
# expect /root/scriptfile
Une fois que vous avez configuré ssh-keygen
comme expliqué ci-dessus, vous pouvez faire
scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/
Si vous souhaitez réduire la saisie à chaque fois, vous pouvez modifier votre .bash_profile
fichier et mettre
alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/
Puis depuis votre terminal faites source ~/.bash_profile
.Ensuite si vous tapez remote_scp
dans votre terminal, il devrait exécuter le scp
commande sans mot de passe.
Vous pouvez utiliser ssh-copy-id
pour ajouter une clé ssh :
$which ssh-copy-id #check whether it exists
Si existe :
ssh-copy-id "user@remote-system"
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 réalisable sur un système UNIX/Linux ou sur une plate-forme Windows en utilisant pageant et pscp.
é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
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 transmettre le mot de passe, mais cela affichera également la barre de progression lors de la copie.Vraiment génial.