从PHP连接到安全FTP服务器

时间:2010-01-31 15:55:23

标签: php ftp sftp

这个问题符合this question,我正在尝试连接到安全的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 - 尚未尝试过这种方法,但在评论部分推荐,因此可以对此进行处理,稍后会发布更新。
  6. 方法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进行连接?

    是否还有其他方法可以使用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,暂时或永久关闭此waySearch : How to disable 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 Secure Communication Library (phpspeclib)的开源项目,它也可用于建立与FTP服务器的安全连接。

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

  1. 许多便宜的webhoster不会给你ssh(因此没有ftp通过ssh aka sftp)但只有ssl-secured ftp aka ftps(see here)。你可能会 有那个问题。正如其他人建议的那样,使用filezilla或 另一个ftp客户端来测试你的学分和选择的安全方法 预先。

  2. ftp_ssl_connect()至少在windows下会有很长的路程, 因为你必须编译自己的php二进制文件see here

  3. As this php contributor rightfully points out,不安全 连接是安全的,只要你不知道,你在说谁 通过有效证书也称为“同行认证”。

  4. phpseclib可能是您最好的选择。但我还没搞清楚,怎么样 确保,它使用同行验证(猜测,事实是在 openssl.conf ...)

  5. 所以即使在撰写本文时,我也比以往任何时候都更加怀疑 对等验证的ftps(ftp与ssl / tls身份验证)是可能的......也见my question here

答案 2 :(得分:1)

关于'ftp via ssh'alias'sftp':没有直接的建议,但请注意,许多廉价的“非专用服务器”虚拟主机不支持它(这很糟糕)。公司防火墙可能会阻止相关端口。

对于'ftp using ssl / tls'别名'ftps': Your answer is here。不要在ftp_ssl_connect()上浪费时间: - )

(是的,至少可以说,它在php网站上的记录很少)

答案 3 :(得分:0)

我在处理加密连接时也遇到了很多问题。

首先要检查您要使用的协议。安全FTP最常用于通过SHH进行FTP,但也可能意味着SCP,SFTP或FTPS。

要弄清楚的一种方法是使用像filezilla这样的客户端检查连接。

如果协议是通过PHP模块处理的,那么最好的方法就是使用它。在这种情况下,您需要确保除了与​​协议相关的模块之外,还为php安装了OPENSSL模块。

在某些情况下,模块支持仍然无效。在这种情况下,使用libcurl模块是一种选择。例如,当您需要使用客户端证书时就是这种情况。

不幸的是,在这里,由于php模块中libcurl的部分支持,你可能会遇到一些问题。我尝试过的一个场景是模块判断服务器证书无效。

我通常使用的最后一个解决方案是从exec语句运行curl二进制文件,对于后一种情况,使用“-k”开关。

答案 4 :(得分:0)

我尝试了phpseclib library,它适用于Windows和Linux。

如果您正在使用作曲家,只需添加您的要求部分:

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

然后,你可以这样做:http://phpseclib.sourceforge.net/sftp/examples.html#put