Вопрос
Я занимаюсь созданием веб-приложения, которому, помимо прочего, необходимо будет подключаться к FTP-серверу для загрузки или выгрузки файлов.Приложение написано на PHP и размещено на сервере Linux.
Мне было интересно, можно ли также обеспечить поддержку SFTP-серверов, но после нескольких быстрых поисков в Google выяснилось, что не все так просто.
Итак, вопрос:Как лучше всего использовать SFTP из PHP?Существует ли класс, который также мог бы обеспечивать поддержку FTP и SFTP, чтобы можно было использовать одни и те же функции для обоих?
Решение
Да, вы можете сделать это с КУЛЬ.Чтобы переключиться с FTP на SFTP, все, что вам нужно сделать, это изменить форму параметров протокола. CURLPROTO_FTP
к CURLPROTO_SFTP
.
cURL поддерживает следующие протоколы:HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TELNET, LDAP, LDAPS, DICT, ФАЙЛ, TFTP.
КСТАТИ.SFTP не следует путать с FTPS.SFTP — это протокол передачи файлов SSH, а FTPS — это FTP через SSL.
Другие советы
если у вас не установлен cURL (на моем хосте его нет), вы можете использовать phpseclib:
http://phpseclib.sourceforge.net/documentation/net.html#net_sftp
На случай, если кто-то окажется на этой странице.
Вы также можете использовать PHP-привязки для LIBSSH2 с PHP.Он должен быть соответствующим образом установлен в системе.
В Ubuntu 10.04 и Debian Lenny естественно со всеми зависимостями
apt-get install libssh2-php
Проблема с рекомендацией Игоря заключается в том, что она, среди прочего, делает код гораздо менее переносимым (libssh2 не установлена на очень многих хостах), имеет гораздо более интуитивно понятный API на основе ООП, а аутентификация RSA действительно имеет смысл (libssh2 требует вы храните открытый ключ и закрытый ключ отдельно в файловой системе;тот факт, что их нужно предоставлять отдельно, глуп, поскольку большинство форматов закрытых ключей включать открытый ключ внутри них).
phpseclib также быстрее:
http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/#comment_3759
$dataFile = 'PASTE_FILE_NAME_HERE';
$sftpServer = 'PASTE_SFTP_SERVER_NAME_HERE';
$sftpUsername = 'PASTE_USERNAME_HERE';
$sftpPassword = 'PASTE_PASSWORD_HERE';
$sftpPort = 'PASTE_PORT_HERE';
$sftpRemoteDir = '/';
$ch = curl_init('sftp://' . $sftpServer . ':' . $sftpPort . $sftpRemoteDir . '/' . basename($dataFile));
$fh = fopen($dataFile, 'r');
if ($fh) {
curl_setopt($ch, CURLOPT_USERPWD, $sftpUsername . ':' . $sftpPassword);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($dataFile));
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($response) {
echo "Success";
} else {
echo "Failure";
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
echo "Verbose information:\n" . $verboseLog . "\n";
}
}