web-dev-qa-db-fra.com

Automatiser le transfert de fichiers scp à l'aide d'un script Shell

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.

79
jimko

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 .

82
Pradeep Pati
#!/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

39
JohnA

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 /
15
bsisco

pourquoi n'essayez-vous pas cela?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
14
Veerendra
#!/usr/bin/expect -f
spawn scp -r BASE.Zip [email protected]:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
9
Abhinav Gupta

Qu'en est-il des caractères génériques ou des fichiers multiples?

scp file1 file2 more-files* user@remote:/some/dir/
5
lutz

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.


Copier un dossier d'un endroit à un autre

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh [email protected]:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  
4
K.Govind Anupam

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"
3
Felix Rabe

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

2
Vereb

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
1
Rishi Sinha

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#########";
0
Chief_Arbiter

Essayez lftp 

lftp -u $user,$pass sftp://$Host << --EOF--

cd $directory

put $srcfile

quit

--EOF--
0
azazil

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.

0
Ignas