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?
Passez juste avec sshpass -p "your password"
au début de votre commande scp
sshpass -p "your password" scp ./abc.txt hostname/abc.txt
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.
ssh-keygen
. Cela peut varier d'un système à l'autre, mais le programme devrait vous guider à travers cela.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.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.$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.
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é.
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()
// 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
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.