97 votes

Automatiser le transfert de fichiers scp en utilisant un shell script.

J'ai un nombre n de fichiers dans un répertoire sur mon système unix. Y a-t-il un moyen d'écrire un shellscript qui transférera tous ces fichiers via scp vers un système distant spécifié. Je spécifierai le mot de passe dans le script, afin de ne pas avoir à le saisir pour chaque fichier.

6voto

K.Govind Anupam Points 21

Rsync est un programme qui se comporte à peu près de la même manière que rcp, mais qui possède beaucoup plus d'options et utilise le protocole rsync remote-update pour accélérer considérablement les transferts de fichiers lorsque le fichier de destination est en cours de mis à jour.

Le protocole rsync remote-update permet à rsync de transférer uniquement les différences entre deux ensembles de fichiers sur la connexion réseau, en utilisant un algorithme efficace de recherche de somme de contrôle décrit dans le rapport qui accompagne ce paquetage.


Copie d'un dossier d'un emplacement à 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"

6voto

Felix Rabe Points 1256

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"

4voto

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

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

3voto

Il existe deux moyens rapides d'y parvenir :

  1. Utilisation de scp

    #!/usr/bin/env bash
    
    password="YOURPASSWORD"
    username="YOURUSERNAME"
    dir_origin="YOURSOURCEDIRECTORY"
    dir_destination="REMOTEDESTINATION"
    Ip="SERVERIP"
    
    echo "Uploading files to remote server...."
    sshpass -p "$password" scp -rC $dir_origin $username@$Ip:$dir_destination
    echo "File upload to remote server completed! ;)"
  2. Utilisation de rsync

    #!/usr/bin/env bash
    
    password="YOURPASSWORD"
    username="YOURUSERNAME"
    dir_origin="YOURSOURCEDIRECTORY"
    dir_destination="REMOTEDESTINATION"
    Ip="SERVERIP"
    
    echo "Uploading files to remote server...."
    sshpass -p "$password" rsync -avzh $dir_origin $username@$Ip:$dir_destination
    echo "File upload to remote server completed! ;)"

**NOTE :**Vous devez installer sshpass (par exemple en exécutant apt install sshpass pour deb comme os eg Ubuntu ) qui vous permettra de télécharger automatiquement des fichiers sans demande de mot de passe.

2voto

Vereb Points 4876

Vous pouvez le faire avec les clés publiques/privées ssh uniquement. Ou utiliser putty dans lequel vous pouvez définir le mot de passe. scp ne permet pas de donner un 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X