Copia de archivos

La idea es copiar archivos entre máquinas evitando instalar o instalando lo menos posible, quizás aprovechar algo ya instalado. Es un visión centrada en linux, contemplando el escenario del intercambio entre una virtual y su anfitrión sin habilitar "shared folder" y un fuerte sabor a sistemas embebidos, donde quizás no podés instalar nada y tenés que arreglártelas con lo que hay.

No es una lista completa, es más bien útil y que de algún modo he usado alguna vez.

 

SCP/SFTP/SSHFS

 

Estos son los métodos correctos, son seguros, respetan confidencialidad, integridad y autenticación, si los tenés no hay motivo para que sigas leyendo.

Pero eso es si ya los tenés instalados o podés instalarlos...

 

FTP/rsync

 

Estos son métodos comunes, en el caso de FTP completamente inseguro, en el de rsync, si hay ssh disponible, seguro.

rsync es probablemente el mejor método para copias grandes, pues en caso de interrupción no vuelve a copiar todo, pero recordemos que el alcance de esta cheatsheet es otro, zafar de una situación muy particular esta vez evitando tocar nada. De todos modos, esta es la línea:


rsync file.txt user@192.168.1.13:~/file.txt


SneakerNet

 

Viene de los tiempos de los diskettes, ahora con pendrives o memorias.

Si uno de los sistemas es windows, hay que usar un filesystem por éste soportado como FAT32, NTFS o exFAT.

 

netcat

 

Tambien se llama nc y es un programa de interacción con la red a muy bajo nivel.

Del lado del destino, ponele que es 192.168.1.13:

nc -l 8000 > file

Del lado del origen:

nc 192.168.1.13 8000 < file


Para copiar múltiples archivos, combinar con tar:

Destino:

nc -l 8000 | tar -xz 

Origen:

tar -cz file* | nc localhost 8000

 

Puede ser útil el parámetro -w para definir un timeout.

 

Servidores embebidos


Del lado del servidor

 

Download

 

Si tenés un php-cli instalado, del lado del servidor

 

php -S 0.0.0.0:8000

 

Si tenés un python3 instalado, del lado del servidor:

 

python3 -m http.server

 

Una lista más completa https://gist.github.com/willurd/5720255, pero se alejan del one-liner simple.

 

Upload 

 

PELIGRO: Este script es vulnerable al menos a path traversal.

 

<?php
ini_set('upload_max_filesize ','10G');
ini_set('post_max_filesize ','10G');

if(isset($_POST["submit"])) {
   copy( $_FILES["fileToUpload"]["tmp_name"],
     basename($_FILES["fileToUpload"]["name"]));
} else {
?>
<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select filee to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload File" name="submit">
</form>

</body>
</html>
<?php
}
?>

php -S 0.0.0.0:8000

 

 

Del lado del cliente

 

Podés acceder con curl, wget o cualquier navegador a la url:

http://192.168.1.13:8000/file.txt

 

Para compartir una carpeta podés comprimirla primero o fabricar un index.html con:

 

for FILE in *; do
    echo "<a href=\"./$FILE\">$FILE</a><br/>"
done > index.html

 

Casos locos

 

Tenés ssh pero no scp


Ni sé si existe esa posibilidad.

Esto te copia desde allá hasta acá:

 

ssh user@192.168.1.13 cat file.txt > file.txt

 

Esto te copia desde acá hasta alla:

 

cat file.txt | ssh user@192.168.1.13 'cat > file.txt'


Sólo tenés telnet o una terminal serial y podés copiar y pegar

 

Si el archivo es de texto vas copiando y pegando. Si no lo es, como puede ser un tgz o un binario, le aplicás base64 para convertirlo en texto y luego revertís el proceso.

 

cat /bin/ls |  base64 | head
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAoElAAAAAAABAAAAAAAAAADjnAQAAAAAAAAAAAEAAOAAJ
AEAAHQAcAAYAAAAFAAAAQAAAAAAAAABAAEAAAAAAAEAAQAAAAAAA+AEAAAAAAAD4AQAAAAAAAAgA
AAAAAAAAAwAAAAQAAAA4AgAAAAAAADgCQAAAAAAAOAJAAAAAAAAcAAAAAAAAABwAAAAAAAAAAQAA
AAAAAAABAAAABQAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAGTaAQAAAAAAZNoBAAAAAAAAACAA
AAAAAAEAAAAGAAAAAN4BAAAAAAAA3mEAAAAAAADeYQAAAAAAAAgAAAAAAABoFQAAAAAAAAAAIAAA
AAAAAgAAAAYAAAAY3gEAAAAAABjeYQAAAAAAGN5hAAAAAADgAQAAAAAAAOABAAAAAAAACAAAAAAA
AAAEAAAABAAAAFQCAAAAAAAAVAJAAAAAAABUAkAAAAAAAEQAAAAAAAAARAAAAAAAAAAEAAAAAAAA
AFDldGQEAAAA9KUBAAAAAAD0pUEAAAAAAPSlQQAAAAAABAgAAAAAAAAECAAAAAAAAAQAAAAAAAAA
Ue0ZAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABS
5XRkBAAAAADeAQAAAAAAAN5hAAAAAAAA3mEAAAAAAAACAAAAAAAAAAIAAAAAAAABAAAAAAAAAC9s

 

Si no tenés base64 en alguno de los extremos pero tenés hexdump:

 

hexdump convierte a texto
hexdump convierte a texto

Mejor:

 

hexdump convierte a texto y se recorta con cut
hexdump convierte a texto y se recorta con cut


y despues hay que reconstruir eso, lo podés hacer con cualquier lenguaje. Creo recordar que hay un programa que sabe hacerlo pero en este momento te lo debo, cuando recuerde, actualizo. Si no, pondré algunos ejemplos.

 

 




No hay comentarios:

Publicar un comentario