GHopper
Новичок
работа с ftp-сервером в активном режиме
Здравствуйте!
Задача - соединиться с фтп сервером и залить на него файл.
<?php
$ftp_server = "host.ru";
$ftp_user_name = "user";
$ftp_user_pass = "pass";
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
die;
} else {
echo "Connected to $ftp_server, for user $ftp_user_name<br>";
}
$pasv_flag = false;
if (!ftp_pasv($conn_id, $pasv_flag))
echo "ftp_pasv() error!<br>";
else
echo "ftp_pasv() ok!<br>";
// upload the file
$upload = ftp_put($conn_id, "del.me", "local.file", FTP_BINARY);
// check upload status
if (!$upload) {
echo "FTP upload has failed!<br>";
} else {
echo "Uploaded test.php to $ftp_server as del.me<br>";
}
// close the FTP stream
ftp_close($conn_id);
?>
Результат работы скрипта:
Connected to host.ru, for user user
ftp_pasv() ok!
FTP upload has failed!
Файл local.file существует. Пробовал этот скрипт на других серверах (работающих в пассивном режиме, заменял $pasv_flag = false; на $pasv_flag = true
все работало!
После безуспешных попытак разобраться со стандрартными ftp-функциями языка PHP, решил попробовать одалеть сокеты.
Открыл RFC 959 - путанно и непонятно. Возник вопрос: как через telnet соединиться с моим ftp в активном режиме?
/* Connect */
$fc = fsockopen($server, 21);
if (!$fc) {
print('Server is unavailable<br>');
}
fgets($fc);
/* Authentication */
fputs($fc, 'user '.$user."\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 331) {
print('Invalid user name<br>');
}
fputs($fc, 'pass '.$pass."\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 230) {
print('Invalid password<br>');
}
/* Set passive mode for transaction */
fputs($fc, "TYPE A\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 200) {
print('TYPE A has failed!<br>');
}
fputs($fc, "PORT 217,116,151,36,6,120\r\n");
$res = fgets($fc);
echo "PORT answer: ".$res;
echo "<br>";
exit;
На выходе получил: PORT answer: 500 Illegal PORT command. Дайте пожалуйсто последовательность команд, которые нужно вводить после авторизации, для заливки файла на сервер.
Должны быть уже готовые классы для работы с фтп через сокеты. Если у кого есть - поделитесь...
Здравствуйте!
Задача - соединиться с фтп сервером и залить на него файл.
<?php
$ftp_server = "host.ru";
$ftp_user_name = "user";
$ftp_user_pass = "pass";
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name";
die;
} else {
echo "Connected to $ftp_server, for user $ftp_user_name<br>";
}
$pasv_flag = false;
if (!ftp_pasv($conn_id, $pasv_flag))
echo "ftp_pasv() error!<br>";
else
echo "ftp_pasv() ok!<br>";
// upload the file
$upload = ftp_put($conn_id, "del.me", "local.file", FTP_BINARY);
// check upload status
if (!$upload) {
echo "FTP upload has failed!<br>";
} else {
echo "Uploaded test.php to $ftp_server as del.me<br>";
}
// close the FTP stream
ftp_close($conn_id);
?>
Результат работы скрипта:
Connected to host.ru, for user user
ftp_pasv() ok!
FTP upload has failed!
Файл local.file существует. Пробовал этот скрипт на других серверах (работающих в пассивном режиме, заменял $pasv_flag = false; на $pasv_flag = true

После безуспешных попытак разобраться со стандрартными ftp-функциями языка PHP, решил попробовать одалеть сокеты.
Открыл RFC 959 - путанно и непонятно. Возник вопрос: как через telnet соединиться с моим ftp в активном режиме?
/* Connect */
$fc = fsockopen($server, 21);
if (!$fc) {
print('Server is unavailable<br>');
}
fgets($fc);
/* Authentication */
fputs($fc, 'user '.$user."\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 331) {
print('Invalid user name<br>');
}
fputs($fc, 'pass '.$pass."\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 230) {
print('Invalid password<br>');
}
/* Set passive mode for transaction */
fputs($fc, "TYPE A\r\n");
$res = fgets($fc);
if (substr($res, 0, 3) != 200) {
print('TYPE A has failed!<br>');
}
fputs($fc, "PORT 217,116,151,36,6,120\r\n");
$res = fgets($fc);
echo "PORT answer: ".$res;
echo "<br>";
exit;
На выходе получил: PORT answer: 500 Illegal PORT command. Дайте пожалуйсто последовательность команд, которые нужно вводить после авторизации, для заливки файла на сервер.
Должны быть уже готовые классы для работы с фтп через сокеты. Если у кого есть - поделитесь...