Как 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 [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-соединения.
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.
Но мой php-сервер говорит, что ss2_connect не определен.
Для устранения этой ошибки вам следует установить расширение ssh2 на php вашего сервера.
Используйте встроенную библиотеку SSH. Использование функции scp также будет проще, чем инициирование сеанса sftp.
Чтобы использовать команду system
, вам необходимо:
- Настройка ssh без пароля
- Выполните команду, подобную
scp filename1 userid@hostname:filename2
, проверьтеman scp
. Вы можете сделать то же самое сsftp
, но с некоторыми другими вариантами
Вы можете использовать реализацию библиотеки 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");
?>