Ir al contenido
Nible

Script para compartir directorios

Recommended Posts

A continuación os dejo un script para compartir directorios que escribí hace poco, con el propósito de enviar libros electrónicos a un Ereader cuyo puerto USB parecía servir solamente para cargar la batería y no para transferir libros directamente desde el ordenador.

Este script fue pensado para que lo utilizasen mis familiares, osea gente que no poseen muchos conocimientos de informática.
Por eso esta hecho a modo de asistente grafico, usando zenity se hacen preguntas y se explica brevemente lo que va a pasar a continuación, finalmente se usa python3 (presente prácticamente en todas las distros) para crear un servidor sencillo con el directorio deseado.
 

#!/bin/bash

zenity --title='Servir Carpeta' --width=250 --question --ok-label='Si' --cancel-label='No' --text='Servidor de carpeta por WiFi\n\nCon este asistente podrás compartir una carpeta para que cualquier dispositivo con WiFi pueda acceder a ella.\n\n¿Deseas continuar?'

if [ $? -eq 0 ]
then
	zenity --title='Servir Carpeta' --width=250 --info --text="A continuación deberás seleccionar un archivo cualquiera de la carpeta que quieres compartir.\n\nPulsa para continuar" --no-wrap
	narchivo=$(zenity --title='Servir Carpeta' --file-selection)
else
	exit 1
fi

if [ $? -eq 0 ]
then
	npuerto=$(zenity --title='Servir Carpeta' --entry --text='Si quieres puedes especificar un puerto mayor de 1024.\n\nSi no especificas ninguno se usará el 8000.')
fi

if  [ "$npuerto" = "" ] || [ "$npuerto" -lt 1024 ] || [ "$npuerto" -gt 10000 ]
then
	npuerto=8000
fi

#nruta=$(echo $narchivo | sed 's/[a-zA-Z0-9 ]*\.*[a-zA-Z0-9]*$//')
#nruta=$(echo $narchivo | sed 's/[^\/]*[a-zA-Z0-9]*$//')
nruta=$(echo $narchivo | sed 's/[^\/]*$//')
ndireccion=$(ifconfig | grep -o -m 1 -E "192.168.0.1[0-9]{1,2}")

cd $nruta
python3 -m http.server $npuerto &
npid=$!

zenity --title='Servir Carpeta' --width=250 --info --text="Has compartido el directorio: $nruta\n\nPuedes acceder a el con cualquier dispositivo conectado a tu red WiFi usando la siguiente dirección:\nhttp://$ndireccion:$npuerto\n\nATENCIÓN: Cuando cierres este dialogo se dejará de compartir, así que mantenlo abierto mientras quieras que tu carpeta sea accesible." --no-wrap

echo
echo Ruta $nruta
echo IP $ndireccion
echo Puerto $npuerto
echo PID $npid

kill $npid

El script es bastante mejorable, sobretodo la parte que extrae la IP del comando ifconfig y se filtra con grep, ya que solamente está pensado para IPs que acaben seguro con tres números como "192.168.0.150".

A mi personalmente me sirvió para salir del paso, de todos modos cualquier corrección o mejora que queráis aportar serán bienvenidos.

 

Un saludo.

Compartir este post


Enlace al post
Compartir en otros sitios

Muy curioso, me lo apunto por si me hace falta algo así en el futuro.

 

P.D:He estado intentando hacer una versión para terminal pero no me sale y no veo donde anda el fallo, quizás puedas echarle un ojo @Nible

 

PD2: Encontré el error, ifconfig ya no viene instalado por defecto en Debian, el procedimiento adecuado por defecto sería "ip a" pero no sé como hacer con grep para sacar mi ip desde ahí, la cual debería ser 192.168.0.16 he probado con "grep -o -m 1 -E "192.168.0.[0-99]" pero me da 192.168.0.1 y 192.168.0.2, seguiré buscando para solucionarlo.

 

