2011-10-19 12 views
3

Linuxサーバで動作するPHPスクリプトを使用して、いくつかのWindowsサーバ上の共有フォルダにアクセスできる必要があります。私は、フォルダに含まれるファイルの名前と、作成された場所のタイムスタンプを取得する必要があります。Windowsの共有フォルダをlinuxからPHPで

私が今までに思いついた唯一の解決策は、Linuxに共有をマウントしてそこからアクセスすることです。これで問題は解決しますが、rootとして(私が知っている限り)実行する必要があります。つまり、ルートとしてスクリプトを実行する必要があります。長期的に管理する

これは2つの質問につながります。

  1. もっと良い方法はありますか?それが必要な場合は、すべてのマシンに対して管理者権限を持っています。
  2. ここで取り組まなければならないセキュリティ上の問題は何ですか?私は根本的な問題を克服する必要があり、linux/phpスクリプトはWindowsマシン上のファイルを編集/削除できないことを保証する必要がありますが、暗闇の中に潜んでいるものよりも多くの問題があるかもしれないと思います。
+1

なぜ '/ etc/fstab'を使ってブート時にファイルシステムをマウントしていませんか? – sarnold

+0

私はまだ手作業ですべてをマウントすることに悩まされていましたが、突然100以上の異なるWindowsサーバーが必要な場合には問題になります。理想的には私のPHPスクリプトは、サーバーインベントリデータベースからwindowsserversの名前を読み取って、必要なファイルがそのサーバー上の正しいフォルダにあることを確認します(必要に応じてフォルダをマウントしてからアンマウントするか、可能であればサーバー上で)、次のメッセージに進みます。 – Lobo

答えて

2

新しいファイルシステムを追加するために/etc/fstabを編集することは間違いなく厄介な制約です。

サーバー上のファイルと変更時刻を一覧表示するだけの場合は、smbclient(1)コマンドを使用するのが適切です。 smbclient(1)は、SMBとCIFS共有のFTPインターフェイスによく似ています。 -cコマンドラインオプションを使用すると、特定のコマンドを実行できます。その後、ちょうど修正時刻をリストより

smbclient //$servername/$sharename -c "dir path/to/directory/" 

ファイルでより多くのをやっているつもりなら、ファイルシステムとして共有をマウントすると、接続および認証要求の数を減らし、そしておそらくstat(2)を解析するようになります:ような何かデータのプレーンテキスト表現を解析するよりはるかに簡単に出力できます。

ファイルシステムのマウントのルートを下りたい場合は、まずスクリプトを分割します。

小さいものは、servername、共有パス、およびオプションのマウントパスを取る必要があります。 /etc/fstabに(サーバー、共有、パス)を追加します。

この部分はrootに設定できます。あなたはacl(5)サポートを使用してファイルシステムをマウントして、新しいアクセス制御エントリを追加することができ、(危険ですが、rootとして全体のPHPスクリプトを実行しているビートどの。)

または:

mount/-oremount,acl 
setfacl -m www::rw /etc/fstab 

wwwユーザーが持っています/etc/fstabファイルを変更する権限。 (ユーザが/etc/fstabへの書き込みアクセス権を与えるためにACLを使用した場合、実際にはaddmntent(3)をテストしていないことに注意してください)。/etc/fstabを必ず変更してをaclにマウントしてください。

addmntent(3) Cライブラリ関数を使用して、/etc/fstabに新しいエントリを追加できます。私は、addmntent(3)がすでに正しくフォーマットされたマウントエントリを/etc/fstabに書き込む方法を知っているので、setuidのルート実行ファイルを使用する場合はスクリプト言語でCを選び、とにかくスクリプト言語よりCを選ぶでしょう。

usernoautoオプションを含めると、スクリプトは特権を持たずに実行され、必要に応じて共有をマウントできます。

+0

私の同僚にもsmbclientの使用に関するいくつかの理論がありました。あなたの他のアイデアはとても役に立ちました。ありがとう。 – Lobo

関連する問題