Macでのファイル編集についての質問

このQ&Aのポイント
  • Macの「/Users/ユーザー名/Sites」内のファイルを別のユーザー名から編集する方法について質問です。Perlのopenを使用してファイルマネージャーのように編集できるのか不明です。
  • 所有権やアクセス権の制約によりopenでは編集できない場合、net2ftpを使用してSFTPサーバーへ接続しデータのやり取りを行うことは可能でしょうか?Hight Sierra以前ではFTP経由で編集できたため、SFTP接続なら可能かもしれません。
  • Net::SFTP::Foreignを使用してPerlからSFTP接続を行うことができますが、ソースコードがわかりません。解説サイトやソースコードの書き方についてご存知の方がいらっしゃれば教えてください。ググっても目的の情報が見つからなかったため、助けをお願いしたいです。
回答を見る
  • ベストアンサー

Macについて質問です。

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

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

  • ベストアンサー
回答No.1

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を探されるのが よいかと思いますよ。

humu01jp
質問者

補足

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

関連するQ&A

  • ファイルマネージャーのソースコード

    お世話になります。 先日、Perlモジュールである、Net::SFTP::ForeignをMacのmojaveにぶち込みました。 それで、レンタルサーバサービスにあるようなファイルマネージャーをPerlで作って、ウェブブラウザ上でユーザーのローカルにあるデータを当方のサーバとで送受信をしたいのですが、ソースコードがわかりません。 最初はopenによるファイル操作でファイルを編集するスクリプトを書きましたが、所有権やアクセス権の問題で、ファイルを編集できないことに気づき、仕方ないのでsshでやり取りしたいのですが、書き方が分からず詰まっております。 目的のソースコードを書ける方、もしくは解説サイトかなにかをご存知の方、いらっしゃったらご教示願います。

  • ファイルマネージャー

    perlで書かれたwebminにあるファイルマネージャーを利用すると、システムの所有権関係なく、ファイルの編集ができるようですが、その編集するためのソースコードがわかる方はいらっしゃいますか? 通常のopen関数ではできなかったし、net::sftp::foreignのputだとローカルとリモートのやり取りなので、リモートとローカルが同一のマシンでしかやり取りできず、端末を変えるとエラーになります。 レンタルサーバー向けのファイルマネージャーの開発になります。 裏技としてアカウント生成時にアカウント内に個別にファイル編集スクリプトをぶち込んでおいて、それを使って編集してやればやれなくはないですけど、それだと手間がかかりますので、あまりやりたくないです。 かと言って、ftpクライアントを入れるのがめんどいって方に入れていただくのも、なんと言いますか……

  • perlでFTP

    ローカルPCからPerlで記述されたプログラムを実行し、 FTPサーバーへファイルをアップロードするPerlプログラムを教えてください。 DOS上では、 ftp open ftpサーバー名 ユーザー名 パスワード put 送信するファイル bye となるのですが、それをPerlで記述すると、どのようになるのでしょうか?

    • ベストアンサー
    • Perl
  • サーバーが自動でソースコードを修正してる?

    SFTPクライアントfilezillaでperl のソースコードをサーバーへアップしています。 デバッグ作業などの際、ソースファイルをアップして、サーバーのソースファイルを上書きすると現在のファイルサイズと上書き後のファイルサイズが確認できます。 たった今上書きしたソースファイルを、またすぐアップ・上書きするとソースファイルのサイズは同じであると思うのですが、かなりサイズが減らされているのが確認できます。 これはサーバーが、ソースがアップされると同時にそのソースの中身を自動で編集・余分なもの削除を行っているのでしょうか? また、その代表的な事例、目的などを教えて頂けたらと思います。 サーバーOS: FreeBSD よろしくお願いします。

  • NET::SFTP::FOREIGN

    perlモジュールのnet::sftp::foreignについてですが、$sftp->chmodと打っても、サーバ上のファイルのパーミッションを変えることができません。 $sftp->にchmodのコマンドは使えないのですか? また、パーミッションを変えるコマンドが他にある場合、それも教えて下さい。

  • perl

    net::sftp::foreignでperl上からperlスクリプトを新規作成したり編集すると、500エラーになりますが、なにが原因なんでしょうか?

    • ベストアンサー
    • Perl
  • 文字コードも改行コードも変更できなくていいので、

    文字コードも改行コードも変更できなくていいので、 すでにサーバーにアップされているテキストファイルを、 ブラウザから編集できるCGIスクリプトを探しています。 削除機能等、余計な物ばかり付いている物しか見当たらないので、 パール言語に詳しい方は、ソースをおしえてください。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • サーバー間でファイルコピーしたい

    WEB上のレンタルサーバーを複数使用しているのですが、それらの間でファイルをコピーするのに、一旦ローカルPCにダウンロードしてからアップロードするのは不便です。 そこで、ファイル名と送り先のサーバーとユーザー名・パスワード等必要な情報をインプットすればファイルをコピーするようなCGIを設置出来ないかと考えています。 Net::FTPを使えば出来るのかな?とか思って #!/usr/bin/perl -w use CGI::Carp qw(fatalsToBrowser); use Net::FTP; $ftp = Net::FTP->new('サーバー'); $ftp->login("ユーザー名", "パスワード"); $ftp->get("index.html"); $ftp->quit; exit; と、やってみましたが Can't call method "login" on an undefined value at xxxxxxx. というエラーメッセージがでます。 同じスクリプトをローカルで動かすと問題なく動きます。 ひょっとして、サーバー同士ではファイルコピーは出来ないものなのでしょうか?

    • ベストアンサー
    • Perl
  • FTP接続時失敗時、接続先名をcsvに出力する

    Perl 初心者です。 FTP接続時失敗時、接続先名をcsvに出力する(書き出す)プログラムを作成しております。 ※複数FTPサーバがあり順番に接続していき、接続失敗したところをcsvに一覧にして出力したいです。もし、csvファイルがない場合、C:/logの下にERROR.csvを作成する必要もあります。 今現在、私が作成しているプログラムが以下になります。 #!C:/Perl/bin/perl use Net::FTP; use strict; my $i; my $j; my @ftp_data = ( ['ftp','192.168.0.0'], ['ftp2','192.168.0.10'], ); sub error{ my $file = "ERROR.csv"; if(!-d"C:/log/$file"){ open(TFILE,"+>> $file") or die($!); print OUT "$ftp_data[$i][0]"; close(TFILE); } else{ open(OUT, ">> $file"); # 追加オープン print OUT "$ftp_data[$i][0]"; close(TFILE); } exit; } for ($i = 0; $i <= $#ftp_data; $i++){ #FTPサーバーへの接続 my $ftp = Net::FTP->new("$ftp_data[$i][1]") or &error; #ユーザー名とパスワードを指定してログイン $ftp->login('user','password') or die $ftp->message; print "connect $ftp_data[$i][1]\n"; #接続終了 $ftp->quit; } 実行してみると何もでないでずっとループ?しているみたいなのですが、 どこが悪いのかよく分からないのです。 ご教示いただけないでしょうか?

    • ベストアンサー
    • Perl
  • Windowsで書かれたCGIファイルのUNIX上での扱いについて

    もともとWindowの環境で書かれたCGIファイル(Perl)を LINUXで編集したいのですが、編集後、Internal Server Error がでています。 S-JISで書かれた日本語コメント部分はそのままにしているのですが、 これが問題なのでしょうか。 ちなみに、オリジナルのソースはftpでサーバーにあげ(使用環境は Apacheです)、きちんとCRは除去してあり、何もいじらない場合は 問題無く動作しています。 よろしくお願いします。

    • 締切済み
    • CGI