J'utilise Mac OS X 10.9.4, voici mon script pour copier des fichiers de la machine locale vers un hôte différent
#!/bin/bash
#!/usr/bin/expect
echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
spawn scp filePath uname@host1:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "2" ]
then
spawn scp filePath uname@host2:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "3" ]
then
spawn scp filePath uname@host3:/usr/tmp
expect "password"
send "MyPassword\r"
interact
else
echo "Wrong input"
fi
lors de l'exécution de ce script, je suis en train de suivre
./rcopy.sh: line 21: spawn: command not found
couldn't read file "password": no such file or directory
./rcopy.sh: line 23: send: command not found
./rcopy.sh: line 24: interact: command not found
bash
shell-script
expect
dev2d
la source
la source
Réponses:
Votre script tente de combiner deux interprètes. Vous avez les deux
#!/bin/bash
et#!/usr/bin/expect
. Ça ne marchera pas. Vous ne pouvez utiliser que l'un des deux. Depuis labash
première fois, votre script est exécuté en tant que script bash.Cependant, dans votre script, vous avez des
expect
commandes telles quespawn
etsend
. Étant donné que le script est lu parbash
et non parexpect
, cela échoue. Vous pouvez contourner cela en écrivant différentsexpect
scripts et en les appelant à partir de votrebash
script ou en traduisant le tout enexpect
.La meilleure façon cependant, et qui évite l'horrible pratique d'avoir vos mots de passe en texte brut dans un simple fichier texte, est de configurer à la place ssh sans mot de passe. De cette façon, vous
scp
n'aurez pas besoin d'un mot de passe et vous n'avez pas besoin deexpect
:Créez d'abord une clé ssh publique sur votre machine:
Il vous sera demandé une phrase secrète que vous devrez saisir la première fois que vous exécuterez une commande ssh après chaque connexion. Cela signifie que pour plusieurs commandes ssh ou scp, vous ne devrez les saisir qu'une seule fois. Laissez la phrase secrète vide pour un accès totalement sans mot de passe.
Une fois que vous avez généré votre clé publique, copiez-la sur chaque ordinateur de votre réseau:
Le
IPlistfile.txt
doit être un fichier contenant le nom ou l'adresse IP d'un serveur sur chaque ligne. Par exemple:Puisque c'est la première fois que vous faites cela, vous devrez entrer manuellement le mot de passe pour chaque IP mais une fois que vous aurez fait cela, vous pourrez copier des fichiers sur n'importe laquelle de ces machines avec un simple:
Supprimez l'attente de votre script. Maintenant que vous disposez d'un accès sans mot de passe, vous pouvez utiliser votre script comme:
la source
Votre code peut être beaucoup plus concis:
Si vous configurez les clés ssh comme suggéré, c'est encore mieux:
la source
spawn
est uneexpect
commande . Cela ne fonctionnera pas si votre interprète l'est/bin/bash
.la source