~4 min read • Updated Feb 27, 2026
1. بکآپگیری ریموت در DirectAdmin
در حال حاضر تنها روش داخلی DirectAdmin برای بکآپگیری ریموت، انتقال فایلها به یک سرور FTP است. این تنظیمات از مسیر زیر انجام میشود:
Admin Level → Admin Backup/Transferهر دو حالت FTP و FTPS پشتیبانی میشوند.
2. تست دستی اسکریپت ftp_upload.php
برای دیباگ مشکلات آپلود FTP، میتوانید اسکریپت ftp_upload.php را با متغیرهای محیطی اجرا کنید.
2.1 نمونه دستور تست
cd /usr/local/directadmin/scripts
ftp_port=21 \
ftp_local_file=/path/to/a/file.txt \
ftp_ip=1.2.3.4 \
ftp_username=fred \
ftp_password_esc_double_quote=fredspass \
ftp_path=/remote/path \
ftp_secure=ftps \
./ftp_upload.php
هر خطایی که وجود داشته باشد در خروجی نمایش داده میشود. همچنین لاگهای FTP روی سرور مقصد را بررسی کنید.
3. متغیرهای محیطی قابل استفاده در ftp_upload.php
DirectAdmin هنگام اجرای بکآپ، مجموعهای از متغیرها را به اسکریپت ارسال میکند. نمونه خروجی برای یک بکآپ FTP با ID=1:
action=backup
append_to_path=nothing
database_data_aware=yes
dayofmonth=5
dayofweek=*
email_data_aware=yes
ftp_ip=127.0.0.1
ftp_local_file=/home/tmp/admin/user.admin.testuser.tar.gz
ftp_local_path=/home/tmp/admin
ftp_password=pass"word
ftp_password_esc_double_quote=pass\"word
ftp_path=/admin_backups
ftp_port=21
ftp_remote_file=user.admin.testuser.tar.gz
ftp_username=admin
hour=5
id=1
minute=0
month=1
owner=admin
select0=testuser
type=admin
value=multiple
when=now
where=ftp
3.1 نحوه تولید این خروجی
cd /usr/local/directadmin/scripts/custom
cp /var/www/cgi-bin/printenv ftp_upload.php
echo "exit 1;" >> ftp_upload.php
chmod 755 ftp_upload.php
./ftp_upload.php
پس از اجرای بکآپ، تمام متغیرها نمایش داده میشوند. سپس میتوانید اسکریپت را حذف یا نسخه سفارشی خود را ایجاد کنید.
4. سفارشیسازی رفتار آپلود بر اساس ID بکآپ
میتوانید رفتار آپلود را بر اساس ID بکآپ تغییر دهید. مثال: اگر بخواهید بکآپ ID=1 با SCP آپلود شود:
if [ "$id" = "1" ]; then
# scp upload code
exit 0;
fi
نکته: اگر گزینه "When: Now" انتخاب شود، ID ارسال نمیشود. اما اگر روی یک کرون موجود "Run Now" بزنید، ID ارسال میشود.
5. تبدیل ftp_upload.php به curl
DirectAdmin بهصورت پیشفرض از PHP برای آپلود FTP استفاده میکند. برای دیباگ یا نیازهای خاص، میتوانید آن را با curl جایگزین کنید.
5.1 کپی اسکریپت
cp -rp /usr/local/directadmin/scripts/ftp_upload.php \
/usr/local/directadmin/scripts/custom/ftp_upload.php
5.2 جایگزینی محتوا با نسخه curl
/bin/sh
ETH=eth0
CURL=/usr/local/bin/curl
result=`$CURL --interface $ETH -T $ftp_local_file \
-u $ftp_username:$ftp_password_esc_double_quote \
ftp://$ftp_ip$ftp_path$ftp_remote_file 2>&1`
if grep -qi "curl: (67) Access denied: 530" <<< "$result"; then
echo "FTP access denied. Check login details."
exit 1
fi
if grep -qi "curl: (6) Couldn't resolve host" <<< "$result"; then
echo "Host could not be resolved."
exit 1
fi
if grep -qi "curl: (9) Uploaded unaligned file size" <<< "$result"; then
echo "File upload failed. Check path."
exit 1
fi
if grep -qi "curl: Can't open" <<< "$result"; then
echo "Can't open $ftp_local_file"
exit 1
fi
مطمئن شوید ftp_path با اسلش انتهایی تمام میشود.
6. تبدیل اسکریپت به ncftpput
/bin/sh
/usr/bin/ncftpput -t 25 -m \
-u "$ftp_username" -p "$ftp_password_esc_double_quote" \
"$ftp_ip" "$ftp_path" "$ftp_local_file" 2>&1
RET=$?
exit $RET
7. روش اصلی PHP برای آپلود FTP
/usr/local/bin/php
$use_pasv = true;
$ftp_server = getenv("ftp_ip");
$ftp_user_name = getenv("ftp_username");
$ftp_user_pass = getenv("ftp_password");
$ftp_remote_path = getenv("ftp_path");
$ftp_remote_file = getenv("ftp_remote_file");
$ftp_local_file = getenv("ftp_local_file");
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
echo "Unable to connect to $ftp_server\n";
exit(1);
}
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if (!$login_result) {
echo "Invalid login/password for $ftp_user_name on $ftp_server";
ftp_close($conn_id);
exit(2);
}
ftp_pasv($conn_id, $use_pasv);
ftp_mkdir($conn_id, $ftp_remote_path);
if (!ftp_chdir($conn_id, $ftp_remote_path)) {
echo "Invalid remote path '$ftp_remote_path'";
ftp_close($conn_id);
exit(3);
}
if (ftp_put($conn_id, $ftp_remote_file, $ftp_local_file, FTP_BINARY)) {
ftp_close($conn_id);
exit(0);
} else {
$use_pasv = false;
ftp_pasv($conn_id, $use_pasv);
if (ftp_put($conn_id, $ftp_remote_file, $ftp_local_file, FTP_BINARY)) {
ftp_close($conn_id);
exit(0);
} else {
ftp_close($conn_id);
echo "Error while uploading $ftp_remote_file";
exit(4);
}
}
?>
این همان روش پیشفرض DirectAdmin است.
Written & researched by Dr. Shahin Siami