
Compartir archivos fácil y rápido desde la línea de comandos.
Bypass del filtro IP y autenticación HTTP mediante suplantación de cabecera X-Forwarded-For no autenticada
Compartición de archivos fácil y rápida desde la línea de comandos. Este código contiene el servidor con todo lo necesario para crear tu propia instancia.
Transfer.sh actualmente es compatible con los proveedores s3 (Amazon S3), gdrive (Google Drive), storj (Storj) y el sistema de archivos local (local).
@stefanbenten resulta ser un mantenedor de este repositorio y la persona que aloja una conocida instalación pública del software en el repositorio. Sin embargo, ambos no están relacionados, y el repositorio no es el lugar para dirigir solicitudes o problemas relacionados con ninguna instalación pública. Ninguna instalación pública de terceros del software en el repositorio será anunciada ni mencionada en el propio repositorio, por razones de seguridad. La posición oficial de mí, @aspacca, como mantenedor del repositorio, es que si deseas usar el software, debes alojar tu propia instalación.
Esta sección describe cómo usar transfer.sh
$ curl -v --upload-file ./hello.txt https://transfer.sh/hello.txt
<br />
### Cifrar & Subir```bash
$ gpg --armor --symmetric --output - /tmp/hello.txt | curl --upload-file - https://transfer.sh/test.txt
$ curl https://transfer.sh/1lDau/test.txt | gpg --decrypt --output /tmp/hello.txt
<br />
### Subir a Virustotal```bash
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
$ curl -X DELETE
<br />
---
<br />
## Encabezados de solicitud
Esta sección explica cómo manejar los encabezados de solicitud con curl:
<br />
### Max-Downloads```bash
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Downloads: 1" # Limit the number of downloads
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Days: 1" # Set the number of days before deletion
<br />
### X-Encrypt-Password
#### Cuidado, use esta función solo en su propio servidor autoalojado: confiar en un servicio de terceros para el cifrado del lado del servidor es bajo su propio riesgo.```bash
$ curl --upload-file ./hello.txt https://your-transfersh-instance.tld/hello.txt -H "X-Encrypt-Password: test" # Encrypt the content server side with AES256 using "test" as password
$ curl https://your-transfersh-instance.tld/BAYh0/hello.txt -H "X-Decrypt-Password: test" # Decrypt the content server side with AES256 using "test" as password
<br />
---
<br />
## Encabezados de Respuesta
Esta sección explica cómo manejar los encabezados de respuesta:
<br />
### X-Url-Delete
La URL utilizada para solicitar la eliminación de un archivo y devuelta como encabezado de respuesta:```bash
curl -sD - --upload-file ./hello.txt https://transfer.sh/hello.txt | grep -i -E 'transfer\.sh|x-url-delete'
x-url-delete: https://transfer.sh/hello.txt/BAYh0/hello.txt/PDw0NHPcqU
https://transfer.sh/hello.txt/BAYh0/hello.txt
Véanse ejemplos de buen uso en examples.md
Crear enlace de descarga directa:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/get/1lDau/test.txt
Archivo en línea:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/inline/1lDau/test.txt
Si desea usar TLS con certificados Let's Encrypt, establezca lets-encrypt-hosts en su dominio, configure tls-listener en :443 y habilite force-https.
Si desea usar TLS con sus propios certificados, configure tls-listener en :443, force-https, tls-cert-file y tls-private-key.
Se cambió a GO111MODULE```bash go run main.go --provider=local --listener :8080 --temp-path=/tmp/ --basedir=/tmp/
<br />
---
<br />
## Compilación```bash
$ git clone [email protected]:dutchcoders/transfer.sh.git
$ cd transfer.sh
$ go build -o transfersh main.go
Para una implementación sencilla, hemos creado un contenedor oficial de Docker. Hay dos variantes, que difieren solo en qué usuario ejecuta el proceso.
El predeterminado se ejecutará como root:
[!WARNING] Se desaconseja usar la etiqueta
latestpara WatchTower o herramientas similares. La etiquetalatestpuede hacer referencia a versiones de desarrollo no publicadas, compilaciones de prueba y lanzamientos de parches para versiones anteriores. Use una etiqueta de versión real hasta que transfer.sh admita etiquetas de versión mayor o menor.```bash docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
<br />
### Sin root
Las etiquetas `-noroot` indican compilaciones de imágenes que se ejecutan con mínimos privilegios para reducir la superficie de ataque en caso de que una aplicación se vea comprometida.
> [!NOTE]
> Se **recomienda** usar `-noroot`
<br />
La imagen etiquetada con el sufijo `-noroot` usará `5000` como UID y GID:```bash
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
[!NOTE] Detalles del historial de desarrollo en:
También puedes construir el contenedor tú mismo. Esto te permite elegir qué UID/GID se usará, por ejemplo, al usar montajes NFS:```bash
docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .
<br />
---
<br />
## Uso de S3
Para el uso con un bucket de AWS S3, solo necesitas especificar las siguientes opciones:
- provider `--provider s3`
- aws-access-key _(ya sea mediante flag o variable de entorno `AWS_ACCESS_KEY`)_
- aws-secret-key _(ya sea mediante flag o variable de entorno `AWS_SECRET_KEY`)_
- bucket _(ya sea mediante flag o variable de entorno `BUCKET`)_
- s3-region _(ya sea mediante flag o variable de entorno `S3_REGION`)_
Si especificas la s3-region, no necesitas establecer la URL del endpoint, ya que el endpoint correcto se usará automáticamente.
<br />
### Proveedores S3 personalizados
Para usar un proveedor S3 personalizado que no sea de AWS, debes especificar el endpoint según lo definido por tu proveedor de nube.
<br />
---
<br />
## Proveedor de Red Storj
Para usar la Red Storj como proveedor de almacenamiento, debes especificar los siguientes flags:
- provider `--provider storj`
- storj-access _(ya sea mediante flag o variable de entorno STORJ_ACCESS)_
- storj-bucket _(ya sea mediante flag o variable de entorno STORJ_BUCKET)_
<br />
### Crear Bucket y Scope
Debes crear un access grant (o copiarlo de la configuración de uplink) y un bucket como preparación.
Para comenzar, inicia sesión en tu cuenta y ve al Menú de Access Grant e inicia el Wizard en la esquina superior derecha.
Ingresa el nombre de access grant que prefieras, pulsa *Next* y restríngelo según sea necesario/preferido.
Después continúa ya sea en la CLI o dentro del navegador. A continuación, se te pedirá una frase de contraseña (Passphrase) utilizada como clave de cifrado.
**Asegúrate de guardarla en un lugar seguro. Sin ella, ¡perderás la capacidad de descifrar tus archivos!**
Después, puedes copiar el access grant y luego iniciar el endpoint de transfer.sh.
Se recomienda proporcionar tanto el access grant como el nombre del bucket como variables de entorno para mayor seguridad.
Ejemplo:```
export STORJ_BUCKET=<BUCKET NAME>
export STORJ_ACCESS=<ACCESS GRANT>
transfer.sh --provider storj
Para el uso con Google Drive, debes especificar las siguientes opciones:
Necesitas crear un ID de cliente OAuth desde console.cloud.google.com, descargar el archivo y colocarlo en un directorio seguro.
go run main.go --provider gdrive --basedir /tmp/ --gdrive-client-json-filepath /[credential_dir] --gdrive-local-config-path [directory_to_save_config] transfer() (if [ $# -eq 0 ]; then printf "No se especificaron argumentos.\nUso:\n transfer <archivo|directorio>\n ... | transfer <nombre_archivo>\n">&2; return 1; fi; file_name=$(basename "$1"); if [ -t 0 ]; then file="$1"; if [ ! -e "$file" ]; then echo "$file: No existe el archivo o directorio">&2; return 1; fi; if [ -d "$file" ]; then cd "$file" || return 1; file_name="$file_name.zip"; set -- zip -r -q - .; else set -- cat "$file"; fi; else set -- cat; fi; url=$("$@" | curl --silent --show-error --progress-bar --upload-file "-" "https://transfer.sh/$file_name"); echo "$url"; )```
<br />
#### Now you can use transfer function
$ transfer hello.txt```
```bash
transfer()
{
local file
declare -a file_array
file_array=("${@}")
if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
then
echo "${0} - Subir archivos arbitrarios a \"transfer.sh\"."
echo ""
echo "Uso: ${0} [opciones] [<archivo>]..."
echo ""
echo "OPCIONES:"
echo " -h, --help"
echo " muestra este mensaje"
echo ""
echo "EJEMPLOS:"
echo " Subir un solo archivo desde el directorio de trabajo actual:"
echo " ${0} \"image.img\""
echo ""
echo " Subir múltiples archivos desde el directorio de trabajo actual:"
echo " ${0} \"image.img\" \"image2.img\""
echo ""
echo " Subir un archivo desde un directorio diferente:"
echo " ${0} \"/tmp/some_file\""
echo ""
echo " Subir todos los archivos desde el directorio de trabajo actual. ¡Tenga en cuenta la limitación de velocidad del servidor web!:"
echo " ${0} *"
echo ""
echo " Subir un solo archivo desde el directorio de trabajo actual y filtrar el token de eliminación y el enlace de descarga:"
echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
echo ""
echo " Mostrar texto de ayuda de \"transfer.sh\":"
echo " curl --request GET \"https://transfer.sh\""
return 0
else
for file in "${file_array[@]}"
do
if [[ ! -f "${file}" ]]
then
echo -e "\e[01;31m'${file}' no se pudo encontrar o no es un archivo.\e[0m" >&2
return 1
fi
done
unset file
fi
local upload_files
local curl_output
local awk_output
du -c -k -L "${file_array[@]}" >&2
# ser compatible con "bash"
if [[ "${ZSH_NAME}" == "zsh" ]]
then
read $'upload_files?\e[01;31m¿Realmente desea subir los archivos anteriores ('"${#file_array[@]}"$') a "transfer.sh"? (Y/n): \e[0m'
elif [[ "${BASH}" == *"bash"* ]]
then
read -p $'\e[01;31m¿Realmente desea subir los archivos anteriores ('"${#file_array[@]}"$') a "transfer.sh"? (Y/n): \e[0m' upload_files
fi
case "${upload_files:-y}" in
"y"|"Y")
# para la barra de progreso, ejecutar "curl" para cada archivo.
# los parámetros "--include" y "--form" suprimirán la barra de progreso.
for file in "${file_array[@]}"
do
# mostrar el enlace de eliminación y filtrar el token de eliminación del encabezado de respuesta después de la subida.
# es importante guardar la "stdout" de "curl" mediante una subcapa a una variable o redirigirla a otro comando,
# que simplemente redirige a "stdout" para tener una salida coherente después.
# la barra de progreso se redirige a "stderr" y solo se muestra,
# si "stdout" está redirigido a algo; por ejemplo, ">/dev/null", "tee /dev/null" o "| <some_command>".
# el encabezado de respuesta se redirige a "stdout", por lo que redirigir "stdout" a "/dev/null" no tiene sentido.
# redirigir el "stderr" de "curl" a "stdout" ("2>&1") suprimirá la barra de progreso.
curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/")
awk_output=$(awk \
'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \
{
delete_link=$2;
print "Delete command: curl --request DELETE " "\""delete_link"\"";
gsub(".*/", "", delete_link);
delete_token=delete_link;
print "Delete token: " delete_token;
}
END{
print "Download link: " $0;
}' <<< "${curl_output}")
# devolver los resultados mediante "stdout", "awk" no hace esto por alguna razón.
echo -e "${awk_output}\n"
# evitar la limitación de velocidad tanto como sea posible; nginx: demasiadas solicitudes.
if (( ${#file_array[@]} > 4 ))
then
sleep 5
fi
done
;;
"n"|"N")
return 1
;;
*)
echo -e "\e[01;31mEntrada incorrecta: '${upload_files}'.\e[0m" >&2
return 1
esac
}
$ ls -lh
total 20M
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image.img
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image2.img
$ transfer image*
10240K image2.img
10240K image.img
20480K total
¿Realmente deseas subir los archivos anteriores (2) a "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
Comando de eliminación: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId"
Token de eliminación: mSctGx7pYCId
Enlace de descarga: https://transfer.sh/wJw9pz/image2.img
######################################################################################################################################################################################################################################## 100.0%
Comando de eliminación: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU"
Token de eliminación: nw7qaoiKUwCU
Enlace de descarga: https://transfer.sh/ljJc5I/image.img
$ transfer "image.img" | awk --field-separator=": " '/Delete token:/ { print $2 } /Download link:/ { print $2 }'
10240K image.img
10240K total
¿Realmente deseas subir los archivos anteriores (1) a "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
tauN5dE3fWJe
https://transfer.sh/MYkuqn/image.img```
<br />
---
<br />
## Contributions
Contributions are welcome.
<br />
---
<br />
## Creators
**Remco Verhoef**
- <https://twitter.com/remco_verhoef>
- <https://twitter.com/dutchcoders>
**Uvis Grinfelds**
<br />
---
<br />
## Maintainers
- **Andrea Spacca**
- **Stefan Benten**
<br />
---
<br />
## Copyright and License
Code and documentation copyright 2011-2018 Remco Verhoef.
Code and documentation copyright 2018-2020 Andrea Spacca.
Code and documentation copyright 2020- Andrea Spacca and Stefan Benten.
Code released under [the MIT license](https://github.com/dutchcoders/transfer.sh/blob/HEAD/LICENSE).
| Parámetro | Descripción | Valor | Env |
|---|
| listener | puerto a usar para http (:80) | LISTENER | |
| profile-listener | puerto a usar para el perfilador (:6060) | PROFILE_LISTENER | |
| force-https | redirigir a https | false | FORCE_HTTPS |
| tls-listener | puerto a usar para https (:443) | TLS_LISTENER | |
| tls-listener-only | bandera para habilitar solo el listener TLS | TLS_LISTENER_ONLY | |
| tls-cert-file | ruta al certificado TLS | TLS_CERT_FILE | |
| tls-private-key | ruta a la clave privada TLS | TLS_PRIVATE_KEY | |
| http-auth-user | usuario para autenticación HTTP básica en la subida | HTTP_AUTH_USER | |
| http-auth-pass | contraseña para autenticación HTTP básica en la subida | HTTP_AUTH_PASS | |
| http-auth-htpasswd | ruta del archivo htpasswd para autenticación HTTP básica en la subida | HTTP_AUTH_HTPASSWD | |
| http-auth-ip-whitelist | lista separada por comas de IPs permitidas para subir sin desafío de autenticación | HTTP_AUTH_IP_WHITELIST | |
| virustotal-key | clave de API de VirusTotal | VIRUSTOTAL_KEY | |
| ip-whitelist | lista separada por comas de IPs permitidas para conectarse al servicio | IP_WHITELIST | |
| ip-blacklist | lista separada por comas de IPs no permitidas para conectarse al servicio | IP_BLACKLIST | |
| temp-path | ruta a la carpeta temporal | temp del sistema | TEMP_PATH |
| web-path | ruta a los archivos web estáticos (para desarrollo o front-end personalizado) | WEB_PATH | |
| proxy-path | prefijo de ruta cuando el servicio está detrás de un proxy (se eliminará el prefijo /) | PROXY_PATH | |
| proxy-port | puerto del proxy cuando el servicio está detrás de un proxy | PROXY_PORT | |
| email-contact | contacto de correo electrónico para el front-end | EMAIL_CONTACT | |
| ga-key | clave de Google Analytics para el front-end | GA_KEY | |
| provider | qué proveedor de almacenamiento usar | (s3, storj, gdrive o local) | |
| uservoice-key | clave de UserVoice para el front-end | USERVOICE_KEY | |
| aws-access-key | clave de acceso AWS | AWS_ACCESS_KEY | |
| aws-secret-key | clave de acceso AWS | AWS_SECRET_KEY | |
| bucket | bucket de AWS | BUCKET | |
| s3-endpoint | endpoint S3 personalizado. | S3_ENDPOINT | |
| s3-region | región del bucket S3 | eu-west-1 | S3_REGION |
| s3-no-multipart | deshabilita la subida multiparte S3 | false | S3_NO_MULTIPART |
| s3-path-style | fuerza URLs de estilo ruta, necesario para Minio. | false | S3_PATH_STYLE |
| storj-access | Acceso para el proyecto | STORJ_ACCESS | |
| storj-bucket | Bucket a usar dentro del proyecto | STORJ_BUCKET | |
| basedir | ruta de almacenamiento para el proveedor local/gdrive | BASEDIR | |
| gdrive-client-json-filepath | ruta al archivo JSON de configuración del cliente OAuth para el proveedor gdrive | GDRIVE_CLIENT_JSON_FILEPATH | |
| gdrive-local-config-path | ruta para almacenar la caché de configuración local de transfer.sh para el proveedor gdrive | GDRIVE_LOCAL_CONFIG_PATH | |
| gdrive-chunk-size | tamaño de fragmento para subida a gdrive en megabytes, debe ser menor que la memoria disponible (8 MB) | GDRIVE_CHUNK_SIZE | |
| lets-encrypt-hosts | hosts a usar para los certificados Let's Encrypt (separados por comas) | HOSTS | |
| log | ruta al archivo de registro | LOG | |
| cors-domains | lista separada por comas de dominios para CORS, al establecerlo se habilita CORS | CORS_DOMAINS | |
| clamav-host | host para la función clamav | CLAMAV_HOST | |
| perform-clamav-prescan | prescanear cada subida usando clamav (clamav-host debe ser un socket Unix local clamd) | PERFORM_CLAMAV_PRESCAN | |
| rate-limit | solicitudes por minuto | RATE_LIMIT | |
| max-upload-size | tamaño máximo de subida en kilobytes | MAX_UPLOAD_SIZE | |
| purge-days | número de días después de los cuales las subidas se eliminan automáticamente | PURGE_DAYS | |
| purge-interval | intervalo (horas) para ejecutar la purga automática (excluye S3 y Storj) | PURGE_INTERVAL | |
| random-token-length | longitud del token aleatorio para la ruta de subida (el doble del tamaño para la ruta de eliminación) | 6 | RANDOM_TOKEN_LENGTH |
| Nombre | Uso |
|---|
| latest | Última compilación CI, puede ser nocturna, en commit, en tag, etc. |
| latest-noroot | Última compilación CI, puede ser nocturna, en commit, en tag, etc. usando [sin root] |
| nightly | Compilación CI programada cada medianoche UTC |
| nightly-noroot | Compilación CI programada cada medianoche UTC usando [sin root] |
| edge | Última compilación CI después de cada commit en main |
| edge-noroot | Última compilación CI después de cada commit en main usando [sin root] |
vx.y.z | Compilación CI después de etiquetar un lanzamiento |
vx.y.z-noroot | Compilación CI después de etiquetar un lanzamiento usando [sin root] |