PHPでSFTPする方法は?


83

私はWebFTPクライアント用の多くのPHPスクリプトに出くわしました。PHPでSFTPクライアントをWebアプリケーションとして実装する必要があります。PHPはSFTPをサポートしていますか?サンプルが見つかりませんでした。誰かがこれで私を助けることができますか?

回答:


72

PHPにはssh2ストリームラッパー(デフォルトでは無効)があるためssh2.sftp://、forプロトコルを使用して、ストリームラッパーをサポートする任意の関数でsftp接続を使用できます。

file_get_contents('ssh2.sftp://user:pass@example.com:22/path/to/filename');

または-ssh2拡張機能も使用している場合

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

http://php.net/manual/en/wrappers.ssh2.phpを参照してください

ちなみに、このトピックについてはすでにたくさんの質問があります。


file_get_contentsとfile_put_contentsはどちらも素晴らしい働きをします。彼らがsftpで動作することを知らなかったし、組み込みのsftpのものを使用するよりもはるかに簡単です。ありがとう!
jbrahy 2015年

3
file_get_contents()を使用する場合でも、ssh2拡張機能(afaik)が必要です。
StanE 2016年

debian / Ubuntuのパッケージ:インストールのapt libssh2-1-devのは、PHP-SSH2
アジャイ・シン

40

ssh2関数はあまり良くありません。使いにくく、まだインストールが難しいので、それらを使用すると、コードの移植性がゼロになることが保証されます。私の推奨は、純粋なPHPSFTP実装であるphpseclibを使用することです。


3
@indranamaこれを正解としてマークして、将来のユーザーがコメントを読んで自分に最適なものを見つける必要がないようにしますか?
fi Horan 2017年

30

「phpseclib」がこれ(SFTPおよびその他の多くの機能)に役立つはずであることがわかりました。http://phpseclib.sourceforge.net/

ファイルをサーバーに配置するには、(http://phpseclib.sourceforge.net/sftp/examples.html#putのコード例)を呼び出すだけです。

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);

2
gitリポジトリはここにあります:github.com/phpseclib/phpseclib/tree/master/phpseclib
relipse

1
phpseclib 2.0への回答を更新できますか?あなたの現在の例は時代遅れです。
マルティン・プリクリル

2

Flysystemをインストールします。

composer require league/flysystem-sftp

次に:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

読んだ:

https://flysystem.thephpleague.com/v1/docs/


-1

フルオンのコップアウトを実行し、バッチファイルを作成してから呼び出しsftpを介してsystem呼び出すクラスを作成しました。それを行うための最も良い(または最速の)方法ではありませんが、それは私が必要とするもののために機能し、PHPに追加のライブラリや拡張機能をインストールする必要はありませんでした。

ssh2拡張機能を使用したくない場合は、行く方法かもしれません


私を助けてくれた関連スレッド:groups.google.com/forum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.