در سیستم عامل لینوکس یکی از روشهای دانلود فایل و دریافت داده از سرورهای ریموت، استفاده از دستور curl در محیط Terminal است. اما این دستور صرفاً مخصوص دانلود نیست بلکه امکان ارسال درخواستها و تعامل با سرور ریموت را دارد. لذا برخی کاربران به جای wget از این دستور استفاده میکنند چرا که گاهی بسیار توانمندتر از wget است.
در ادامه با دستور curl و شیوهی استفاده از آن در Linux آشنا میشویم.
تفاوت بین curl و wget چیست؟
این دو دستور امکان تا حدی شبیه به هم هستند و ممکن است کاربران مبتدی تصور کنند که کاربردشان یکسان است اما در واقع تنها شباهت دستور curl و wget در این است که امکان دانلود فایل از منابع ریموت مثل سرور سایتها را فراهم میکنند.
دستور wget یک ابزار مدیریت دانلود بسیار قدرتمند است چرا که میتوانید فایل، صفحه وب و حتی فولدرها را دانلود کنند. میتوانید پس از دانلود یک صفحهی وب، تمام لینکهای موجود در آن را باز کرده و محتویات صفحات لینک شده را نیز دانلود کنید! اگر از کاربران ویندوز باشید، ممکن است فکر کنید که این قابلیت صرفاً در برخی نرمافزارهای مدیریت دانلود وجود دارد.
دستور curl هم یک دستور ساده برای دانلود کردن فایل نیست بلکه کاربردهای دیگری نیز دارد. این فرمان مثل wget امکان اکتشاف صفحات وب را ندارد. با این فرمان علاوه بر دانلود فایل، میتوانید با سرور سایتها تعامل داشته و درخواستهای برای دریافت محتوا ارسال کنید. این مزیت اصلی دستور curl نسبت به wget است. فرمان curl از پروتکلهای مختلف شامل HTTP و HTTPS و SCP و SFTP و FTP نیز پشتیبانی میکند. توانمندی این دستور موجب شده که در دیگر فرمانها و اسکریپتها به وفور از آن استفاده شود.
نحوه نصب curl
در برخی توزیعات لینوکس نظیر Fedora 31 و Manjaro 18.1.0 این ابزار به صورت پیشفرض نصب شده است اما در برخی دیگر نظیر Ubuntu 18.04 LTS میبایست آن را نصب کنید. برای نصب در لینوکس اوبونتو فرمان زیر را اجرا کنید و برای نصب در دیگر توزیعات، از ابزار مدیریت پکیجهای آن توزیع خاص استفاده کنید.
بررسی نسخهی curl
برای چک کردن ورژن curl میتوانید، از آپشن version و در واقع عبارت --version پس از دستور curl استفاده کنید:
اطلاعات دقیق شامل نسخه و تاریخ انتشار نمایش داده میشود:
دانلود صفحه وب با دستور curl
برای دانلود صفحهی وب، کافی است URL آن را به همراه پروتکل ارتباطی مثل HTTPS پس از دستور curl تایپ کنید. به یک مثال توجه کنید:
نتیجهی اجرای دستور فوق، دانلود صفحه و نمایش سورس کد صفحه در محیط ترمینال است که شاید مطلوب نباشد!
به علاوه دستور curl محتوای دانلود شده را در فایل خاصی ذخیره نمیکند و صرفاً در محیط ترمینال نمایش میدهد. بنابراین بهتر است مشخص کنید که میخواهید خروجی در چه فایلی ذخیره شود. حالت بدتر این است که اگر فایل دریافتی یک فایل باینری باشد، ممکن است اتفاقات عجیب و غریبی بیافتد و در واقع دستوراتی که داخل فایل است، اجرا شود.
ذخیره کردن محتوای دانلود شده در فایل
برای ذخیره کردن حاصل اجرای curl در یک فایل، کافی است < و سپس نام و آدرس کامل فایل را تایپ کنید. مثل نمونهی زیر:
در این حالت curl نتیجهی دانلود فایل و محتوا را در ترمینال نمایش میدهد و در واقع متوجه میشوید که چه زمانی دانلود تکمیل شده است.
گزارش شامل موارد زیر است:
- % Total: مجموع دیتای دریافتی
- % Received: درصد و مقدار حجم دریافت شده تا این لحظه
- % Xferd: درصد و مقدار دادهی ارسال شده در حالت آپلود
- Average Speed Dload: سرعت متوسط دانلود محتوا
- Average Speed Upload: سرعت متوسط آپلود محتوا
- Time Total: مدت زمان فرآیند به صورت تخمینی
- Time Spent: مدت زمانی که تا این لحظه سپری شده
- Time Left: مدت زمانی باقیمانده به صورت تخمینی
- Current Speed: سرعت فعلی تبادل داده
همانطور که در تصویر زیر مشاهده میکنید، فایلی به اسم bbc.html برای ذخیره کردن خروجی ایجاد شده است:
با دبلکلیک کردن، این فایل در مرورگر اینترنت پیشفرض باز میشود.
همانطور که در نوار آدرس مشاهده میکنید، یک فایل باز شده و نه یک صفحه وب.
اما روش دیگر برای ذخیره کردن خروجی دستور curl این است که از آپشن -o یا output برای ساخت فایل و ذخیره کردن داده استفاده کنید. به عبارت دیگر میتوانید نام فایل خروجی را پس از آپشن -o تایپ کنید:
نمایش نمودار پیشروی دانلود حین کار با curl
برای چک کردن میزان پیشرفت دانلود محتوایی مثل یک فایل حجیم، میتوانید نمایش نمودار پیشروی را فعال کنید که با آپشن -# انجام میشود:
و نتیجه نمایش خطی با کاراکترهای # و - و همینطور درصد پیشرفت فرآیند است:
ادامه دادن دانلود متوقف شده
ممکن است حین دانلود یک فایل حجیم مثل ایمیج دیسک نصب لینوکس اوبونتو، اینترنت لحظاتی قطع و وصل شود. در این صورت دانلود متوقف میشود. خوشبختانه امکان ازسرگیری دانلود وجود دارد.
فرض کنید که دستور زیر را برای دریافت فایل ISO لینوکس اوبونتو اجرا کردهاید که در واقع خروجی را در فایلی به اسم ubuntu18043.iso ذخیره میکند:
دانلود آغاز میشود و گزارش دانلود نمایش داده میشود:
و فرض کنید که به دلیل زدن کلید میانبر Ctrl + C که اجباراً اجرای فرآیند در ترمینال را متوقف میکند، دانلود متوقف میشود.
برای ازسرگرفتن دانلود فایل موردبحث، از آپشن -C یا continue at استفاده کنید. با این آپشن، فرمان curl در فایلی که قبلاً ساخته شده، تا نقطهی خاصی که قبلاً دانلود تکمیل شده پیش میرود و دادههای نقاط بعدی را دریافت میکند. لذا مجبور نیستید مقداری که قبلاً دانلود شده را مجدداً دانلود کنید. اما نکتهی مهم این است که پس از این آپشن، فقط یک - تایپ کنید و عددی ننویسید!
اگر عددی تایپ کنید، دستور curl به اندازهی مشخص شده پیش میرود و دادههای بعدی را دانلود کرده و در فایل مینویسید. اما اگر - تایپ کنید، دستور curl به صورت خودکار از محلی که قبلاً دانلود متوقف شده، شروع میکند و پیش میرود.
بنابراین برای از سرگرفتن دانلود فایل ISO، دستور زیر را اجرا میکنیم:
به این ترتیب عبارت Resuming transfer from byte position نمایش داده شده و ادامهی دانلود آغاز میشود:
دریافت هدرهای HTTP با دستور curl
با آپشن -I یا head میتوانید فقط هدرهای HTTP یک صفحه وب را دانلود کنید که درست مثل ارسال دستور HEAD است برای یک سرور وب است:
همانطور که مشاهده میکنید در این صورت صفحهی وب یا فایل خاصی دانلود نمیشود بلکه صرفاً اطلاعات نمایش داده میشود:
دانلود چند صفحه وب با curl
میتوانید در یک مرحله چندین صفحه وب را با فرمان curl دانلود کنید. برای این مقصود میبایست از xargs استفاده کنید. فرض کنید که لینک صفحات موردنظر به صورت زیر است. این آدرسها را در یک فایل متنی ساده با پسوند txt ذخیره کنید به طوری که در هر خط، یک لینک قرار داشته باشد. فرض کنید که نام این فایل، urls-to-download.txt است.
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5
حال با استفاده از فرمان زیر، هر خط از فایل متنی به عنوان یک پارامتر به دستور curl داده میشود تا دانلود انجام شود:
دقت کنید که پس از دستور curl از آپشن -O یا remote file استفاده شده که با o کوچک متفاوت است. این آپشن موجب میشود که فایل دریافتی با همان نامی که در سرور ریموت قرار داشته، ذخیره شود. لذا با استفاده از دستور فوق، هر لینکی که دانلود میشود، با همان نام اصلی ذخیره میشود.
آپشن -n 1 که پس از xargs استفاده شده، هر خط از فایل متنی را به عنوان یک پارامتر در نظر میگیرد.
نتیجهی اجرای دستور فوق، دانلود فایلها بدون وقفه و پشتسرهم است.
دانلود فایل از سرور FTP با دستور curl
برای کار با سرور FTP دستورهای دیگری وجود دارد اما استفاده از curl نیز بسیار ساده است. کافی است آدرس موردنظر را به همراه پروتکل ftp پس از دستور curl تایپ کنید.
حتی اگر نیاز به لاگین کردن باشد هم میتوانید از دستور curl استفاده کنید. برای ارسال نام کاربری، از آپشن -u یا username استفاده کنید و پس از آن ابتدا نام کاربری و سپس : و سپس رمز عبور را تایپ کنید.
دقت کنید که پس از دونقطه، اسپیس یا کاراکتر اضافی دیگری تایپ نکنید.
به مثال زیر توجه کنید:
curl متوجه میشود که مقصود شما تعامل با یک سرور FTP است و لذا لیستی از فایلهای موجود روی سرور را نمایش میدهد.
اکنون میتوانید آدرس فایل موردنظر را تایپ کنید تا دانلود شود.
فایل مثال ما یک فایل متنی است و پس از دانلود، محتویات آن نمایش داده میشود.
میتوانید از آپشن -O استفاده کنید تا فایل با نام اصلی آن در سرور FTP، روی کامپیوتر شما ذخیره شود.
برای چک کردن فایلهای ذخیره شده، نرمافزار مدیریت فایل لینوکس را اجرا کنید. روش دیگر استفاده از دستور ls برای لیست کردن فایلها است. به علاوه میتوانید دستور زیر را اجرا کنید تا مشخصات فایل ذخیره شده نمایش داده شود و آن را با فایل موجود روی سرور FTP مقایسه کنید.
ارسال پارامتر به سرور ریموت با فرمان curl
همانطور که در ابتدای مقاله اشاره کردیم، فرمان curl قابلیت تعامل با سرور ریموت را دارد. میتوانید پارامتری ارسال کنید تا سرور مقصد، فایل خاص یا اطلاعات و صفحهای که موردنظرتان است را برای شما ارسال کند.
به عنوان مثال سایت ipify یک واسط برنامهنویسی دارد که میتوانید کوئری برای آن ارسال کنید.
با افزودن پارامتر فرمت به صورت json، دادهی دریافتی فایلی با فرمت JSON خواهد بود.
یا مثال دیگر استفاده از API گوگل برای دریافت اطلاعات یک کتاب است. برای دریافت اطلاعات کتاب، میبایست ISBN یا شمارهی استاندارد بینالمللی کتاب را ارسال کنید که معمولاً پشت جلد کتاب درج میشود. مثل نمونهی زیر که ISBN کتاب، عدد 0131103628 بوده است:
دادههای دریافتی توسط فرمان curl در ترمینال اینگونه است:
howtogeekسیارهی آیتی