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.
83
Respuestas:
En lugar de codificar la contraseña en un script de shell, use claves SSH, es más fácil y seguro.
asumiendo que su clave privada está en
~/.ssh/id_rsa
y los archivos que desea enviar se pueden filtrar con*.derp
Para generar un par de claves pública / privada:
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.pub
y péguelo en una nueva línea de~devops/.ssh/authorized_keys
en elmyserver.org
servidor. Si~devops/.ssh/authorized_keys
no existe, no dude en crearlo.Aquí encontrará una guía práctica lúcida .
fuente
#!/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
fuente
expect
empaquetado 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.¿Por qué no intentas esto?
password="your password" username="username" Ip="<IP>" sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
fuente
también puedes usar rsync. Parece funcionar mejor para varios archivos que scp en mi humilde opinión.
Actualizar
Puede usar rsync a través de ssh agregando el interruptor '-e':
fuente
#!/usr/bin/expect -f spawn scp -r BASE.zip [email protected]:/tmp expect "password:" send "wifinetworks\r" expect "*\r" expect "\r"
fuente
¿Qué pasa con los comodines o varios archivos?
fuente
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 [email protected]:/cool/cool1/* /tmp/cool/ expect "password:" send "cool\r" expect "*\r" expect "\r"
fuente
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"
fuente
Puede hacerlo solo con claves públicas / privadas ssh. O use masilla en la que puede establecer la contraseña. scp no admite la introducción de contraseña en la línea de comandos.
Puede encontrar las instrucciones para las claves públicas / privadas aquí: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml
fuente
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
fuente
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#########";
fuente
Prueba lftp
lftp -u $user,$pass sftp://$host << --EOF-- cd $directory put $srcfile quit --EOF--
fuente
El comando
scp
se puede utilizar como un UNIX tradicionalcp
. Entonces, si lo haces:trabajará
fuente