تنزيل الملفات من Terminal في Linux لا يقتصر على أوامر curl وwget فقط، بل هناك أدوات وأوامر أخرى توفر مرونة إضافية وميزات مختلفة تساعد على تحميل الملفات بكفاءة أكبر. سواء كنت تبحث عن طريقة بديلة بسبب قيود معينة أو ترغب في تجربة أوامر جديدة تمنحك تحكمًا أفضل، فإن استكشاف هذه الأدوات سيساعدك على توسيع معرفتك وزيادة إنتاجيتك عند التعامل مع Terminal.
هل سبق لك أن واجهتَ مشكلةً في نظامٍ ما دون إمكانية إرسال طلب HTTP بسيط؟ ربما كنتَ تحاول إنقاذ نظامٍ ما أو إنشاء نسخة Docker. أحيانًا تحتاج إلى استخدام الأدوات المتاحة، وأحيانًا أخرى يكون الأمر مجرد فضول. إليك خمس طرق للاتصال وتنزيل الملفات عبر HTTP.
أولًا، فهم رأس HTTP الضروري
لإنشاء اتصالات HTTP، غالبًا ما تحتاج إلى إرسال رأس HTTP. ستحتاج إلى إنشاء رأس HTTP يدويًا لبعض الأوامر الموضحة أدناه، ولكنه ليس معقدًا.
رأس HTTP هو كتلة نصية صغيرة تُهيئ اتصال HTTP. في معظم الأمثلة أدناه، سيبدو رأس HTTP كما يلي:
GET / HTTP/1.1\r\n
HOST: example.com\r\n
\r\n
يُسمى السطر الأول سطر الطلب، وهو يُخبر العميل بجلب شيء ما من مسار مُحدد. المسار هو كل ما يأتي بعد .com أو .net، إلخ، في عنوان URL – على سبيل المثال، example.com/path/foo.
- يُحدد سطر المضيف اسم المضيف الذي نتصل به.
- ينتهي كل سطر بعلامة إرجاع (\r) وسطر جديد (\n). ينتهي العنوان بأكمله بسطر فارغ.
يقوم العنوان الموضح أعلاه بجلب المستند الرئيسي من example.com (المسار “/”). الآن وقد فهمت عنوان HTTP، يُمكنك استخدامه مع بعض الأوامر التالية.
Telnet، ولكنه يعمل فقط مع اتصالات HTTP التقليدية
يبدو الأمر التالي غريبًا، ولكن ما يحدث هو أننا نُنشئ عنوان HTTP مُخصصًا لأن Telnet ليس عميل HTTP. تُمثل الأقواس غلافًا فرعيًا، ويتم تنفيذ كل أمر – مفصولًا بفاصلة منقوطة – وإرساله إلى Telnet واحدًا تلو الآخر.
(echo "GET / HTTP/1.0"; echo "Host: example.com"; echo; sleep 1) | telnet example.com 80
على سبيل المثال، إذا قمت بتشغيل الأمر التالي في محطتك الطرفية، فستجد أن grep يستقبل كل سطر على حدة:
(echo foobar; sleep 1; echo foobaz) | grep foo
بالنسبة لـ Telnet، يعني هذا أنه يستقبل كل سطر في ترويسة HTTP على حدة، كتدفق بيانات. يرسل الأمر أيضًا سطرًا فارغًا (صدى) لإنهاء الاتصال، ثم ينتظر ثانية واحدة، مما يتيح للخادم وقتًا كافيًا للاستجابة. يُعدّ هذا الانتظار هشًا لأننا نخمن فقط مدة الاستجابة. قد تحتاج إلى تعديل هذه القيمة إذا انقطع الاتصال مبكرًا جدًا.
ملاحظة
لا يمكن لـ Telnet استخدام TLS، ولذلك سيعمل هذا فقط مع اتصالات HTTP العادية.
نصيحة
يُغلق HTTP/1.0 الاتصال تلقائيًا بمجرد استجابة الخادم، بينما لا يفعل HTTP/1.1 ذلك. لذلك، نستخدم HTTP/1.0، لأن Telnet غير موثوق به لتنزيل الملفات الكبيرة عبر HTTP، وبالتالي لا نحتاج إلى بقاء الاتصال مفتوحًا.
يمكنك تثبيت Telnet على Fedora باستخدام الأمر التالي:
sudo dnf install telnet -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install telnet -y
لمستخدمي Arch، أنتم غير محظوظين. Telnet غير متوفر في المستودعات الرسمية. مع ذلك، PuTTY متوفر، لذا يُمكنكم استخدامه بدلاً منه.
sudo pacman -S putty
Netcat أفضل قليلاً من Telnet
لإجراء اتصالات HTTP، يعمل أمر Netcat بشكل مشابه تقريبًا لأمر Telnet، باستثناء أننا نزوده برأس HTTP ككتلة نصية واحدة. يمكنك أن ترى من الأمثلة أعلاه وأدناه أن كل سطر في رأس HTTP ينتهي بحرف التحكم “\r\n” – مضاعفًا للسطر الأخير، للإشارة إلى نهاية الرأس.
لا يُعد أي من الأمثلة التالية (Netcat أو Ncat) موثوقًا به لتنزيل الملفات الكبيرة، ولكنه يُمكّن من تنزيل الملفات الصغيرة بسهولة.
HTTP العادي
لا يدعم Netcat بروتوكول TLS (HTTPS)، ولكن يُمكننا استخدامه لجلب HTTP العادي.
printf "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" | nc example.com 80
يمكنك تثبيت Netcat على Fedora باستخدام الأمر التالي:
sudo dnf install netcat -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install netcat-openbsd -y
بالنسبة لمستخدمي Arch، يتوفر Netcat في المستودع الإضافي:
sudo pacman -S openbsd-netcat
مع TLS
إذا كنت ترغب في الاتصال عبر اتصال TLS، فستحتاج إلى استخدام Ncat، وهو تحسين على Netcat، وهو جزء من مشروع Nmap. يمكن لـ Ncat أيضًا إنشاء اتصالات HTTP التقليدية.
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | ncat --ssl example.com 443
يمكنك تثبيت Ncat على Fedora باستخدام الأمر التالي:
sudo dnf install nmap-ncat -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install ncat -y
بالنسبة لمستخدمي Arch، يعد Ncat جزءًا من حزمة Nmap، لذا يجب عليك كتابة الأمر التالي:
sudo pacman -S nmap
عندما تشعر باليأس، استخدم مكتبة Requests لـ Python
يعمل الأمر التالي بشكل جيد مع النصوص العادية أو ملفات HTML، ولكنه لا يتعامل بشكل صحيح مع البيانات الثنائية (على سبيل المثال، الصور وملفات zip وما إلى ذلك).
python3 -c "import requests; print(requests.get('http://example.com').text)"
لتنزيل البيانات الثنائية بشكل صحيح، مثل الصور أو ملفات zip، استخدم الأمر التالي:
python3 -c "import requests; open('output_file.zip','wb').write(requests.get('http://example.com/file.zip').content)"
غيّر ملف “output_file.zip” ورابط URL.
على الرغم من أن معظم الأنظمة غالبًا ما تكون مُثبّتة مسبقًا باستخدام Python 3 (و pip)، ستحتاج إلى تثبيت مكتبة الطلبات بشكل منفصل. يمكنك تثبيتها إما باستخدام pip أو مدير الحزم في توزيعتك.
إذا لم تكن لديك صلاحيات إدارية، يمكنك تثبيتها في المجلد الرئيسي للمستخدم باستخدام pip. اكتب الأمر التالي:
pip install --user requests
بإمكانك تثبيت الطلبات عبر مدير الحزم في Fedora باستخدام الأمر التالي:
sudo dnf install python3-requests -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install python3-requests -y
بالنسبة لـ Arch، اكتب الأمر التالي:
sudo pacman -S python-requests
HTTPie: أداة مفيدة
يُعرّف HTTPie نفسه بأنه أداة لاختبار واجهات برمجة تطبيقات REST (خدمات صفحات الويب). يُجري الأمر التالي طلبًا بسيطًا للحصول على مستند HTML الموجود على example.com:
http GET example.com
يدعم HTTPie العديد من الميزات المريحة التي تُسهّل كتابة عناوين URL. على سبيل المثال، سيتصل الأمر التالي بخادم مُستضاف محليًا على نظامك على المنفذ 3000:
http :3000
إن إضافة المعلمات إلى عنوان URL أمر بسيط مثل استخدام علامة يساوي مزدوجة:
http httpbin.org/anything foo==bar
سيؤدي هذا إلى إنشاء عنوان URL يبدو مثل http://httpbin.org/anything?foo=bar.
لإجراء اتصال HTTPS، استخدم الأمر التالي:
https GET example.com
على الرغم من أن HTTPie يهدف في المقام الأول إلى مساعدة المطورين، إلا أنه يعمل أيضًا بشكل جيد كعميل HTTP عادي، مما يجعله مثاليًا لتنزيل الملفات.
يمكنك تثبيت HTTPie على Fedora باستخدام الأمر التالي:
sudo dnf install httpie -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install httpie -y
بالنسبة لـ Arch، اكتب الأمر التالي:
sudo pacman -S httpie
Aria2: أداة فعّالة لتنزيل الملفات على الأجهزة الطرفية.
يدعم بروتوكولات متعددة، بما في ذلك HTTP وHTTPS وFTP وSFTP وBitTorrent وWebSocket وغيرها. كما يُسرّع التنزيلات من خلال إنشاء اتصالات متوازية متعددة. لتنزيل ملف، ما عليك سوى تحديد المجلد باستخدام العلامة “-d” واسم الملف الناتج باستخدام العلامة “-o”.
aria2c -d /tmp -o test.html http://example.com
يعمل Aria2 بسلاسة مع HTTP وHTTPS، وتنزيل مستندات HTML والملفات.
يمكنك تثبيت Aria2 على فيدورا باستخدام الأمر التالي:
sudo dnf install aria2 -y
بالنسبة لـ Debian والأنظمة الأخرى، اكتب الأمر التالي:
sudo apt install aria2 -y
بالنسبة لـ Arch، اكتب الأمر التالي:
sudo pacman -S aria2
بسبب سوء التعامل مع HTTP، لا تعمل أوامر Telnet وNetcat إلا مع الملفات التي لا يزيد حجمها عن بضعة كيلوبايت. لتنزيل ملفات أكبر، ستحتاج إلى استخدام عميل HTTP مناسب. تعمل أوامر Python وHTTPie وaria2 جميعها كعملاء HTTP حقيقيين. للمساعدة في تحديد ما إذا كنت تستخدم عميل HTTP حقيقيًا، اسأل نفسك عما إذا كنت بحاجة إلى حقن رؤوس HTTP يدويًا؛ إذا كنت بحاجة إلى ذلك، فمن المحتمل أنك لا تستخدم عميل HTTP حقيقيًا.
عمليًا، تُستخدم Telnet وNetcat بشكل أساسي كأدوات طوارئ: مفيدة عند الحاجة إلى اختبار اتصال دون توفر أدوات متخصصة. على أقل تقدير، توفران مقدمة شيقة للمستويات الأدنى من اتصال HTTP.
إذا كنت ترغب في معرفة المزيد عن Telnet، يمكنك قراءة مقالتنا حول الاختلافات بين Telnet وSSH. أو لدينا مقال آخر يشرح بالتفصيل العديد من حالات الاستخدام الأخرى لـ Netcat. وأخيرًا، لدينا دليل مفصل حول كيفية استخدام HTTPie، وهي أداة مفيدة للغاية.
استخدام التيرمنال في Linux يمنحك خيارات متعددة لتنزيل الملفات، ولا يقتصر الأمر على الأدوات الأكثر شيوعًا فقط. بعض الأوامر توفر خصائص متقدمة مثل استئناف التحميل أو إدارة بروتوكولات مختلفة، بينما يركز البعض الآخر على البساطة والسرعة. اختيار الأداة المناسبة يعتمد على احتياجاتك، وتجربة أكثر من طريقة ستمنحك مرونة أكبر في التعامل مع الملفات بكفاءة.