
مشاركة ملفات سهلة وسريعة من سطر الأوامر.
تجاوز فلتر IP وتوثيق HTTP عبر تزوير رأس X-Forwarded-For غير الموثَّق
مشاركة ملفات سهلة وسريعة من سطر الأوامر. يحتوي هذا الكود على الخادم بكل ما تحتاجه لإنشاء نسختك الخاصة.
يدعم Transfer.sh حاليًا مزودات s3 (Amazon S3) و gdrive (Google Drive) و storj (Storj) ونظام الملفات المحلي (local).
@stefanbenten هو أحد صيانة هذا المستودع و الشخص الذي يستضيف تثبيتًا عامًا معروفًا للبرنامج في المستودع.
الاثنان غير مرتبطين على أي حال، والمستودع ليس المكان المناسب لتوجيه الطلبات والمشكلات لأي من التثبيت العام.
لن يتم الإعلان عن أي تثبيت عام من طرف ثالث للبرنامج في المستودع أو ذكره في المستودع نفسه، لأسباب أمنية.
الموقف الرسمي لي، @aspacca، كصيان للمستودع، هو أنك إذا أردت استخدام البرنامج فيجب عليك استضافة تثبيتك الخاص.
يحدد هذا القسم كيفية استخدام transfer.sh
$ curl -v --upload-file ./hello.txt https://transfer.sh/hello.txt
<br />
### تشفير ورفع```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 />
### الرفع إلى Virustotal```bash
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
$ curl -X DELETE
<br />
---
<br />
## رؤوس الطلبات
يشرح هذا القسم كيفية التعامل مع رؤوس الطلبات باستخدام 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
#### تحذير: استخدم هذه الميزة فقط على الخادم المستضاف ذاتيًا: الثقة في خدمة طرف ثالث لتشفير جانب الخادم هي على مسؤوليتك الخاصة.```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 />
## ترويسات الاستجابة
يشرح هذا القسم كيفية التعامل مع ترويسات الاستجابة:
<br />
### X-Url-Delete
عنوان URL المستخدم لطلب حذف ملف ويُعاد كترويسة استجابة:```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
انظر الأمثلة الجيدة للاستخدام في examples.md
إنشاء رابط تحميل مباشر:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/get/1lDau/test.txt
ملف مضمن:
https://transfer.sh/1lDau/test.txt --> https://transfer.sh/inline/1lDau/test.txt
إذا كنت ترغب في استخدام TLS باستخدام شهادات Let's Encrypt، فقم بتعيين lets-encrypt-hosts إلى نطاقك، واضبط tls-listener إلى :443 وفعّل force-https.
إذا كنت ترغب في استخدام TLS باستخدام شهاداتك الخاصة، فقم بتعيين tls-listener إلى :443، force-https، tls-cert-file و tls-private-key.
تم التبديل إلى GO111MODULE```bash go run main.go --provider=local --listener :8080 --temp-path=/tmp/ --basedir=/tmp/
<br />
---
<br />
## بناء```bash
$ git clone [email protected]:dutchcoders/transfer.sh.git
$ cd transfer.sh
$ go build -o transfersh main.go
للنشر السهل، قمنا بإنشاء حاوية Docker رسمية. هناك نوعان، يختلفان فقط في المستخدم الذي يقوم بتشغيل العملية.
النوع الافتراضي سيعمل كمستخدم root:
[!WARNING] يُنصح بعدم استخدام وسم
latestمع WatchTower أو أدوات مشابهة. يمكن أن يشير وسمlatestإلى إصدارات مطورين غير مُصدرة، وبنيات اختبارية، وإصدارات تصحيحية للإصدارات القديمة. استخدم وسم إصدار فعلي حتى يدعم transfer.sh وسوم الإصدارات الرئيسية أو الثانوية.```bash docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/
<br />
### بدون صلاحية الجذر
تشير العلامات `-noroot` إلى بناء الصور التي تعمل بأقل الامتيازات لتقليل سطح الهجوم في حال تعرض التطبيق للاختراق.
> [!NOTE]
> استخدام `-noroot` **موصى به**
<br />
النسخة الموسومة باللاحقة `-noroot` ستستخدم `5000` لكل من UID و GID:```bash
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/
[!NOTE] تفاصيل تاريخ التطوير في:
يمكنك أيضًا بناء الحاوية بنفسك. يتيح لك هذا اختيار UID/GID الذي سيتم استخدامه، على سبيل المثال عند استخدام تركيبات NFS:```bash
docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .
<br />
---
<br />
## استخدام S3
لاستخدام S3 مع دلو أمازون S3، تحتاج فقط إلى تحديد الخيارات التالية:
- المزوّد `--provider s3`
- مفتاح الوصول AWS _(إما عبر العلامة أو المتغير البيئي `AWS_ACCESS_KEY`)_
- المفتاح السري AWS _(إما عبر العلامة أو المتغير البيئي `AWS_SECRET_KEY`)_
- الدلو _(إما عبر العلامة أو المتغير البيئي `BUCKET`)_
- منطقة S3 _(إما عبر العلامة أو المتغير البيئي `S3_REGION`)_
إذا قمت بتحديد منطقة S3، فلن تحتاج إلى تعيين عنوان URL لنقطة النهاية حيث سيتم استخدام النقطة النهائية الصحيحة تلقائيًا.
<br />
### مزوّدو S3 المخصصون
لاستخدام مزوّد S3 مخصص غير تابع لـ AWS، تحتاج إلى تحديد نقطة النهاية كما هو محدد من مزوّد السحابة الخاص بك.
<br />
---
<br />
## مزوّد شبكة Storj
لاستخدام شبكة Storj كمزوّد تخزين، تحتاج إلى تحديد العلامات التالية:
- المزوّد `--provider storj`
- وصول Storj _(إما عبر العلامة أو المتغير البيئي `STORJ_ACCESS`)_
- دلو Storj _(إما عبر العلامة أو المتغير البيئي `STORJ_BUCKET`)_
<br />
### إنشاء الدلو والنطاق
تحتاج إلى إنشاء منحة وصول (أو نسخها من تكوين uplink) ودلو تحضيريًا.
للبدء، قم بتسجيل الدخول إلى حسابك وانتقل إلى قائمة منح الوصول وابدأ المعالج في الزاوية اليمنى العلوية.
أدخل اسم منحة الوصول الذي تختاره، اضغط *التالي* وقيّدها حسب الحاجة/التفضيل. بعد ذلك، تابع إما في واجهة سطر الأوامر أو داخل المتصفح. بعد ذلك، سيُطلب منك عبارة مرور تُستخدم كمفتاح تشفير.
**تأكد من حفظها في مكان آمن. بدونها، ستفقد القدرة على فك تشفير ملفاتك!**
بعد ذلك، يمكنك نسخ منحة الوصول ثم بدء تشغيل نقطة نهاية transfer.sh. يُوصى بتوفير كل من منحة الوصول واسم الدلو كمتغيرات بيئية لتعزيز الأمان.
مثال:```
export STORJ_BUCKET=<BUCKET NAME>
export STORJ_ACCESS=<ACCESS GRANT>
transfer.sh --provider storj
للاستخدام مع Google Drive، تحتاج إلى تحديد الخيارات التالية:
تحتاج إلى إنشاء معرف عميل OAuth من console.cloud.google.com، وتنزيل الملف، ووضعه في دليل آمن.
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 arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>\n">&2; return 1; fi; file_name=$(basename "$1"); if [ -t 0 ]; then file="$1"; if [ ! -e "$file" ]; then echo "$file: No such file or directory">&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} - قم بتحميل ملفات عشوائية إلى \"transfer.sh\"."
echo ""
echo "الاستخدام: ${0} [خيارات] [<ملف>]..."
echo ""
echo "الخيارات:"
echo " -h, --help"
echo " عرض هذه الرسالة"
echo ""
echo "أمثلة:"
echo " تحميل ملف واحد من مجلد العمل الحالي:"
echo " ${0} \"image.img\""
echo ""
echo " تحميل ملفات متعددة من مجلد العمل الحالي:"
echo " ${0} \"image.img\" \"image2.img\""
echo ""
echo " تحميل ملف من مجلد مختلف:"
echo " ${0} \"/tmp/some_file\""
echo ""
echo " تحميل جميع الملفات من مجلد العمل الحالي. انتبه إلى تحديد معدل خادم الويب!:"
echo " ${0} *"
echo ""
echo " تحميل ملف واحد من مجلد العمل الحالي واستخراج رمز الحذف ورابط التحميل:"
echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
echo ""
echo " عرض نص المساعدة من \"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}' لم يتم العثور عليه أو ليس ملفًا.\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
# be compatible with "bash"
if [[ "${ZSH_NAME}" == "zsh" ]]
then
read $'upload_files?\e[01;31mهل تريد حقًا تحميل الملفات أعلاه ('"${#file_array[@]}"$') إلى "transfer.sh"؟ (Y/n): \e[0m'
elif [[ "${BASH}" == *"bash"* ]]
then
read -p $'\e[01;31mهل تريد حقًا تحميل الملفات أعلاه ('"${#file_array[@]}"$') إلى "transfer.sh"؟ (Y/n): \e[0m' upload_files
fi
case "${upload_files:-y}" in
"y"|"Y")
# من أجل شريط التقدم، قم بتنفيذ 'curl' لكل ملف. المعلمات '--include' و '--form' ستقوم بإخفاء شريط التقدم.
for file in "${file_array[@]}"
do
# عرض رابط الحذف واستخراج رمز الحذف من رأس الاستجابة بعد التحميل.
# من المهم حفظ 'stdout' الخاص بـ 'curl' عبر قشرة فرعية إلى متغير أو توجيهه إلى أمر آخر،
# والذي يعيد التوجيه إلى 'stdout' للحصول على مخرجات سليمة بعد ذلك.
# يتم توجيه شريط التقدم إلى 'stderr' ويتم عرضه فقط،
# إذا تم توجيه 'stdout' إلى شيء ما؛ على سبيل المثال '>/dev/null'، 'tee /dev/null' أو '| <some_command>'.
# يتم توجيه رأس الاستجابة إلى 'stdout'، لذا فإن توجيه 'stdout' إلى '/dev/null' لا معنى له.
# توجيه 'stderr' الخاص بـ 'curl' إلى 'stdout' ('2>&1') سيخفي شريط التقدم.
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_link"\"";
gsub(".*/", "", delete_link);
delete_token=delete_link;
print "رمز الحذف: " delete_token;
}
END{
print "رابط التحميل: " $0;
}' <<< "${curl_output}")
# إرجاع النتائج عبر 'stdout'، لا يقوم 'awk' بذلك لسبب ما.
echo -e "${awk_output}\n"
# تجنب تحديد المعدل قدر الإمكان؛ nginx: طلبات كثيرة جدًا.
if (( ${#file_array[@]} > 4 ))
then
sleep 5
fi
done
;;
"n"|"N")
return 1
;;
*)
echo -e "\e[01;31mإدخال خاطئ: '${upload_files}'.\e[0m" >&2
return 1
esac
}```
</p></details>
#### Sample output
```bash
| Parameter | Description | Value | Env |
|---|
| listener | المنفذ لاستخدامه لـ http (:80) | LISTENER | |
| profile-listener | المنفذ لاستخدامه للمُحلل (:6060) | PROFILE_LISTENER | |
| force-https | إعادة التوجيه إلى https | false | FORCE_HTTPS |
| tls-listener | المنفذ لاستخدامه لـ https (:443) | TLS_LISTENER | |
| tls-listener-only | علم لتفعيل مستمع tls فقط | TLS_LISTENER_ONLY | |
| tls-cert-file | مسار شهادة tls | TLS_CERT_FILE | |
| tls-private-key | مسار المفتاح الخاص لـ tls | TLS_PRIVATE_KEY | |
| http-auth-user | المستخدم للمصادقة الأساسية على http عند الرفع | HTTP_AUTH_USER | |
| http-auth-pass | كلمة المرور للمصادقة الأساسية على http عند الرفع | HTTP_AUTH_PASS | |
| http-auth-htpasswd | مسار ملف htpasswd للمصادقة الأساسية على http عند الرفع | HTTP_AUTH_HTPASSWD | |
| http-auth-ip-whitelist | قائمة مفصولة بفواصل لعناوين IP المسموح لها بالرفع دون تحدٍ للمصادقة | HTTP_AUTH_IP_WHITELIST | |
| virustotal-key | مفتاح API لـ VirusTotal | VIRUSTOTAL_KEY | |
| ip-whitelist | قائمة مفصولة بفواصل لعناوين IP المسموح لها بالاتصال بالخدمة | IP_WHITELIST | |
| ip-blacklist | قائمة مفصولة بفواصل لعناوين IP غير المسموح لها بالاتصال بالخدمة | IP_BLACKLIST | |
| temp-path | مسار المجلد المؤقت | temp النظام | TEMP_PATH |
| web-path | مسار ملفات الويب الثابتة (للتطوير أو واجهة أمامية مخصصة) | WEB_PATH | |
| proxy-path | بادئة المسار عند تشغيل الخدمة خلف بروكسي (سيتم إزالة البادئة /) | PROXY_PATH | |
| proxy-port | منفذ البروكسي عند تشغيل الخدمة خلف بروكسي | PROXY_PORT | |
| email-contact | البريد الإلكتروني للتواصل للواجهة الأمامية | EMAIL_CONTACT | |
| ga-key | مفتاح Google Analytics للواجهة الأمامية | GA_KEY | |
| provider | مزود التخزين الذي سيتم استخدامه | (s3, storj, gdrive أو local) | |
| uservoice-key | مفتاح User Voice للواجهة الأمامية | USERVOICE_KEY | |
| aws-access-key | مفتاح الوصول لـ AWS | AWS_ACCESS_KEY | |
| aws-secret-key | مفتاح الوصول السري لـ AWS | AWS_SECRET_KEY | |
| bucket | حاوية AWS | BUCKET | |
| s3-endpoint | نقطة نهاية S3 مخصصة. | S3_ENDPOINT | |
| s3-region | منطقة حاوية S3 | eu-west-1 | S3_REGION |
| s3-no-multipart | تعطيل الرفع المتعدد الأجزاء لـ S3 | false | S3_NO_MULTIPART |
| s3-path-style | فرض نمط مسار URLs، مطلوب لـ Minio. | false | S3_PATH_STYLE |
| storj-access | وصول المشروع | STORJ_ACCESS | |
| storj-bucket | الحاوية المستخدمة داخل المشروع | STORJ_BUCKET | |
| basedir | مسار التخزين لمزود local/gdrive | BASEDIR | |
| gdrive-client-json-filepath | مسار ملف تهيئة JSON لعميل OAuth لمزود gdrive | GDRIVE_CLIENT_JSON_FILEPATH | |
| gdrive-local-config-path | مسار تخزين ذاكرة التخزين المؤقت لتهيئة transfer.sh المحلية لمزود gdrive | GDRIVE_LOCAL_CONFIG_PATH | |
| gdrive-chunk-size | حجم القطعة لرفع gdrive بالميغابايت، يجب أن يكون أقل من الذاكرة المتاحة (8 MB) | GDRIVE_CHUNK_SIZE | |
| lets-encrypt-hosts | المضيفات لاستخدام شهادات Let's Encrypt (مفصولة بفواصل) | HOSTS | |
| log | مسار ملف السجل | LOG | |
| cors-domains | قائمة مفصولة بفواصل للنطاقات لـ CORS، تعيينها لتفعيل CORS | CORS_DOMAINS | |
| clamav-host | المضيف لميزة ClamAV | CLAMAV_HOST | |
| perform-clamav-prescan | فحص مسبق لكل رفع باستخدام ClamAV (يجب أن يكون clamav-host هو clamd محلي على مقبس Unix) | PERFORM_CLAMAV_PRESCAN | |
| rate-limit | طلب في الدقيقة | RATE_LIMIT | |
| max-upload-size | الحد الأقصى لحجم الرفع بالكيلوبايت | MAX_UPLOAD_SIZE | |
| purge-days | عدد الأيام بعدها يتم مسح الرفوعات تلقائياً | PURGE_DAYS | |
| purge-interval | الفاصل الزمني (بالساعات) لتشغيل المسح التلقائي (باستثناء S3 و Storj) | PURGE_INTERVAL | |
| random-token-length | طول الرمز العشوائي لمسار الرفع (ضعف الحجم لمسار الحذف) | 6 | RANDOM_TOKEN_LENGTH |
| الاسم | الاستخدام |
|---|
| latest | أحدث بناء CI، يمكن أن يكون ليليًا، عند الالتزام، عند العلامة، إلخ. |
| latest-noroot | أحدث بناء CI، يمكن أن يكون ليليًا، عند الالتزام، عند العلامة، إلخ. باستخدام [بدون الجذر] |
| nightly | بناء CI مجدول كل منتصف ليل UTC |
| nightly-noroot | بناء CI مجدول كل منتصف ليل UTC باستخدام [بدون الجذر] |
| edge | أحدث بناء CI بعد كل التزام على main |
| edge-noroot | أحدث بناء CI بعد كل التزام على main باستخدام [بدون الجذر] |
vx.y.z | بناء CI بعد وضع علامة على الإصدار |
vx.y.z-noroot | بناء CI بعد وضع علامة على الإصدار باستخدام [بدون الجذر] |
$ 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 هل تريد حقًا رفع الملفات أعلاه (2) إلى transfer.sh؟ (Y/n): ######################################################################################################################################################################################################################################## 100.0% أمر الحذف: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId" رمز الحذف: mSctGx7pYCId رابط التنزيل: https://transfer.sh/wJw9pz/image2.img
######################################################################################################################################################################################################################################## 100.0% أمر الحذف: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU" رمز الحذف: nw7qaoiKUwCU رابط التنزيل: 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 هل تريد حقًا رفع الملفات أعلاه (1) إلى 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).