Подтвердить что ты не робот

Подключение к FTP-серверу с PHP

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

Подходы:

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

$ftp_server = "ftp://username:[email protected]: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:

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

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

Проблема

Если я удалю "или умереть", вы получите сообщение об ошибке:

При запуске с веб-страницы: Msgstr "Предупреждение: ftp_login() ожидает, что параметр 1 будет ресурсом, boolean задан в /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-буфер).

Script завершается.

Решение 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-серверу.

Комментарии:

Я пробовал делать google/bing, но не получил каких-либо плодотворных результатов, и, конечно же, буду ценить, если SO Readers могут помочь: -)

Я действительно жду ответа.

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Есть случаи, когда поддержка модуля по-прежнему не работает. В этом случае одним из вариантов является использование модуля libcurl. Например, если вам нужно использовать сертификат клиента.

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

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

Ответ 4

  • Много дешевых webhoster не даст вам ssh (следовательно, нет ftp через ssh aka sftp), но только ssl-secure ftp aka ftps (см. здесь). Ты мог бы есть эта проблема. Как и другие, используйте filezilla или другой ftp-клиент для проверки ваших кредитов и выбранного метода безопасности заранее.

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

  • Как справедливо указывает автор php, нет безопасного соединение безопасно, если вы не знаете, кто вы говорите также, как "сертификация сверстников" через действительные сертификаты.

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

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