用PHP实现SFTP

phpseclib的汉语本土释义是?

如果使用phpseclib,就很容易。

$ composer require phpseclib/phpseclib:\*
<?php
require __DIR__ . '/vendor/autoload.php';

$sftp = new Net_SFTP('ore-no-server.example.com');

$keyfile = '/path/to/ore-no-key';

$key = new Crypt_RSA();
$key->loadKey(file_get_contents($keyfile));

if (!$sftp->login('ore', $key)) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());

上述的例子是公钥认证,但是也可以通过以下方式进行密码认证。

<?php
require __DIR__ . '/vendor/autoload.php';

$sftp = new Net_SFTP('ore-no-server.example.com');

if (!$sftp->login('ore', 'ore-no-password')) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());

phpseclib 2.0.0可以这样翻译:

根据 @kuwa72在评论中提出的指正,最新版本的2.0.0使用了命名空间,因此需要进行如下更改。

<?php
require __DIR__ . '/vendor/autoload.php';

use phpseclib\Net\SFTP;
use phpseclib\Crypt\RSA;

$sftp = new SFTP('ore-no-server.example.com');

$keyfile = '/path/to/ore-no-key';

$key = new RSA();
$key->loadKey(file_get_contents($keyfile));

if (!$sftp->login('ore', $key)) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('filename.ext', 'hello, world!');
print_r($sftp->nlist());

pecl ssh2 可以被改写为:ssh2 pecl

虽然有扩展功能,但因为感觉维护得不太好,所以我决定不去使用。

    • https://pecl.php.net/package/ssh2

 

    http://php.net/ssh2