web-dev-qa-db-fra.com

Envoyer un mot de passe lors de l'utilisation de scp pour copier des fichiers d'un serveur à un autre

utiliser scp pour copier régulièrement des fichiers d'un serveur Unix vers un autre et effectuer certaines actions. pour le faire rapidement, je souhaite utiliser un script unix qui fait le scp et entre le mot de passe requis pour terminer le scp.

J'ai essayé la commande expect pour envoyer le mot de passe via la ligne de commande unix mais je n'ai pas réussi à le faire jusqu'à présent.

exemples de commandes

scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"

Je reçois ces erreurs:

couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]

est-ce que je manque quelque chose?

11
cherry2891

Passez juste avec sshpass -p "your password" au début de votre commande scp

sshpass -p "your password" scp ./abc.txt hostname/abc.txt
21
Akki

L'une des façons de contourner les problèmes de connexion avec ssh, scp et sftp (tous utilisent le même protocole et le serveur sshd) est de créer/paires de clés privées.

Certains serveurs peuvent interdire cela, mais la plupart des sites ne le font pas. Ces instructions concernent Unix/Linux/Mac. Comme toujours, Windows est un tout petit peu différent bien que l'environnement cygwin sous Windows suive ces étapes.

  • Sur votre ordinateur, créez votre clé publique/privée à l'aide de ssh-keygen. Cela peut varier d'un système à l'autre, mais le programme devrait vous guider à travers cela.
  • Quand ssh-keygen est terminé, vous aurez un $HOME/.ssh répertoire sur votre machine. Ce répertoire contiendra une clé publique et une clé privée. Il y aura deux autres fichiers qui seront générés au fur et à mesure. L'un est known_hosts qui contient les empreintes digitales de tous les hôtes connus auxquels vous vous êtes connecté. Le second sera appelé soit authorized_keys ou authorized_keys2 selon votre implémentation.
  • Si ce n'est déjà fait, connectez-vous à l'hôte distant et exécutez ssh-keygen ici aussi. Cela va générer un $HOME/.ssh répertoire et une paire de clés privée/publique. Ne faites pas cela si le $HOME/.ssh le répertoire existe déjà et possède un fichier de clé publique et privée. Vous ne voulez pas le régénérer.
  • Sur le serveur distant dans le $HOME/.ssh répertoire, créez un fichier appelé authorized_keys. Dans ce fichier, mettez votre clé publique. Cette clé publique se trouve sur votre $HOME/.ssh répertoire sur votre machine locale. Il se terminera par *.pub. Collez le contenu de cela dans authorized_keys. Si authorized_keys existe déjà, collez votre clé publique dans la ligne suivante.

Désormais, lorsque vous vous connectez à l'aide de ssh, ou que vous utilisez scp ou sftp, il ne vous sera pas demandé de saisir un mot de passe. Soit dit en passant, les ID utilisateur sur les deux machines n'ont pas à être d'accord. Je me suis connecté à de nombreux serveurs distants en tant qu'utilisateur différent et j'ai configuré ma clé publique dans authorized_keys et n'a aucun problème à se connecter directement à cet utilisateur.

Authentification par clé publique privée sous Windows

Si vous utilisez Windows, vous aurez besoin de quelque chose qui puisse faire ssh. La plupart des gens que je connais utilisent PuTTY qui peut générer des clés publiques/privées, et font couplage de clés lorsque vous vous connectez à distance. Je ne me souviens pas de toutes les étapes, mais vous générez deux fichiers (l'un contient la clé publique, l'autre contient la clé privée) et configurez PuTTY pour utiliser les deux lors de la connexion à un site distant. Si ce site distant est Linux/Unix/Mac, vous pouvez copier votre clé publique et la placer dans le authorized_keys fichier.

Si vous pouvez utiliser des clés SSH publiques/privées, vous pouvez éliminer le besoin de mots de passe dans vos scripts. Sinon, vous devrez utiliser quelque chose comme Expect ou Perl avec Net :: SSH qui peut regarder l'hôte distant et entrer le mot de passe lorsque vous y êtes invité.

6
David W.

Vous devriez utiliser une meilleure authentification avec des clés ouvertes. Dans ces cas, vous n'avez besoin d'aucun mot de passe et ne vous attendez pas.

Si vous le souhaitez avec expect, utilisez ce script (voir réponse Automatiser le transfert de fichiers scp à l'aide d'un script Shell ):

#!/usr/bin/expect -f

# connect via scp
    spawn scp "[email protected]:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
}
-re ".*sword.*" {
    exp_send "PASSWORD\r"
}
}
interact

Vous pouvez également utiliser pexpect (module python):

def doScp(user,password, Host, path, files):
 fNames = ' '.join(files)
 print fNames
 child = pexpect.spawn('scp %s %s@%s:%s' % (fNames, user, Host,path))
 print 'scp %s %s@%s:%s' % (fNames, user, Host,path)
    i = child.expect(['assword:', r"yes/no"], timeout=30)
    if i == 0:
        child.sendline(password)
    Elif i == 1:
        child.sendline("yes")
        child.expect("assword:", timeout=30)
        child.sendline(password)
    data = child.read()
    print data
    child.close()
4
Igor Chubin

// copie /tmp/abc.txt dans /tmp/abc.txt (chemin cible)

// le nom d'utilisateur et le mot de passe de 10.1.1.2 sont "nom d'utilisateur" et "mot de passe"

sshpass -p "password" scp /tmp/abc.txt [email protected]:/tmp/abc.txt

// installe sshpass (ubuntu)

Sudo apt-get install sshpass
2
KunMing Xie

Tout d'abord, comme l'a mentionné David, nous devons configurer une clé publique/privée.

Ensuite, l'utilisation de la commande ci-dessous avait fonctionné pour moi, cela ne m'a pas demandé de mot de passe car nous transmettons la clé privée dans la commande en utilisant l'option -i

scp -i path/to/private_key path/to/local/file remoteUserId@remoteHost:/path/to/remote/folder

Ici, path/to/private_key est un fichier de clé privée que nous avons généré lors de la configuration de la clé publique/privée.

2
Manjunath D R