前回では、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とも実行できるようです。オープンソースのおかげでこういう問題自分で解決できます。
