Как загрузить файлы по 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-соединения.


person John    schedule 19.11.2009    source источник


Ответы (5)


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.

person dreamafter    schedule 23.11.2009

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

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

person Community    schedule 21.02.2012

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

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

person Byron Whitlock    schedule 19.11.2009
comment
сервер, над которым я работаю, говорит, что ssh2_connect () не определен. Кроме того, удаленный хост, к которому я подключаюсь, не позволил мне выполнить scp file.csv [email protected] - person John; 20.11.2009
comment
Вероятно, это недоступно по умолчанию. Вам понадобится расширение PECL ssh2 с libssh2. - person Chris Kloberdanz; 20.11.2009

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

  1. Настроить SSH без пароля
  2. Запустите команду типа scp filename1 userid@hostname:filename2, отметьте man scp. Вы можете сделать то же самое с sftp, но с некоторыми другими параметрами
person Elalfer    schedule 19.11.2009

Вы можете использовать реализацию библиотеки 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");
?>
person Oswaldo Rodriguez Gonzalez    schedule 13.07.2018