Pregunta Automatice la transferencia de archivos scp usando un script de shell


Tengo una n cantidad de archivos en un directorio en mi sistema Unix. ¿Hay alguna manera de escribir un shellscript que transfiera todos esos archivos mediante scp a un sistema remoto específico? Especificaré la contraseña dentro del script, para que no tenga que ingresarla en cada archivo.


73
2017-08-28 11:46


origen


Respuestas:


En lugar de codificar la contraseña en un script de shell, use las claves SSH, es más fácil y seguro.

$ scp -i ~/.ssh/id_rsa devops@myserver.org:/path/to/bin/*.derp .

asumiendo que su clave privada está en ~/.ssh/id_rsa

Para generar un par de claves públicas / privadas:

$ ssh-keygen -t rsa

Lo anterior generará 2 archivos, ~/.ssh/id_rsa (clave privada) y ~/.ssh/id_rsa.pub (Llave pública)

Para configurar las claves SSH para el uso (una tarea de tiempo): Copia los contenidos de ~/.ssh/id_rsa.pub y pegar en una nueva línea de ~devops/.ssh/authorized_keys en myserver.org servidor. Si ~devops/.ssh/authorized_keys no existe, siéntete libre de crearlo.

Una lúcida guía práctica está disponible aquí.


75
2018-04-24 20:32



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


38
2017-12-16 00:34



también puedes usar rsync. Parece funcionar mejor para múltiples archivos que scp en mi humilde opinión.

rsync -avzh / ruta / a / dir / usuario @ remote: / ruta / a / remoto / dir /

Actualizar

Puede usar rsync mediante ssh agregando el modificador '-e':

rsync -avzh -e ssh / path / do / dir / usuario @ remote: / ruta / a / remote / dir /

17
2017-08-28 11:51



¿Por qué no pruebas esto?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

11
2017-11-16 06:32



#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

9
2017-07-12 09:47



¿Qué pasa con los comodines o los archivos múltiples?

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

5
2017-08-28 11:49



rsync es un programa que se comporta de la misma manera que rcp, pero tiene muchas más opciones y usos el protocolo de actualización remota rsync para acelerar en gran medida las transferencias de archivos cuando se está utilizando el archivo de destino actualizado.

El protocolo de actualización remota rsync permite que rsync transfiera solo las diferencias entre dos conjuntos de archivos a través de la conexión de red, utilizando un algoritmo de búsqueda de suma de comprobación eficiente descrito en la técnica informe que acompaña a este paquete.


        Copiar carpeta de una ubicación a otra

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

4
2017-08-17 12:38



Si está bien con ingresar su contraseña una vez por cada ejecución del script, puede hacerlo fácilmente usando una conexión maestra 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
2017-07-02 18:20



Puede hacerlo solo con las claves ssh públicas / privadas. O use masilla en la que puede establecer la contraseña. scp no admite dar contraseña en la línea de comando.

Puede encontrar las instrucciones para las claves públicas / privadas aquí: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml


1
2017-09-15 21:13



Esto funcionará:

#!/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
2018-01-20 01:35