Automatizar la transferencia de archivos scp usando un script de shell


83

Tengo un número n de archivos en un directorio de mi sistema Unix. ¿Hay alguna forma de escribir un shellscript que transfiera todos esos archivos a través de scp a un sistema remoto específico? Especificaré la contraseña dentro del script para no tener que ingresarla para cada archivo.


2
¿Puede decirme si el uso de una contraseña en un script de shell con rsync funcionó o si lo intentó? Gracias.

Respuestas:


88

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

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

asumiendo que su clave privada está en ~/.ssh/id_rsay los archivos que desea enviar se pueden filtrar con*.derp

Para generar un par de claves pública / privada:

$ ssh-keygen -t rsa

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

Para configurar las claves SSH para su uso (tarea única): Copie el contenido de ~/.ssh/id_rsa.puby péguelo en una nueva línea de ~devops/.ssh/authorized_keysen el myserver.orgservidor. Si ~devops/.ssh/authorized_keysno existe, no dude en crearlo.

Aquí encontrará una guía práctica lúcida .


1
Incluso después de seguir estas instrucciones, todavía se me solicita una contraseña ... ¿hay algún otro criterio que me falte?
scottysseus

@ScottScooterWeidenkopf, podría haber algunas cosas que podrían estar mal, como el directorio .ssh o los archivos autorizados_keys pueden no tener los permisos correctos (700).
Pradeep Pati

2
@PradeepPati Descubrí mi problema. Tienes razón, el problema eran los permisos. En el enlace que proporcionó, el autor mencionó algunos cambios en los permisos. Hice esos cambios y ahora todo funciona.
scottysseus

1
Solo para ayudar a evitar confusiones con el uso de copiar y pegar de esta solución, actualmente esta respuesta parece transferirse DE remoto A local, lo que es opuesto a lo que el OP está buscando hacer.
Ciabaros

@Ciabaros buena atrapada! Actualicé la respuesta. ¡Gracias!
Pradeep Pati

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


Nota para los usuarios de Windows: el expectempaquetado en MSYS2 coincidirá con toda la salida, por lo que la primera regla siempre coincidirá. Si intercambias el orden de ambas reglas, obtienes el comportamiento deseado.
fzbd

18

¿Por qué no intentas esto?

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

1
Buena alternativa a #! / Usr / bin / esperan -f
TH_

16

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

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

Actualizar

Puede usar rsync a través de ssh agregando el interruptor '-e':

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

3
Lo bueno de scp es que utiliza un canal seguro. rsync no lo hace.

3
Puede forzar a rsync a usar ssh: 'rsync -avz -e ssh remoteuser @ remotehost: / remote / dir / this / dir /'

@flokra. Gracias, estaba justo en el medio de agregar esa actualización y me distraje.
bsisco

9
Esto seguirá invocando una solicitud de contraseña interactiva. Creo que el OP quería una solución totalmente automatizada
Tom Auger

@Dimitri scp -r copia archivos de forma recursiva. ¡No tiene nada que ver con almacenar una contraseña dentro del script y pasarla a la llamada scp a través de un script bash! Realmente no entiendo tu comentario.
Tom Auger

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

¿Se puede esperar que se use para rsync? Estoy intentando hacer algo y mi método de clave RSA no funciona. Sigue pidiéndome la contraseña de la máquina remota.

5

¿Qué pasa con los comodines o varios archivos?

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

4

rsync es un programa que se comporta de la misma manera que rcp, pero tiene muchas más opciones y usa el protocolo de actualización remota rsync para acelerar enormemente las transferencias de archivos cuando se actualiza el archivo de destino.

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 eficiente algoritmo de búsqueda de suma de comprobación descrito en el informe técnico 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"  

3

Si está de acuerdo 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"


1

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

aquí está el código bash para SCP con un archivo de clave .pem. Simplemente guárdelo en un archivo script.sh y luego ejecútelo con 'sh script.sh'

Disfrutar

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

Prueba lftp

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

cd $directory

put $srcfile

quit

--EOF--

-1

El comando scpse puede utilizar como un UNIX tradicional cp. Entonces, si lo haces:

scp -r myDirectory/ mylogin@host:TargetDirectory

trabajará


1
Esto no parece abordar la contraseña.
Delicia Brummitt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.