4

我在使用 PHP 将文件 SFTP 上传到远程服务器时遇到问题。当我使用 cURL 时,我收到此处描述的错误:

来自 PHP 的 SFTP - 未定义的常量 CURLOPT_PROTOCOLS 和 CURLPROTO_SFTP?

我还按照以下建议尝试了 phpseclib:

来自 PHP 内部的 SFTP

但是当我尝试 phpseclib 时,我得到了这些错误:

Warning: require_once(Math/BigInteger.php) [function.require-once]: failed to open stream: No such file or directory in /home/john/public_html/test/Net/SSH2.php on line 53

Fatal error: require_once() [function.require]: Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/john/public_html/test/Net/SSH2.php on line 53

然后我尝试像这样在php中使用系统命令,但什么也没发生:

<?php
echo system('sftp user@ftp.domain.com');
echo system('password');
echo system('put file.csv');
?>

我也试过

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

但我的 php 服务器说 ss2_connect 未定义。

我尝试从终端执行以下操作

scp file.csv user@ftp.remote.com
password

但是服务器不允许 scp 命令。我没有创建 ssh 密钥的 shell 访问权限。

我现在能做的就是从终端 sftp 并手动上传。但我真的很想自动化这个,这样一个 PHP 网站就可以做到这一切。

关于如何从 PHP 进行 SFTP 上传的教程并不多。是因为这是一件坏事吗?如果是这样,我该怎么办?我要上传到的服务器只允许 sftp 连接。

4

5 回答 5

6

http://phpseclib.sourceforge.net/documentation/intro.html#intro_usage_correct

因此,phpseclib 的根目录需要在您的 include_path 中。从该页面:

<?php
  set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

  include('Net/SFTP.php');
?>

您应该真正熟悉这种包含技术——它对于 PEAR 库和 Zend 库来说是相当标准的。

于 2009-11-23T03:39:03.720 回答
1

但我的 php 服务器说 ss2_connect 未定义。

对于这个错误,您应该在服务器的 php.ini 上安装 ssh2 扩展。

于 2012-02-21T09:29:56.493 回答
0

使用内置的 SSH 库。使用 scp 功能也比启动 sftp 会话更容易。

http://www.php.net/manual/en/function.ssh2-scp-send.php

于 2009-11-19T22:52:37.350 回答
0

要使用system命令,您必须:

  1. 配置无密码 ssh
  2. 运行命令scp filename1 userid@hostname:filename2,检查man scp。您可以sftp使用其他选项执行相同的操作
于 2009-11-19T22:53:21.417 回答
0

您可以使用 SSHv2 库的 Pure-PHP 实现。

以下是如何使用此库的一些示例:

<?php
include 'vendor/autoload.php';
$ssh = new \phpseclib\Net\SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

和:

<?php
include 'vendor/autoload.php';
$key = new \phpseclib\Crypt\RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
$ssh = new \phpseclib\Net\SSH2('www.domain.tld');
if (!$ssh->login('username', $key)) {
    exit('Login Failed');
}
echo $ssh->read('username@username:~$');
$ssh->write("ls -la\n");
?>
于 2018-07-13T05:38:17.517 回答