J'ai un certain nombre de fichiers dans un répertoire sur mon système Unix. Existe-t-il un moyen d'écrire un script de shell qui transférera tous ces fichiers via scp vers un système distant spécifié. Je vais spécifier le mot de passe dans le script, de sorte que je n'ai pas à le saisir pour chaque fichier.
Au lieu de coder en dur le mot de passe dans un script shell, utilisez les clés SSH, c'est plus facile et sécurisé.
$ scp -i ~/.ssh/id_rsa [email protected]:/path/to/bin/*.derp .
en supposant que votre clé privée est à ~/.ssh/id_rsa
Pour générer une paire de clés publique/privée:
$ ssh-keygen -t rsa
Ce qui précède générera 2 fichiers, ~/.ssh/id_rsa
(clé privée) et ~/.ssh/id_rsa.pub
(clé publique)
Pour configurer les clés SSH d’utilisation (tâche unique): Copiez le contenu de ~/.ssh/id_rsa.pub
et collez une nouvelle ligne de ~devops/.ssh/authorized_keys
dans le serveur myserver.org
. Si ~devops/.ssh/authorized_keys
n'existe pas, n'hésitez pas à le créer.
Un guide pratique lucide est disponible ici .
#!/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
http://blogs.Oracle.com/SanthoshK/entry/automate_linux_scp_command
vous pouvez aussi utiliser rsync. Cela semble fonctionner mieux pour plusieurs fichiers que scp IMHO.
rsync -avzh/chemin/vers/répertoire/utilisateur @ distant:/chemin/vers/distant/répertoire /
Mettre à jour
Vous pouvez utiliser rsync via ssh en ajoutant le commutateur '-e':
rsync -avzh -e ssh/chemin/do/répertoire/utilisateur @ distant:/chemin/vers/distant/répertoire /
pourquoi n'essayez-vous pas cela?
password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
#!/usr/bin/expect -f
spawn scp -r BASE.Zip [email protected]:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
Qu'en est-il des caractères génériques ou des fichiers multiples?
scp file1 file2 more-files* user@remote:/some/dir/
rsync est un programme qui se comporte de la même manière que rcp, mais qui comporte beaucoup plus d'options et utilise le protocole de mise à jour à distance rsync pour accélérer considérablement les transferts de fichiers lorsque le fichier de destination est en cours de mise à jour.
Le protocole de mise à jour à distance rsync permet à rsync de ne transférer que les différences entre deux ensembles de fichiers À travers la connexion réseau, en utilisant un algorithme efficace de recherche de sommes de contrôle décrit dans le rapport technique qui accompagne ce paquet.
#!/usr/bin/expect -f
spawn rsync -a -e ssh [email protected]:/cool/cool1/* /tmp/cool/
expect "password:"
send "cool\r"
expect "*\r"
expect "\r"
Si vous acceptez d'entrer votre mot de passe une fois pour chaque exécution du script, vous pouvez le faire facilement à l'aide d'une connexion maître SSH.
#!/usr/bin/env bash
USER_AT_Host="user@Host" # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_Host"
# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_Host"
# These do not Prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_Host":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_Host":remotefile2.xy
# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_Host" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_Host" "echo world"
# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_Host"
Vous pouvez le faire avec des clés publiques/privées ssh uniquement. Ou utilisez PuTTY dans lequel vous pouvez définir le mot de passe. scp ne prend pas en charge la saisie d'un mot de passe en ligne de commande.
Vous trouverez les instructions pour les clés publiques/privées ici: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml
Cela fonctionnera:
#!/usr/bin/expect -f
spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@Host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact
voici le code bash pour SCP avec un fichier de clé .pem. Il suffit de l'enregistrer dans un fichier script.sh puis de l'exécuter avec 'sh script.sh'
Prendre plaisir
#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}
Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at Host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem
echo "Aperture in Process...";
#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"
echo "########Aperture Complete#########";
Essayez lftp
lftp -u $user,$pass sftp://$Host << --EOF--
cd $directory
put $srcfile
quit
--EOF--
Je peux dire que, du moins pour moi, cette réponse , n'a pas fonctionné. Et je ne voulais pas trop m'embêter à le résoudre. J'ai donc trouvé un guide agréable qui a bien fonctionné pour moi à Digital Ocean . J'imagine que la différence clé était d'utiliser ssh-copy-id
pour transférer la clé publique au serveur, au lieu d'une commande manuelle.