質問
私は、他のもののほかに、ファイルをダウンロードまたはアップロードするFTPサーバーに接続する必要がありますWebアプリケーションを構築する過程にいますよ。アプリケーションはPHPで書かれ、それがLinuxサーバ上でホストされています。
私は思っていたこと、また、SFTPサーバのサポートを提供することが可能であるかどうかではなく、Googleでいくつかの簡単な検索をした後、これはすべてが単純ではないと思われます。
だから、質問です:PHP内からSFTPを使用するための最良の方法だろうか?同じ機能の両方のために使用することができるように、また、FTPだけでなく、SFTPのサポートを提供できるクラスはありますか?
解決
はい、あなたは cURLをするでそれを行うことができます。あなたがしなければならないすべてをSFTPするFTPから切り替えるにはCURLPROTO_FTP
にプロトコルオプションフォームCURLPROTO_SFTP
を変更することがあります。
のcURLは、次のプロトコルをサポートしています:HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TELNET、LDAP、LDAPS、DICT、FILE、TFTPを。
ところで。 SFTPはFTPSと混同してはなりません。 FTPSは、SSL上のFTPありながら、SFTPは、SSHファイル転送プロトコルです。
他のヒント
あなたはカールがインストールされていない場合は(私のホストはしない)、あなたはphpseclibを使用することができます:
http://phpseclib.sourceforge.net/documentation/net.html#net_sftp >
このページの場合、誰かに終了アップで。
また、PHPと PHPバインディングlibssh2のためして使用することができます。これは、適切にシステムにインストールする必要があります。
のUbuntu 10.04とDebianレニーにおいて、全ての依存関係を持つコースの
apt-get install libssh2-php
イゴールの勧告の問題は、それははるかに直感的なOOPベースのAPIを持ち、RSA認証は、実際には理にかなって、それは、とりわけ、はるかに少ない移植可能なコードになり(libssh2のは非常に多くのホスト上にインストールされていない)ということです(libssh2のは、ファイルシステム上で別々に公開鍵と秘密鍵を格納する必要があり、ほとんどの秘密鍵フォーマットはをするので、彼らが別々に提供されなければならないという事実は、愚かで、その中のの公開鍵が含まれます)<。 / P>
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";
}
}