从PHP连接到安全FTP服务器

use*_*204 13 php ftp sftp

这个问题符合这个问题,我试图连接到安全的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);
Run Code Online (Sandbox Code Playgroud)

这里也无法连接到安全的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".".....";
}
Run Code Online (Sandbox Code Playgroud)

方法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');
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议为什么我无法使用上述方法连接到安全的FTP服务器,但仍然可以使用ssh这样做?

有没有其他方法使用PHP连接到安全的FTP服务器?

更新:

Q1.我再次尝试使用ftp_connect,但它刚刚消失,为什么它会消失,ftp_connect死掉的场景是什么?

Q2.我们只有这种连接到服务器的方法,还是我们可以实现的其他方法?

Q3. 这种PHP语言是否相关,它不支持安全的FTP连接?或者有任何其他方式使用PHP,如果是,而不是提供不同的方法,因为它会非常有帮助.

更新1:

我试图在这个问题上谷歌更多,似乎如果ftp_connect不起作用,防火墙可能是其中一个原因.我不完全确定是否是这种情况,但我正在研究更多,并在此发布更新,如果我发现有用的话.

可能解决方案

问题

如果我删除"或死"然后你得到错误:

从网页运行时:

警告:ftp_login()期望参数1是资源,在第28行的/var/www/ftp_test.php中给出布尔值

后续代码var_dump($ conn_id); 返回bool(false).

从命令行/ usr/bin/php /var/www/ftp_test.php

后续代码var_dump($ conn_id); 返回类型(FTP缓冲区)的资源(4).

脚本完成.

解决方案1

这可能是一个solution:

尝试关闭selinux,这里是way搜索:如何禁用selinux临时或永久关闭它.

解决方案2

如果您不想完全关闭selinux,只需使用setsebool命令设置httpd_can_network_connect即可获得所需内容.

验证它之前已设置为"off": getsebool httpd_can_network_connect

将其设置为"on":

setsebool httpd_can_network_connect=1
Run Code Online (Sandbox Code Playgroud)

重新开启selinux:setenforce 1

检查以确保ftp_connect在httpd下运行时php 仍然有效.

将策略(-P)设置为"on",以便在重新启动时保持不变:

setsebool -P httpd_can_network_connect=1
Run Code Online (Sandbox Code Playgroud)

解决方案3

公司防火墙也可能存在问题.确保已正确配置并正确设置了访问权限.

解决方案4

另一种方法是使用cURL:libcurl,因为它可用于连接许多不同类型的协议并与许多不同类型的服务器通信

解决方案5

有一个名为PHP Secure Communication Library(phpspeclib)的开源项目,它也可用于建立与FTP Server的安全连接.