Как использовать SFTP для загрузки файлов с PHP

StackOverflow https://stackoverflow.com/questions/1767117

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня возникли проблемы с использованием 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 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.У меня нет доступа к оболочке для создания ssh-ключей.

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

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

Это было полезно?

Решение

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.

Другие советы

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

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

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

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

Для использования system командуйте, вы должны:

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

Вы можете использовать чистую 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");
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top