他のサーバーのディレクトリのファイルを一覧表示したい
Ssh2_connect関数を使用して他のサーバーに接続していますが、接続は順調に進んでおり、目的のファイルを取得できますが、ファイルの一覧表示方法がわかりません。
次のように、 ssh2_sftp と opendir を使用できます。
<?php
$connection = ssh2_connect('Shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$sftp_fd = intval($sftp);
$handle = opendir("ssh2.sftp://$sftp_fd/path/to/directory");
echo "Directory handle: $handle\n";
echo "Entries:\n";
while (false != ($entry = readdir($handle))){
echo "$entry\n";
}
誰かがこれを機能させるのに苦労していて、_PHP 5.6.28
_を実行している場合、要件を作成するか、各SFTPフォルダーでintval()
を使用する必要があるというバグが発生した最近の更新がありました/ファイルアクセス機能:
_$handle = opendir("ssh2.sftp://".intval($sftp)."/path/to/directory");
_
http://www.php.net/manual/en/function.ssh2-exec.php
UNIXベースのシステム(通常はケース)であると想定して、ls
コマンドを指定します。それ以外の場合は、Windowsのdir
のようなOP固有のコマンドです。
<?php
$connection = ssh2_connect('Shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stream = ssh2_exec($connection, 'ls');
?>
これは、ディレクトリを再帰的にスキャンして、再帰パラメーターが設定されている場合は多次元配列を返す、またはパスがスキャンされていない場合はそのディレクトリ内のファイルを含む1次元配列を返すことができるメソッドです。必要に応じて、非再帰モードでコンテンツのないディレクトリを含めるように変更できます。
クラスとして作成すると、後で簡単に再利用できます。質問への回答に必要なクラスのメソッドのみを含めました。
$Host = 'example.com';
$port = 22;
$username = 'user1';
$password = 'password123';
$path = '.';
$recursive = true;
$conn = new SFTP($Host, $port);
$conn->login($username, $password);
$files = $conn->ls($path, $recursive);
var_dump($files);
class SFTP
{
private $connection;
private $sftp;
public function __construct($Host, $port = 22)
{
$this->connection = @ssh2_connect($Host, $port);
if (! $this->connection)
throw new Exception("Could not connect to $Host on port $port.");
}
public function login($username, $password)
{
if (! @ssh2_auth_password($this->connection, $username, $password))
throw new Exception("Could not authenticate with username $username");
$this->sftp = @ssh2_sftp($this->connection);
if (! $this->sftp)
throw new Exception("Could not initialize SFTP subsystem.");
}
public function ls($remote_path, $recursive = false)
{
$tmp = $this->sftp;
$sftp = intval($tmp);
$dir = "ssh2.sftp://$sftp/$remote_path";
$contents = array();
$handle = opendir($dir);
while (($file = readdir($handle)) !== false) {
if (substr("$file", 0, 1) != "."){
if (is_dir("$dir/$file")){
if ($recursive) {
$contents[$file] = array();
$contents[$file] = $this->ls("$remote_path/$file", $recursive);
}
} else {
$contents[] = $file;
}
}
}
closedir($handle);
return $contents;
}
}