こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Macについて質問です。

「/Users/ユーザー名/Sites」内のファイルを別のユーザー名からPerlのopenを使って、ファイルマネージャーのようにファイルを編集できるようにしたいのですが、不可能なのでしょうか?
なぜこれをやりたいのかと言うと、当方のサーバーでレンタルサーバーをやってるからです。
所有権とかアクセス権などで、openで無理なら、net2ftpみたいなのでSFTPサーバーに繋いで、データのやり取りをしようと思ったのですが、可能ですか?
Hight sierra以前でFTPが使える時は、net2ftpで編集できてたので、SFTP接続ならできるのかな、と思っています。
そこで、当方は、Net::SFTP::Foreignを入れて、PerlからSFTP接続をできるようにしたのですが、肝心のソースコードがわからなくて困っています。
どこか、解説サイトとかご存知の方はいらっしゃいますか?
それか、ソースコードを書けるって方でもいいです。
一応、当方でもググったのですが、これといったものがでてきませんでした。
よろしくお願いします。

投稿日時 - 2019-05-10 21:50:45

QNo.9615371

困ってます

質問者が選んだベストアンサー

Macについてとタイトルにありますが、Macだから特有のことでなく、
・ターミナルでperlを実行するだけなら自分のファイルを上書きすることは可能。
・CGIとして実行するなら、実行オーナーとファイルのオーナーが異なるので上書不可。
という現象はどんなOSでも起きえます。

対策として考えられるのは
・セキュリティーを気にしないなら、対象ファイルやディレクトリのパーミッションを緩める
・suEXECを使ってCGI実行のオーナーを切り替える
・ファイルを上書きする部分を子プログラム化してsudo付きでシステムコールする
・CGIからID/Passwordを指定してftp.やsftpやftps接続する
 (ftpでgetしたり、サーバー上に作った一時ファイルをftpでputする)
といったところでしょうか。

ただし、このようなファイルマネージャ的なWebアプリを自作するうえでの注意は、
同時編集で修正箇所が消失しないようにする排他処理が必要な点です。
例えば、
A端末で、ファイルを開いて時間をかけて修正してから上書き
B端末で、A端末が修正している間に同じファイルを上書き
が行えてしまうと、B端末で行った修正箇所が、A端末からの上書きで取り消されてしまいます。
普通のファイルI/Oなら先に編集を開始したほうがファイルロックを行い、
それが終わるまでは他のアプリケーションからは編集できないようにしますが
ブラウザからの操作だと、編集途中にロックしたままブラウザの画面を閉じてしまうと、
それをサーバー側は感知できませんから、ロックされたままになって
そのファイルが、どこからも修正できない状態になってしまう問題が発生します。
これは、継続的にコネクションしていないステートレスなhttp通信の 特有の問題です。
なので、時限のファイルロック方式するけどAjaxでロックを延長したり
保存前でもAjaxでdraft保存しておいて後から編集する端末に編集を引き継がせたり
同時編集ありきで修正前と修正後の差分のみをマージしたりといった工夫が必要に
なるでしょう。

他にも、ファイル一覧のディレクトリ移動をスムーズにするために
ファイルリストはある程度の期間はキャッシュさせたいけれども
他端末やアプリケーションから更新されたファイルがあったときに
キャッシュにどうやって同期させるかや
開いているままのファイル一覧に 他から更新されたファイルをどうやって反映させるか
といった、運用場面のケースをいろいろ想定してちゃんと作ろうとすると、
結構、難易度の高いプログラミングになるでしょう。
(もちろん 同時編集されて修正箇所が消失しても知ったこっちゃないし
 ファイル一覧は、ユーザーが手動でリロードするまでそのまま
 という方法もありますが)

ですので、必要な機能を有している既成のCGIを探されるのが よいかと思いますよ。

投稿日時 - 2019-05-12 19:53:43

補足

一応、探したんですけど、見つからなくて。探し方が悪いんでしょうけど。
いずれにせよ、回答ありがとうございました。

投稿日時 - 2019-05-13 14:26:17

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)