Подключение к защищенному FTP-серверу из PHP - PullRequest
13 голосов
/ 31 января 2010

Этот вопрос соответствует этому вопросу , я пытаюсь подключиться к защищенному FTP-серверу, и он не может подключиться, странным является то, что я могу сделать ssh и подключиться к серверу но когда я пытаюсь сделать это из PHP-кода, используя несколько разных подходов, но он не работает

Подходы:

  1. FTP Wrappers
  2. ftp_connect & ftp_login
  3. ftp_ssl_connect
  4. ssh2_sftp
  5. ssh2-scp-send & ssh2-scp-receive - еще не пробовали этот подход, но рекомендовали его в комментариях, поэтому будем работать над этим и будут публиковать обновления позже.

Код для подхода 1:

$ftp_server = "ftp://username:password@192.168.1.1:21/{$log_file_name}";
$opts = array('ftp' => array('overwrite' => TRUE));
$context = stream_context_create($opts);
$put_file = file_put_contents($ftp_server, $response, LOCK_EX,$context);

Здесь также не удается подключиться к защищенному FTP-серверу, есть предложения относительно того, почему он не может подключиться?

Код для подхода 2:

ftp_server = 'www.server.com';
$conn_id = ftp_connect($ftp_server) or die ("Cannot connect to host");
//Program dies out here and give error message "Cannot connect to host",
//but why ftp_login does not work here, Any Suggestions ?
$ftp_user_name = "login";
$ftp_user_pass = "password";
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection and login result
if ((!$conn_id) || (!$login_result)) 
{ echo "FTP connection has encountered an error!";
  echo "Attempted to connect to $ftp_server for user $ftp_user_name....";
 //exit;
} else 
{ 
 echo "Connected to $ftp_server, for user $ftp_user_name".".....";
}

Код для подхода 3:

Here am using same code as approach 1 but instead of ftp_connect, am using ftp_ssl_connect

Код для подхода 4:

$connection = ssh2_connect('www.server.com', 22);
ssh2_auth_password($connection, 'login', 'password');
$sftp = ssh2_sftp($connection);
//exit();
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Может кто-нибудь посоветовать, почему я не могу подключиться к защищенному FTP-серверу, используя вышеуказанные подходы, но все еще могу сделать это с помощью ssh?

Существуют ли другие способы подключения к защищенному FTP-серверу с использованием php?

ОБНОВЛЕНИЕ:

Q1. Я попытался снова с помощью ftp_connect, но он просто вымер и почему он вымирает, в каких сценариях вымирает ftp_connect?

Q2. У нас есть только один подход для подключения к серверу или есть какие-то другие, которые мы можем реализовать?

Q3. Связан ли этот язык php с тем, что он не поддерживает безопасное FTP-соединение? ИЛИ есть какой-то другой способ сделать это с помощью php, если да, чем предоставить другие подходы, поскольку это было бы очень полезно.

ОБНОВЛЕНИЕ 1:

Я пытался больше гуглить по этому вопросу, и кажется, что если ftp_connect не работает, то брандмауэр может быть одной из причин этого. Я не совсем уверен, так ли это, но я больше изучаю его и выкладываю здесь обновления, если найду что-нибудь полезное.

Возможное решение:

Проблема

Если я уберу «или умру», вы получите ошибку:

При запуске с веб-страницы:

Предупреждение: ftp_login () ожидает, что параметр 1 будет ресурсом, логическое значение указано в /var/www/ftp_test.php в строке 28

var_dump ($ conn_id); возвращает bool (false).

Из командной строки / usr / bin / php /var/www/ftp_test.php

var_dump ($ conn_id); возвращает ресурс (4) типа (буфер FTP).

Сценарий завершен.

Решение 1

Это может быть один solution:

Попробуйте отключить selinux и вот way или Поиск: Как отключить selinux для его временного или постоянного отключения.

Решение 2

Если вы не хотите полностью отключать selinux, вы можете получить то, что вам нужно, просто установив httpd_can_network_connect с помощью команды setsebool .

Убедитесь, что ранее было установлено значение "off": getsebool httpd_can_network_connect

Установите его в «on»:

