
Einfaches und schnelles Dateiteilen von der Kommandozeile.
IP-Filter und HTTP-Authentifizierungsumgehung durch nicht authentifiziertes X-Forwarded-For-Header-Spoofing
Einfaches und schnelles Dateiteilen von der Kommandozeile. Dieser Code enthält den Server mit allem, was Sie benötigen, um Ihre eigene Instanz zu erstellen.
Transfer.sh unterstützt derzeit die Anbieter s3 (Amazon S3), gdrive (Google Drive), storj (Storj) und das lokale Dateisystem (local).
@stefanbenten ist ein Betreuer dieses Repositorys und die Person, die eine bekannte öffentliche Installation der Software im Repo hostet.
Die beiden sind dennoch unabhängig voneinander, und das Repo ist nicht der Ort, um Anfragen und Probleme für eine der öffentlichen Installationen zu richten.
Aus Sicherheitsgründen werden keine öffentlichen Installationen von Drittanbietern der Software im Repo selbst beworben oder erwähnt.
Die offizielle Position von mir, @aspacca, als Betreuer des Repos, ist, dass Sie, wenn Sie die Software nutzen möchten, Ihre eigene Installation hosten sollten.
In diesem Abschnitt wird beschrieben, wie Sie transfer.sh verwenden.
$ curl -v --upload-file ./hello.txt https://transfer.sh/hello.txt
### Verschlüsseln & Hochladen```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
### Hochladen zu Virustotal```bash
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
$ curl -X DELETE
<br />
---
<br />
## Anforderungs-Header
Dieser Abschnitt erklärt, wie Sie mit curl Anforderungs-Header verarbeiten können:
<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
#### Vorsicht, verwenden Sie diese Funktion nur auf Ihrem selbst gehosteten Server: Die Nutzung eines Drittanbieterdienstes für serverseitige Verschlüsselung erfolgt auf eigenes Risiko```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 />
## Antwort-Header
In diesem Abschnitt wird erläutert, wie Antwort-Header behandelt werden:
<br />
### X-Url-Delete
Die URL, die zum Anfordern des Löschens einer Datei verwendet wird und als Antwort-Header zurückgegeben wird:```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
Siehe gute Anwendungsbeispiele in examples.md
Erstelle direkten Download-Link:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/get/1lDau/test.txt
Inline-Datei:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/inline/1lDau/test.txt
Wenn Sie TLS mit Let's-Encrypt-Zertifikaten verwenden möchten, setzen Sie lets-encrypt-hosts auf Ihre Domain, setzen Sie tls-listener auf :443 und aktivieren Sie force-https.
Wenn Sie TLS mit eigenen Zertifikaten verwenden möchten, setzen Sie tls-listener auf :443, force-https, tls-cert-file und tls-private-key.
Umgestellt auf GO111MODULE```bash go run main.go --provider=local --listener :8080 --temp-path=/tmp/ --basedir=/tmp/
<br />
---
<br />
## Erstellen```bash
$ git clone [email protected]:dutchcoders/transfer.sh.git
$ cd transfer.sh
$ go build -o transfersh main.go
Für eine einfache Bereitstellung haben wir einen offiziellen Docker-Container erstellt. Es gibt zwei Varianten, die sich nur darin unterscheiden, welcher Benutzer den Prozess ausführt.
Die Standardvariante läuft als root:
[!WARNING] Es wird davon abgeraten, den
latest-Tag für WatchTower oder ähnliche Werkzeuge zu verwenden. Derlatest-Tag kann auf unveröffentlichte Entwickler-, Test-Builds und Patch-Releases für ältere Versionen verweisen. Verwenden Sie einen tatsächlichen Versionstag, bis transfer.sh Major- oder Minor-Versionstags unterstützt.```bash docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
<br />
### Kein Root
Die mit `-noroot` gekennzeichneten Image-Builds laufen mit geringsten Privilegien, um die Angriffsfläche zu reduzieren, falls eine Anwendung kompromittiert wird.
> [!NOTE]
> Die Verwendung von `-noroot` wird **empfohlen**
<br />
Der mit dem Suffix `-noroot` getaggte verwendet `5000` sowohl als UID als auch GID:```bash
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
[!NOTE] Details zur Entwicklungsgeschichte unter:
Sie können den Container auch selbst erstellen. So können Sie wählen, welche UID/GID verwendet wird, z. B. bei Verwendung von NFS-Mounts:```bash
docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .
<br />
---
<br />
## S3 Verwendung
Für die Verwendung mit einem AWS S3 Bucket müssen Sie lediglich die folgenden Optionen angeben:
- provider `--provider s3`
- aws-access-key _(entweder über Flag oder Umgebungsvariable `AWS_ACCESS_KEY`)_
- aws-secret-key _(entweder über Flag oder Umgebungsvariable `AWS_SECRET_KEY`)_
- bucket _(entweder über Flag oder Umgebungsvariable `BUCKET`)_
- s3-region _(entweder über Flag oder Umgebungsvariable `S3_REGION`)_
Wenn Sie die s3-region angeben, müssen Sie die Endpunkt-URL nicht festlegen, da der korrekte Endpunkt automatisch verwendet wird.
<br />
### Benutzerdefinierte S3-Anbieter
Um einen benutzerdefinierten Nicht-AWS S3-Anbieter zu verwenden, müssen Sie den von Ihrem Cloud-Anbieter definierten Endpunkt angeben.
<br />
---
<br />
## Storj Netzwerkanbieter
Um das Storj-Netzwerk als Speicheranbieter zu verwenden, müssen Sie die folgenden Flags angeben:
- provider `--provider storj`
- storj-access _(entweder über Flag oder Umgebungsvariable STORJ_ACCESS)_
- storj-bucket _(entweder über Flag oder Umgebungsvariable STORJ_BUCKET)_
<br />
### Bucket und Bereich erstellen
Sie müssen im Voraus einen Zugriffsgrant (oder aus der Uplink-Konfiguration kopieren) und einen Bucket erstellen.
Um zu beginnen, melden Sie sich bei Ihrem Konto an, gehen Sie zum Menü für Zugriffsgrants und starten Sie den Assistenten oben rechts.
Geben Sie Ihren gewünschten Zugriffsgrant-Namen ein, klicken Sie auf *Weiter* und schränken Sie ihn nach Bedarf/Präferenz ein.
Fahren Sie danach entweder in der CLI oder im Browser fort. Als Nächstes werden Sie nach einer Passphrase gefragt, die als Verschlüsselungsschlüssel dient.
**Stellen Sie sicher, dass Sie sie an einem sicheren Ort aufbewahren. Ohne sie verlieren Sie die Fähigkeit, Ihre Dateien zu entschlüsseln!**
Danach können Sie den Zugriffsgrant kopieren und dann den Start des transfer.sh-Endpunkts beginnen.
Es wird empfohlen, sowohl den Zugriffsgrant als auch den Bucket-Namen als Umgebungsvariablen für erhöhte Sicherheit anzugeben.
Beispiel:```
export STORJ_BUCKET=<BUCKET NAME>
export STORJ_ACCESS=<ACCESS GRANT>
transfer.sh --provider storj
Für die Nutzung mit Google Drive müssen Sie die folgenden Optionen angeben:
Sie müssen eine OAuth Client id von console.cloud.google.com erstellen, die Datei herunterladen und in einem sicheren Verzeichnis ablegen.
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 "Keine Argumente angegeben.\nVerwendung:\n transfer <datei|verzeichnis>\n ... | transfer <dateiname>\n">&2; return 1; fi; file_name=$(basename "$1"); if [ -t 0 ]; then file="$1"; if [ ! -e "$file" ]; then echo "$file: Datei oder Verzeichnis nicht gefunden">&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```
transfer() { local file declare -a file_array file_array=("${@}")
if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
then
echo "${0} - Beliebige Dateien hochladen zu \"transfer.sh\"."
echo ""
echo "Verwendung: ${0} [Optionen] [<Datei>]..."
echo ""
echo "OPTIONEN:"
echo " -h, --help"
echo " diese Nachricht anzeigen"
echo ""
echo "BEISPIELE:"
echo " Eine einzelne Datei aus dem aktuellen Arbeitsverzeichnis hochladen:"
echo " ${0} \"image.img\""
echo ""
echo " Mehrere Dateien aus dem aktuellen Arbeitsverzeichnis hochladen:"
echo " ${0} \"image.img\" \"image2.img\""
echo ""
echo " Eine Datei aus einem anderen Verzeichnis hochladen:"
echo " ${0} \"/tmp/some_file\""
echo ""
echo " Alle Dateien aus dem aktuellen Arbeitsverzeichnis hochladen. Beachten Sie die Ratenbegrenzung des Webservers!:"
echo " ${0} *"
echo ""
echo " Eine einzelne Datei aus dem aktuellen Arbeitsverzeichnis hochladen und das Lösch-Token sowie den Download-Link herausfiltern:"
echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
echo ""
echo " Hilfetext von \"transfer.sh\" anzeigen:"
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}' konnte nicht gefunden werden oder ist keine Datei.\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
# kompatibel mit "bash"
if [[ "${ZSH_NAME}" == "zsh" ]]
then
read $'upload_files?\e[01;31mMöchten Sie die obigen Dateien ('"${#file_array[@]}"$') wirklich auf "transfer.sh" hochladen? (Y/n): \e[0m'
elif [[ "${BASH}" == *"bash"* ]]
then
read -p $'\e[01;31mMöchten Sie die obigen Dateien ('"${#file_array[@]}"$') wirklich auf "transfer.sh" hochladen? (Y/n): \e[0m' upload_files
fi
case "${upload_files:-y}" in
"y"|"Y")
# wegen der Fortschrittsanzeige wird "curl" für jede Datei ausgeführt.
# die Parameter "--include" und "--form" unterdrücken die Fortschrittsanzeige.
for file in "${file_array[@]}"
do
# Löschlink anzeigen und das Lösch-Token aus dem Antwortheader nach dem Hochladen herausfiltern.
# es ist wichtig, "curl's" "stdout" mittels Subshell in einer Variable zu speichern oder an einen anderen Befehl umzuleiten,
# der dann einfach nach "stdout" umleitet, um eine vernünftige Ausgabe zu erhalten.
# die Fortschrittsanzeige wird nach "stderr" umgeleitet und wird nur angezeigt,
# wenn "stdout" auf etwas umgeleitet wird; z.B. ">/dev/null", "tee /dev/null" oder "| <some_command>".
# der Antwortheader wird nach "stdout" umgeleitet, daher ergibt es keinen Sinn, "stdout" nach "/dev/null" umzuleiten.
# wenn "curl's" "stderr" nach "stdout" umgeleitet wird ("2>&1"), wird die Fortschrittsanzeige unterdrückt.
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 "Löschbefehl: curl --request DELETE " "\""delete_link"\"";
gsub(".*/", "", delete_link);
delete_token=delete_link;
print "Lösch-Token: " delete_token;
}
END{
print "Download-Link: " $0;
}' <<< "${curl_output}")
# die Ergebnisse über "stdout" zurückgeben, "awk" macht das aus irgendeinem Grund nicht.
echo -e "${awk_output}\n"
# Ratenbegrenzung so weit wie möglich vermeiden; nginx: zu viele Anfragen.
if (( ${#file_array[@]} > 4 ))
then
sleep 5
fi
done
;;
"n"|"N")
return 1
;;
*)
echo -e "\e[01;31mFalsche Eingabe: '${upload_files}'.\e[0m" >&2
return 1
esac
| Parameter | Beschreibung | Wert | Env |
|---|
| listener | Zu verwendender Port für HTTP (:80) | LISTENER | |
| profile-listener | Zu verwendender Port für Profiler (:6060) | PROFILE_LISTENER | |
| force-https | Weiterleitung zu HTTPS | false | FORCE_HTTPS |
| tls-listener | Zu verwendender Port für HTTPS (:443) | TLS_LISTENER | |
| tls-listener-only | Flag, um nur TLS-Listener zu aktivieren | TLS_LISTENER_ONLY | |
| tls-cert-file | Pfad zum TLS-Zertifikat | TLS_CERT_FILE | |
| tls-private-key | Pfad zum TLS-Private-Key | TLS_PRIVATE_KEY | |
| http-auth-user | Benutzer für einfache HTTP-Authentifizierung beim Upload | HTTP_AUTH_USER | |
| http-auth-pass | Passwort für einfache HTTP-Authentifizierung beim Upload | HTTP_AUTH_PASS | |
| http-auth-htpasswd | Htpasswd-Dateipfad für einfache HTTP-Authentifizierung beim Upload | HTTP_AUTH_HTPASSWD | |
| http-auth-ip-whitelist | Kommagetrennte Liste erlaubter IPs für Upload ohne Authentifizierungsaufforderung | HTTP_AUTH_IP_WHITELIST | |
| virustotal-key | VirusTotal-API-Schlüssel | VIRUSTOTAL_KEY | |
| ip-whitelist | Kommagetrennte Liste von IPs, die eine Verbindung zum Dienst herstellen dürfen | IP_WHITELIST | |
| ip-blacklist | Kommagetrennte Liste von IPs, die keine Verbindung zum Dienst herstellen dürfen | IP_BLACKLIST | |
| temp-path | Pfad zum temporären Ordner | System-Temp | TEMP_PATH |
| web-path | Pfad zu statischen Webdateien (für Entwicklung oder benutzerdefiniertes Frontend) | WEB_PATH | |
| proxy-path | Pfadpräfix, wenn der Dienst hinter einem Proxy ausgeführt wird (ein /-Präfix wird entfernt) | PROXY_PATH | |
| proxy-port | Port des Proxys, wenn der Dienst hinter einem Proxy ausgeführt wird | PROXY_PORT | |
| email-contact | E-Mail-Kontakt für das Frontend | EMAIL_CONTACT | |
| ga-key | Google-Analytics-Schlüssel für das Frontend | GA_KEY | |
| provider | Welcher Speicheranbieter verwendet werden soll | (s3, storj, gdrive oder local) | |
| uservoice-key | UserVoice-Schlüssel für das Frontend | USERVOICE_KEY | |
| aws-access-key | AWS-Zugriffsschlüssel | AWS_ACCESS_KEY | |
| aws-secret-key | AWS-Geheimschlüssel | AWS_SECRET_KEY | |
| bucket | AWS-Bucket | BUCKET | |
| s3-endpoint | Benutzerdefinierter S3-Endpunkt. | S3_ENDPOINT | |
| s3-region | Region des S3-Buckets | eu-west-1 | S3_REGION |
| s3-no-multipart | Deaktiviert S3-Multipart-Upload | false | S3_NO_MULTIPART |
| s3-path-style | Erzwingt Path-Style-URLs (erforderlich für Minio). | false | S3_PATH_STYLE |
| storj-access | Zugriff für das Projekt | STORJ_ACCESS | |
| storj-bucket | Zu verwendender Bucket innerhalb des Projekts | STORJ_BUCKET | |
| basedir | Pfadspeicher für lokalen/gdrive-Anbieter | BASEDIR | |
| gdrive-client-json-filepath | Pfad zur OAuth-Client-JSON-Konfiguration für gdrive-Anbieter | GDRIVE_CLIENT_JSON_FILEPATH | |
| gdrive-local-config-path | Pfad zum lokalen transfer.sh-Konfigurationscache für gdrive-Anbieter | GDRIVE_LOCAL_CONFIG_PATH | |
| gdrive-chunk-size | Chunk-Größe für gdrive-Upload in Megabyte, muss kleiner als verfügbarer Speicher sein (8 MB) | GDRIVE_CHUNK_SIZE | |
| lets-encrypt-hosts | Hosts für Let's-Encrypt-Zertifikate (kommagetrennt) | HOSTS | |
| log | Pfad zur Logdatei | LOG | |
| cors-domains | Kommagetrennte Liste von Domains für CORS; Aktivierung aktiviert CORS | CORS_DOMAINS | |
| clamav-host | Host für ClamAV-Funktion | CLAMAV_HOST | |
| perform-clamav-prescan | Vorab-Scan jedes Uploads mit ClamAV (clamav-host muss lokaler clamd-Unix-Socket sein) | PERFORM_CLAMAV_PRESCAN | |
| rate-limit | Anfragen pro Minute | RATE_LIMIT | |
| max-upload-size | Maximale Upload-Größe in Kilobyte | MAX_UPLOAD_SIZE | |
| purge-days | Anzahl der Tage, nach denen die Uploads automatisch gelöscht werden | PURGE_DAYS | |
| purge-interval | Intervall (Stunden) zum Ausführen der automatischen Bereinigung (außer S3 und Storj) | PURGE_INTERVAL | |
| random-token-length | Länge des zufälligen Tokens für den Upload-Pfad (doppelte Größe für den Löschpfad) | 6 | RANDOM_TOKEN_LENGTH |
| Name | Verwendung |
|---|
| latest | Neuester CI-Build, kann nächtlich, bei Commit, bei Tag, usw. sein. |
| latest-noroot | Neuester CI-Build, kann nächtlich, bei Commit, bei Tag, usw. sein, unter Verwendung von [no root] |
| nightly | Geplanter CI-Build jeden Mitternacht UTC |
| nightly-noroot | Geplanter CI-Build jeden Mitternacht UTC, unter Verwendung von [no root] |
| edge | Neuester CI-Build nach jedem Commit auf main |
| edge-noroot | Neuester CI-Build nach jedem Commit auf main, unter Verwendung von [no root] |
vx.y.z | CI-Build nach dem Taggen eines Releases |
vx.y.z-noroot | CI-Build nach dem Taggen eines Releases, unter Verwendung von [no root] |
}
</p></details>
#### Sample output
```bash
$ 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
Möchten Sie die obigen Dateien (2) wirklich auf "transfer.sh" hochladen? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
Löschbefehl: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId"
Lösch-Token: mSctGx7pYCId
Download-Link: https://transfer.sh/wJw9pz/image2.img
######################################################################################################################################################################################################################################## 100.0%
Löschbefehl: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU"
Lösch-Token: nw7qaoiKUwCU
Download-Link: 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
Möchten Sie die obigen Dateien (1) wirklich auf "transfer.sh" hochladen? (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).