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. Est-il possible d’écrire un script de shell qui transfère tous ces fichiers via scp vers un système distant spécifié. Je vais spécifier le mot de passe dans le script, afin de ne pas avoir à 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 simple et sécurisé.

$ scp -i ~/.ssh/id_rsa devops@myserver.org:/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 va générer 2 fichiers, ~/.ssh/id_rsa (clé privée) et ~/.ssh/id_rsa.pub (clé publique)

Pour configurer les clés SSH à utiliser (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 est disponible ici .

 #!/usr/bin/expect -f # connect via scp spawn scp "user@example.com:/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 également utiliser rsync. Il semble fonctionner mieux pour plusieurs fichiers que scp IMHO.

  rsync -avzh / chemin / vers / rep / utilisateur @ distant: / chemin / vers / distance / rep / 

Mettre à jour

Vous pouvez utiliser rsync via ssh en ajoutant le commutateur ‘-e’:

  rsync -avzh -e ssh / chemin / do / rep / utilisateur @ distant: / chemin / vers / distance / rep / 

pourquoi ne pas essayer ça?

 password="your password" username="username" Ip="" sshpass -p "$password" scp //final.txt $username@$Ip:/root/ 
 #!/usr/bin/expect -f spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp expect "password:" send "wifinetworks\r" expect "*\r" expect "\r" 

Qu’en est-il des caractères génériques ou de plusieurs fichiers?

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

rsync est un programme qui se comporte à peu près comme le fait rcp, mais offre 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 mis à jour.

Le protocole de mise à jour à distance rsync permet à rsync de ne transférer que les différences entre deux ensembles de fichiers sur la connexion réseau, en utilisant un algorithme de recherche de sum de contrôle efficace décrit dans le rapport technique qui accompagne ce package.


Copier un dossier d’un endroit à un autre

  #!/usr/bin/expect -f spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/ expect "password:" send "cool\r" expect "*\r" expect "\r" 

Si vous êtes d’accord pour entrer votre mot de passe une fois pour chaque exécution du script, vous pouvez le faire facilement en utilisant 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 les clés publiques / privées ssh uniquement. Ou utilisez du mastic dans lequel vous pouvez définir le mot de passe. scp ne supporte pas le mot de passe en ligne de commande.

Vous pouvez trouver 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 SsortingctHostKeyChecking=no file1 file2 file3 user@host:/path/ expect "password:" send "xyz123\r" expect "*\r" expect "\r" interact 

Essayez lftp

 lftp -u $user,$pass sftp://$host << --EOF-- cd $directory put $srcfile quit --EOF-- 

La commande scp peut être utilisée comme un cp UNIX traditionnel. Donc si vous faites:

 scp -r myDirectory/ mylogin@host:TargetDirectory 

marchera