SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】phpでSFTPする例

問題

phpでSFTPしたいと思ったんですけど、ssh2_exec()を使ってlsコマンドしようとしたらエラーになりました!

ssh2_exec(): Unable to request command execution on remote host

php-logo

答え

sftpしかさせてもらえない設定になっている接続先などに対しては、シェルのコマンドなどの実行は拒否されたりします。

また、ssh2_exec()はシェルのコマンドは実行できそうですが、対話式にsftpを開始して、その中でsftpのコマンドを実行して結果をとる…といった動きをしたい場合は、せめて ssh2_shell()の方を使うべきかもしれません。

sftpでリモートのファイル一覧が欲しい時などは以下のようにssh2.sftp://するとよいです。

<?php

//接続情報
$host = '192.0.2.123';
$port = 12345;
$user = 'hogeuser';
$pass = 'fugapass';

//接続
$c = ssh2_connect($host, $port);
ssh2_auth_password($c, $user, $pass);

//SFTPを開始して、あるディレクトリのファイル一覧を取得する
$sftp = ssh2_sftp($c);
$handle = opendir("ssh2.sftp://$sftp/xxx/yyy/zzz");
echo "Entries:\n";
while (false != ($entry = readdir($handle))){
    echo "$entry\n";
}

上記のサンプルコードの「/xxx/yyy/zzz」のところを実際何にしたらよいかわからなかったら、一度何かしらのsftpクライアント(sftp対応ソフト、sftpコマンドなど)で接続して「pwd」コマンド(サーバー側のカレントディレクトリを表示するコマンド)を実行して返ってきた値などを入れてみると、うまくいくかもしれません。

ファイルの内容の取得は以下のような感じで(環境によっては file_get_contents()でも動くのかもしれない)。

<?php

//接続情報
$host = '192.0.2.123';
$port = 12345;
$user = 'hogeuser';
$pass = 'fugapass';

//接続
$c = ssh2_connect($host, $port);
ssh2_auth_password($c, $user, $pass);

//SFTPを開始して、あるファイルの内容を読み取る
$sftp = ssh2_sftp($c);
$handle = fopen("ssh2.sftp://$sftp/xxx/yyy/zzz", 'r');
$x = fread($handle, 100000);

//内容確認
var_dump($x);

メモ

ルートディレクトリ “ssh2.sftp://$sftp/” のファイル一覧を取得しようとするとうまくいかないことがあるようです。

そんな時は、 “ssh2.sftp://$sftp/.” と指定するとできました。

関連するメモ

コメント