گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

دانلود فایل‌های حجیم همراه با Resume و تعیین زمان دانلود در لینوکس

نویسنده:
6 اکتبر 18

شاید یکی از مهمترین مشکلات کاربرانی که به تازگی به لینوکس مهاجرت کردند نبودن نرم افزاری مثل IDM یا همون Internet Download Manager باشه که امکان دانلود فایل‌های حجیم و تعیین زمان دانلود داره تا در بازه زمان شبانه که اینترنت رایگان میشه این دانلود‌ها انجام شوند.

این موضوع توی ذوق خیلی‌ها میزنه و حتی باعث میشه به ویندوز برگردند ،‌ این مورد یکی از مشکلات من در بدو مهاجرت به لینوکس بود و در ابتدا از پلاگین های Download Manager مرورگرهای Firefox و Chrome به نام های DownloadThem All و Chrono استفاده میکردم اما پس از مدتی که با ترمینال لینوکس و قدرتش بیشتر آشنا شدم بهترین روش برای دانلود فایل‌های بزرگ و دسته‌جمعی و مدیریت زمان را پیدا کردم.

یک نرم افزاری Command ی هست به نام Aria2 که توی Linux هم موجوده و با سرعت خیلی خوب و روون میشه باهاش فایل مستقیم ، از روی FTP و حتی Torrent دانلود کرد و توی مخازن Ubuntu و Debian هستش و براحتی با دستور زیر نصب میشه:

sudo apt-get install aria2

بعد از نصب کافیه یک فایل متنی توی مسیر Downloads/~ داشته باشیم و آدرس هر فایل را توی یک خط وارد کنیم و با دستور زیر با ۱۶ Connection و با محدودیت ۱ فایل در یک زمان فایل هامون را دانلود کنیم:

aria2c -c -x16 -s16 -i "~/Downloads/dl.txt" -d "~/Downloads/" -j 1

حالا برای اینکه ساعت ۲ شب این دانلود‌ها شروع بشوند و ساعت ۶ صبح هم کامپیوتر خاموش بشه میتونی پس از زدن crontab -e دو خط زیر را وراد کنید:

۰۰ ۰۲ * * * aria2c -c -x16 -s16 -i "~/Downloads/dl.txt" -d "~/Downloads/" -j 1
۰۰ ۰۶ * * * echo "your password here"|sudo -S shutdown -h now

توجه: برای خاموش کردن سیستم نیاز به دستور SUDO و ذخیره گذرواژه توی فایل Cron داریم که از نظر امنیتی برای سیستم‌های خاصی اصلاً درست نیست (برای یک سیستم خونگی که اهمیتی نداره). میتونین از طریق این پست برای دستور shutdown بدون گذرواژه اقدام کنین.

به همین راحتی مشکل دانلود شبانه توی لینوکس با سرعت خوب حل میشه.

دانلود همه فایل‌های یک وب سایت از طریق FTP

نویسنده:
10 دسامبر 16

اگه توسعه‌دهنده وب باشین خیلی مواقع پیش میاد که نیاز دارین همه فایل‌های یک وب سایت را دانلود کنین. اگه سایت مورد نظر روی میزبانی واقع باشه که Cpanel یا کلاً یک Filemanager داشته باشه میتونید یک نسخه Zip شده از فایل‌ها بگیرین.

اما این فقط توی سناریو‌هایی جواب میده که حجم سایت خیلی بزرگ نشه. اگه حجم به گیگابایت برسه احتمال داره اصلاً اسکریپت Timeout بشه یا به خاطر عدم پشتیبانی از Resume و عدم وجود حجم کافی برای پشتیبان گیری روی دیسک به مشکل بخورین. سناریو‌هایی هم هست که سایت روی یک VPS قرار داره و پنل مدیریتی هم وجود نداره. یا کلاً جز FTP چاره دیگه‌ای نداریم.

یکی از دلایلی که به لینوکس علاقه دارم این هست که ابزار بسیار قدرتمندی داره و خیلی منعطف میشه به هدفت برسی. توی این سناریو با دستور زیر خیلی راحت همه فایل‌ها دانلود میشن و کار ختم به خیر میشه.

wget -r -l 0 --user="username" --password="password" ftp://server.com/

دانلود راحت با قابلیت Resume بخصوص برای فایل های بزرگ بدون دخالت PHP

نویسنده:
29 سپتامبر 15

خیلی مواقع برای دانلود فایل نیاز هست از طریق PHP و بدون در اختیار گذاشتن لینک مستقیم امکان دانلود را برای کاربر فراهم کنیم اینطوری :

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="PATH_TO_FILE"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: FILE_SIZE');
readfile("PATH_TO_FILE");
exit;

اما مشکل اون موقع پیش میاد که حجم فایل زیاد باشه و نیاز به resume باشه که البته اون را هم میشه با PHP حلش کرد و شاید یک نمونه را در آینده پُست کردم ولی راهکاری که میخوام براتون توضیح بدم به نظرم خیلی بهتره چون کل پروسه دانلود را میندازیم گردن Apache و کار خیلی تمیز تر و بهتر انجام میشه.

دانلود x-sendfile

در‌واقع میخوایم از ماژول x-sendfile که توی وب سرور های مختلف مثل apache و nginx و litespeed فرق میکنه استفاده کنیم. من فرض میکنم شما روی دبیان و وب سرور Apache میخواین نصبش کنید.

برای نصب ماژول باید از دستور apxs استفاده کنیم که ممکنه روی سیستم نصب نباشه و با دستور زیر میتونیم نصبش کنیم :

apt-get install apache2-dev

حالا سورس ماژول را از https://tn123.org/mod_xsendfile و بخش دانلود میگیریم و آرشیو را باز میکنیم و با دستور زیر ماژول را نصب میکنیم :
[doce]
sudo apxs -cia mod_xsendfile.c
[/code]
تا اینجا ماژول را نصب کردیم ولی باید برای سایت یا کل سرور فعال کنیم که میتونیم این کار را توی فایل httpd.conf یا apache2.conf یا از طریق htaccess. انجام بدین که من این آخری را ترجیح میدم. مثلاً دانلود را از طریق فایل xdownload.php انجام میدم پس توی htaccess. مینویسم :

<Files xdownload.php>
	XSendFile on
</Files>

آخرین کاری که باید انجام بدیم اینه که تعیین کنیم Apache برای Header های X-Sendfile به کدام دایرکتوری رجوع کنه که حتماً باید توی فایل‌های config سرور یا سایت این کار را انجام بدیم :

<VirtualHost *:80>
        ServerAdmin webmaster@domain.com
        ServerName www.domain.com
        DocumentRoot /path/to/www
        XSendFilePath /path/to/www/xdownload

	... other stuff
</VirtualHost>

همونطور که میبینید من برای سایتم یک دایرکتوری xdownload در نظر گرفتم و فایل‌هایی که میخوام دانلود کنم را میریزم توی اون دایرکتوری. شما با توجه سایت خودتون میتونید هر دایرکتوری را در نظر بگیرین.

حالا با دستور زیر apache را ریست میکنیم :

sudo service apache2 restart

و با بهترین روش ممکن فایل را برای دانلود عرضه میکنیم :

header("X-Sendfile: xdownload/file.ext");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=file.ext");
exit;

اینکه اشاره کردم با دبیان انجام میدم برای این بود که دستور هایی مثل apt-get را با دبیان مینویسم وگرنه هیچ اهمیتی نداره از چه لینوکسی استفاده میکنید و فقط باید سرویس دهنده شما apache باشه.