Как использовать SFTP для загрузки файлов с PHP
Вопрос
У меня возникли проблемы с использованием PHP для загрузки файлов SFTP на удаленный сервер.Когда я использую cURL, я получаю ошибку, описанную здесь:
SFTP из PHP - неопределенные константы CURLOPT_PROTOCOLS и 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.У меня нет доступа к оболочке для создания 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.
Для использования system
командуйте, вы должны:
- Настройка ssh без пароля
- Запустите команду, подобную
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");
?>