PD3: Lo conseguí hacer con hostname -I, pero no se si servirá en todas las siituaciones, solo me falta tocar alguna cosita al código para dejarlo a mi gusto.

 

PD4: Dejo el código final tal y como lo he dejado funcionando para mí, si no seleccionas nada, solo dar Intro compartes la carpeta Descargas de tu home en 192.168.X.X:8000

 

#!/bin/bash

echo
echo 'Compartidor de archivos al vuelo.'
echo '¿Continuar? [S/n]: '
read r

if [ -z $r ] || [ $r = 's' ] || [ $r = 'S' ]
then
	echo 'Ruta de la carpeta [~/Descargas]: '
	read narchivo
	echo
else
    echo 'Saliendo.'
	exit 1
fi

if [ -n $narchivo ]
then
	echo 'Puerto de conexión [8000]: '
    echo 'Debes especificar un puerto entre 1024 y 10000.'
	read npuerto
	echo
else
    echo 'No has seleccionado una ruta válida.'
    echo 'Saliendo.'
    exit 1
fi

if  [ "$npuerto" = "" ] || [ "$npuerto" -lt 1024 ] || [ "$npuerto" -gt 10000 ]
then
	npuerto=8000
else
    echo 'No se puede compartir a través de ese puerto.'
    echo 'Saliendo.'
    exit 1
fi

if [ -z $narchivo ]
then
    narchivo=~
    narchivo=$narchivo'/Descargas/'
    nruta=$(echo $narchivo | sed 's/[^\/]*$//')
else
    nruta=$(echo $narchivo | sed 's/[^\/]*$//')
fi

ndireccion=$(hostname -I)

python3 -m http.server --bind $ndireccion --directory $nruta $npuerto &
npid=$!

echo 'Pulsa INTRO para dejar de compartir y salir'
echo 'Compartiendo '$nruta
read finito
echo 'Saliendo.'
kill $npid

 

Gracias de nuevo a nible por el aporte.

Editado por mijailbellum

Compartir este post


Enlace al post
Compartir en otros sitios

He creado una versión resumida que funciona en mi teléfono Android y muestra un código QR para que otra persona lo escanee y se conecte al servidor, al no tener whatsapp hay que buscar formas rápidas de compartir con gente sin mucha idea, por aquí lo dejo.

 

#!/bin/bash
myip=$(ip addr show wlan0 | grep -Po 'inet \K[\d.]+')
clear
python3 -m http.server --bind $myip --directory /storage/emulated/0/Public 8080 &
serverpid=$!
echo
qrencode $myip:8080 -t UTF8
echo
read finito
kill $serverpid

 

En mi caso comparto la carpeta "Public" que está en la carpeta principal del usuario de Android, Junto a "Documents", "Downloads" y demás.

 

Es necesario instalar la aplicación Termux ya sea de la App Store o de F-droid.

 

Ya en termux instalamos las dependencias, python3 y libqrencode:

pkg upgrade && pkg install python libqrencode

Damos permisos a termux para acceder a las carpetas del sistema (Creo que solo es necesario a partir de Android 6):

termux-setup-storage

Aceptamos el aviso de Android.

 

Y por ultimo damos permisos de ejecución al archivo:

chmod -x /storage/emulated/0/Documents/servidor.sh

 

Estaría bien si alguien lo prueba en su dispositivo y dice por aquí que tal va.

A mi me funciona en un Xiaomi Mi A2 Lite con Android 9.

Editado por uzanto

Compartir este post


Enlace al post
Compartir en otros sitios

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invitado
Responder en este tema...

×   Has incluido contenido con formato.   Eliminar formato

  Sólo se permiten 75 emoticonos como máximo.

×   Tu enlace ha sido insertado automáticamente.   Deshacer y mostrar como enlace

×   Su contenido anterior ha sido restaurado.   Limpiar editor

×   No puedes pegar imágenes directamente. Súbelas a algún hosting de imágenes y pega la dirección URL


×
×
  • Crear Nuevo...