前回では、Laravel Collective Remoteを利用して、sftpでファイルをアップロード・ダウンロードする話をしました。それだけで事はほとんど足りるのですが、1つ困ったことがありました。
sftpを使用するのは、たいてい自社のサーバーとではなく、他社とのサーバーとです。注文データを取得してくるのも、こちらのデータをアップロードするのも。御存知のように、sftpはsshと同じプロトコルであり、sshが使用できるならsftpも使用可能。しかし、先のような状況だと、セキュリティのために、sftpは使用できるけれど、sshは使用できないようにサーバーが設定されています。また、sftpでは、勝手に他のディレクトリへ行ったりできないように、閲覧できるディレクトリを特定して、jail
します。
このような制限された設定となると、例えば以下のように、ls
コマンドの実行が不可能となり、ファイルのリストさえ取ってくることできなくなります。
Psy Shell v0.7.2 (PHP 5.6.26 — cli) by Justin Hileman >>> use SSH; => null >>> SSH::into('acme')->run(['ls data']); [foo@acme] (acme) This service allows sftp connections only. ..
かと言って、
>>> SSH::into('acme')->list('data'); PHP Fatal error: Call to undefined method Collective\Remote\Connection::list()
のように、list
のコマンドがあるわけでもありません。
いろいろ、探ってみると、
Laravel Collective Remoteは、
https://github.com/LaravelCollective/remote/blob/5.3/src/SecLibGateway.php
では、
以下のphpseclibというパッケージを使用しています。
https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Net/SFTP.php
これらを参考にすると、
>>>SSH::into('acme')->getGateway()->getConnection()->nlist('data'); => [ "base-invoice.csv", "base-product.csv", ".", ] ..
というように、nlist
を実行できます。
他にも、chdir
とも実行できるようです。オープンソースのおかげでこういう問題自分で解決できます。