setsebool httpd_can_network_connect=1

Включите selinux снова: Setenforce 1

Убедитесь, что php ftp_connect все еще работает при работе под httpd.

Установите для политики (-P) значение «on», чтобы оно сохранялось при перезагрузке:

setsebool -P httpd_can_network_connect=1

Решение 3

Также может быть проблема с брандмауэром компании. Убедитесь, что он настроен правильно и права доступа установлены правильно.

Решение 4

Другой подход заключается в использовании cURL: libcurl , поскольку его можно использовать для подключения и связи со многими различными типами серверов с множеством различных типов протоколов

Решение 5

Существует проект с открытым исходным кодом, называемый PHP Secure Communication Library (phpspeclib) , который также можно использовать для установления безопасного соединения с FTP-сервером.

Ответы [ 5 ]

1 голос
/ 08 марта 2014

Что касается «ftp через ssh» псевдоним «sftp»: Нет прямых советов, но обратите внимание, что многие дешевые веб-хостинги «невыделенного сервера» не поддерживают его (что плохо). Брандмауэры компании могут блокировать соответствующие порты.

Что касается 'ftp используя псевдоним' ssl / tls 'ftps': Ваш ответ здесь . Не тратьте время на ftp_ssl_connect(): -)

(Да, это плохо документировано на сайте php, если не сказать больше)

1 голос
/ 19 февраля 2014
  1. Многие дешевые веб-хостеры не будут давать вам SSH (следовательно, нет FTP через SSH ака sftp) но только ssl-обеспеченный ftp или ftps ( см. здесь ). Ты можешь есть эта проблема. Как предлагали другие, используйте filezilla или другой клиент ftp для проверки ваших кредитов и выбранный метод безопасности заранее.

  2. ftp_ssl_connect () по крайней мере под окнами будет долгое путешествие, поскольку вы должны скомпилировать свои собственные PHP-файлы, см. здесь .

  3. Как справедливо указывает этот автор php , безопасный соединение защищено, если вы не знаете, с кем разговариваете Кроме того, так называемая «сертификация равных» через действующие сертификаты.

  4. phpseclib , вероятно, ваш лучший выбор. Но я не понимаю, как убедитесь, что он использует проверку сверстников (догадываясь, правда в openssl.conf ...)

  5. Так что даже во время написания, я удивляюсь больше, чем когда-либо, если Возможна авторизация по протоколу ftp (ftp с аутентификацией ssl / tls) ... также см. мой вопрос здесь .

1 голос
/ 01 февраля 2010

На этой странице есть то, что вы ищете (я думаю)

http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/

и вот справочные страницы

http://php.net/manual/en/book.ssh2.php

0 голосов
/ 08 апреля 2014

Я попробовал библиотеку phpseclib , и она работает в Windows и Linux.

Если вы используете composer, просто добавьте в необходимый раздел:

"phpseclib/phpseclib": "0.3.*@dev"

И тогда вы можете сделать это: http://phpseclib.sourceforge.net/sftp/examples.html#put

0 голосов
/ 02 февраля 2010

Я тоже столкнулся с довольно большим количеством проблем при работе с зашифрованными соединениями.

Прежде всего, проверьте протокол, который вы хотите использовать. Защищенный FTP чаще всего переключается на FTP через SHH, но также может означать SCP, SFTP или FTPS.

Один из способов выяснить это - проверить подключение с помощью клиента, такого как filezilla.

Если протокол обрабатывается с помощью модуля PHP, действительно, лучший способ - использовать его. В этом случае вам необходимо убедиться, что в дополнение к протоколу установлен модуль OPENSSL для php.

В некоторых случаях поддержка модуля все еще не работает. В этом случае использование модуля libcurl является одним из вариантов. Это тот случай, например, когда вам нужно использовать сертификат клиента.

К сожалению, и здесь вы можете столкнуться с некоторыми проблемами из-за частичной поддержки libcurl в модуле php. Один сценарий, который я экспериментировал, - это когда серверный сертификат признан недействительным модулем.

Последнее решение, которое я обычно использую, - это запуск двоичного файла curl из оператора exec, для более позднего случая с использованием ключа "-k".

...