我无法使用PHP将SFTP上传文件上传到远程服务器。当我使用cURL时,我收到了这里描述的错误:
SFTP from PHP - undefined constant CURLOPT_PROTOCOLS and CURLPROTO_SFTP?
我也按照以下建议尝试了phpseclib:
但是当我尝试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连接。
答案 0 :(得分: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库的标准。
答案 1 :(得分:1)
但是我的php服务器说没有定义ss2_connect。
对于此错误,您应该在服务器的php上安装ssh2扩展名。
答案 2 :(得分:0)
使用内置的SSH库。使用scp函数也比启动sftp会话更容易。
答案 3 :(得分:0)
要使用system
命令,您必须:
scp filename1 userid@hostname:filename2
之类的命令,检查man scp
。您可以使用sftp
执行相同操作,但可以使用其他选项答案 4 :(得分: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");
?>