这个问题与这个问题一致,我正在尝试连接到安全的FTP服务器,但无法连接,奇怪的是我能够通过ssh连接到服务器,但是当我尝试使用几种不同的方法从php代码中连接时,它不起作用。
方法:
- FTP包装器
ftp_connect
&ftp_login
ftp_ssl_connect
ssh2_sftp
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".".....";
}
第三种方法的代码:
我使用与第一种方法相同的代码,但是使用ftp_ssl_connect代替了ftp_connect。
第四种方法的代码:
$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进行连接?
还有其他方法可以使用php连接到安全FTP服务器吗?
更新:
Q1.我尝试再次使用ftp_connect,但它突然中断了,它为什么会中断,ftp_connect会在哪些情况下中断?
Q2.我们只有这些方法才能连接到服务器吗?还是还有其他方法可供实现?
Q3.这是与php语言相关的不支持安全FTP连接吗?还是有其他使用php的方法来实现此目的?如果是,提供不同的方法将非常有帮助。
更新1:
我正在尝试在问题上进行更多的搜索,看起来如果ftp_connect不起作用,则防火墙可能是其中之一的原因。我不完全确定是否是这种情况,但我正在进一步研究,并在此处发布更新,如果我找到任何有用的信息。
可能的解决方案:
问题
如果我删除“or die”,则会出现错误:
从网页运行时:
警告: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);返回类型为FTP缓冲区的resource(4)。
脚本完成。
解决方案1
这可能是解决方案之一
:
尝试关闭selinux
,并在此处查看way
或搜索:如何禁用selinux以暂时或永久地将其关闭。
解决方案2
如果您不想完全关闭selinux,则可以使用setsebool命令仅设置httpd_can_network_connect来获得所需内容。
验证先前是否将其设置为“关闭”:getsebool httpd_can_network_connect
将其设置为“打开”:
setsebool httpd_can_network_connect=1
重新启用selinux: setenforce 1
检查在httpd下运行时php的ftp_connect
是否仍然有效。
设置策略(-P)为“on”,以便在重新启动后仍保持有效:
setsebool -P httpd_can_network_connect=1
解决方案3
公司防火墙也可能会出现问题。确保它被正确配置并具有适当的访问权限。
解决方案4
另一种方法是使用cURL:libcurl,因为它可以用于连接和与许多不同类型的服务器和协议进行通信。
解决方案5
有一个名为PHP安全通信库(phpspeclib)的开源项目,也可用于建立到FTP服务器的安全连接。