Как SFTP загружать файлы с PHP


У меня возникли проблемы с использованием PHP для загрузки файлов SFTP на удаленный сервер. Когда я использую cURL, я получаю ошибку, описанную здесь:

SFTP из PHP - неопределенная константа CURLOPT_PROTOCOLS и CURLPROTO_SFTP?

Я также попробовал phpseclib, как было предложено в:

SFTP из 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 [email protected]');
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 [email protected]
password

Но сервер не разрешает команду scp. У меня нет доступа к оболочке для создания ssh-ключей.

Все, что я могу сделать прямо сейчас, это sftp с терминала и загрузить вручную. Но я действительно хочу автоматизировать это, чтобы веб-сайт PHP мог все это делать.

Существует не так много руководств по загрузке SFTP с PHP. Это потому, что это плохо для делать? Если да, то что мне следует делать? Сервер, на который я хочу загрузить, разрешает только sftp-соединения.

Author: Community, 2009-11-20

5 answers

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.

 6
Author: dreamafter, 2012-12-12 00:55:39

Но мой php-сервер говорит, что ss2_connect не определен.

Для устранения этой ошибки вам следует установить расширение ssh2 на php вашего сервера.

 1
Author: Don Kirkby, 2012-02-21 18:09:18

Используйте встроенную библиотеку SSH. Использование функции scp также будет проще, чем инициирование сеанса sftp.

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

 0
Author: Byron Whitlock, 2009-11-19 22:52:37

Чтобы использовать команду system, вам необходимо:

  1. Настройка ssh без пароля
  2. Выполните команду, подобную scp filename1 userid@hostname:filename2, проверьте man scp. Вы можете сделать то же самое с sftp, но с некоторыми другими вариантами
 0
Author: Elalfer, 2009-11-19 22:53:21

Вы можете использовать реализацию библиотеки SSHv2 на чистом 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");
?>
 0
Author: Oswaldo Rodriguez Gonzalez, 2018-07-13 05:38:17