如何使用PHP进行SFTP文件上传

4
我在使用PHP上传文件到远程服务器时遇到了麻烦。当我使用cURL时,我会得到这里描述的错误:SFTP from PHP - undefined constant CURLOPT_PROTOCOLS and CURLPROTO_SFTP?。我也尝试了像这篇文章中建议的那样使用phpseclib:SFTP from within PHP,但是当我尝试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命令。我没有shell访问权限来创建ssh密钥。
现在,我只能从终端使用sftp并手动上传。但我真的想自动化这个过程,让PHP网站完成所有工作。
关于如何使用PHP进行SFTP上传的教程并不多。这是因为这样做不好吗?如果是这样,我应该做些什么?我要上传到的服务器只允许SFTP连接。
5个回答

6

1
但我的PHP服务器显示ss2_connect未定义。 对于此错误,您应在服务器的PHP上安装ssh2扩展。

0

我正在工作的服务器上显示ssh2_connect()未定义。此外,我连接到的远程主机不允许我通过scp将file.csv传输到user@remote.server.com - John
1
这可能不是默认提供的。你需要使用带有libssh2的PECL ssh2扩展。 - Chris Kloberdanz

0

要使用system命令,您需要:

  1. 配置无密码ssh
  2. 运行命令,如scp filename1 userid@hostname:filename2,检查man scp。您也可以使用sftp,但有一些其他选项

0
你可以使用纯PHP实现的SSHv2库。
以下是如何使用此库的一些示例:
<?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");
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接