Automatizza il trasferimento di file scp usando uno script di shell

Ho un numero n di file in una directory sul mio sistema unix. C’è un modo per scrivere uno shellscript che trasferirà tutti quei file tramite scp su un sistema remoto specificato. Specificheremo la password all’interno dello script, in modo che non debba inserirla per ogni file.

Invece della password hardcoding in uno script di shell, usa le chiavi SSH, è più facile e sicuro.

$ scp -i ~/.ssh/id_rsa [email protected]:/path/to/bin/*.derp . 

supponendo che la tua chiave privata sia in ~/.ssh/id_rsa

Per generare una coppia di chiavi pubblica / privata:

 $ ssh-keygen -t rsa 

Quanto sopra genererà 2 file, ~/.ssh/id_rsa (chiave privata) e ~/.ssh/id_rsa.pub (chiave pubblica)

Per configurare le chiavi SSH per l’utilizzo (un’attività una tantum): Copia il contenuto di ~/.ssh/id_rsa.pub e incolla una nuova riga di ~devops/.ssh/authorized_keys nel server myserver.org . Se ~devops/.ssh/authorized_keys non esiste, sentiti libero di crearlo.

Una lucida guida pratica è disponibile qui .

 #!/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

potresti anche usare rsync. Sembra funzionare meglio per più file di SCHO IMHO.

  rsync -avzh / percorso / a / dir / utente @ remoto: / percorso / a / remoto / dir / 

Aggiornare

Puoi usare rsync via ssh aggiungendo l’opzione ‘-e’:

  rsync -avzh -e ssh / percorso / do / dir / utente @ remoto: / percorso / a / remoto / dir / 

perché non provi questo?

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

Che dire dei caratteri jolly o di più file?

 scp file1 file2 more-files* [email protected]:/some/dir/ 

rsync è un programma che si comporta allo stesso modo di quanto fa rcp, ma ha molte più opzioni e usa il protocollo di aggiornamento remoto rsync per velocizzare notevolmente i trasferimenti di file quando il file di destinazione viene aggiornato.

Il protocollo di aggiornamento remoto rsync consente a rsync di trasferire solo le differenze tra due serie di file attraverso la connessione di rete, utilizzando un efficiente algoritmo di ricerca del checksum descritto nel rapporto tecnico che accompagna questo pacchetto.


Copia di una cartella da una posizione a un’altra

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

Se stai bene inserendo la tua password una volta per ogni esecuzione dello script, puoi farlo facilmente usando una connessione master SSH.

 #!/usr/bin/env bash USER_AT_HOST="[email protected]" # use "[email protected]$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" 

Puoi farlo solo con le chiavi pubbliche / private di ssh. O usare stucco in cui è ansible impostare la password. scp non supporta la password per la riga di comando.

Puoi trovare le istruzioni per le chiavi pubbliche / private qui: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml

Questo funzionerà:

 #!/usr/bin/expect -f spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 [email protected]:/path/ expect "password:" send "xyz123\r" expect "*\r" expect "\r" interact 

Prova lftp

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

Il comando scp può essere usato come un cp UNIX tradizionale. Quindi se lo fai:

 scp -r myDirectory/ [email protected]:TargetDirectory 

funzionerà