質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.21%

Vagrantでphpからファイルの書き込みができない【初心者】

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,968

udonya

score 9

PHPを、ローカル環境のVagrantで動作させています。
file_put_contents()でテキストファイルに上書きしようとしたところ、できませんでした。
(is_writable()でもFALSEを返されました、ディレクトリは/var/www/html)
調べたところによるとVagrantがファイルの書き込みを許可していないようでして、Vagrantfileを書き換えればいいそうなのですが、その書き換え方がわかりません。

config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=666"]
とするとうまくいく等あったのですが、There is a syntax error in the following Vagrantfile.と表示され、大量の赤字エラーを吐き出されました。"/vagrant"を"/var/www/html"としても同じでした。

どうすればVagrantでファイル書き込みの許可をもらうことができるでしょうか?

Vagrantの導入はドットインストールさんに従いました。
OSはMacです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

There is a syntax error in the following Vagrantfile.
これはvagrantFileの書き方が間違っているという意味のエラーですね。
どこかに文法の間違いなどはないでしょうか?
ちなみにPHPは仮想マシン上で動かしているという理解でよろしいでしょうか。
/var/www/htmlに権限を与えることで解決すると思いますが,Apacheのrootディレクトリをログインユーザのhomeディレクトリ以下に配置することで解決できそうな気もします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/06 00:04

    tkow様、ご回答ありがとうございます!
    ご指摘の通り、PHPは仮想マシン上で動かしています。
    /var/www/htmlに権限を与える方法というのがよくわからないのですが、ご教授願えますか。(初歩的なこともままならないのでcommand等を丁寧に教えていただきたいです)

    キャンセル

  • 2016/03/06 03:41 編集

    udonya様

    sekitaka_1214さんの回答がとりあえず動かすだけであれば一番早いと思います。

    chmod の引数0~7は二進数化したものとrwx(読み,書き,実行の権限)という記号の並びと対応してまして,例えば,6であれば,二進数化して, 1,1,0となるので,rwを許可して,xは許可しないという風に1が存在する場所の権限を許可し,0の所を不許可にするという意味があります。

    そして,777というのはそれぞれの桁が,u:所有者,g:グループ,o:その他のユーザ,の権限に対応しており,chmod 771 file(or directory)と指定すると,所有者とグループは全権限の許可で,一般のユーザーはそのファイルの実行権限のみ与えられます。
    また4桁の数字の時は最初の数字をスティッキービットと言って1のとき,所有者(デフォルトではファイルの作成者,chownというコマンドで変更することも可能です)とスーパーユーザーしか,名前の変更とファイルの削除ができなくなります。

    またこれらの権限カテゴリを指定して,権限を変えることもできます。一般ユーザの権限だけを変更したい場合は,+は権限の付与,-は剥奪です。

    chmod o+r-x

    また全部の権限カテゴリにa:allを使って一括で権限変更できます。

    chmod a+rwx

    chmodはファイルの所有者または,スーパーユーザーであれば権限なしでも実行できるので,誤って,全ての権限を消してしまってもそれらのユーザーでchmodを実行すれば直せます。
    今回は仮想環境でありますし,作業のしやすさのため,実行,書き込み,読み取り権限を全て一般ユーザーに与えてもいい(恐らく/var/www/htmlはスーパーユーザー権限になっている)と思うので,sudo chmod xx7(xは0~7までの任意の数字)で行っておくといいと思います。ちなみにchmodは引数にするファイルの所有者であれば権限がなくても実行できます。またスーパーユーザーであればいつでも権限の変更が可能です。なので,スーパーユーザーを乗っ取られると,パソコン全てのプログラムに権限を持てることになってしまうことになってしまうため,実運用では,十分気をつけてください。

    実運用では,superuserのパスワード認証を複雑なものにしたり,秘密鍵暗号などの認証だけでしかログインさせない,リモートログインの不許可などを実施したりします。

    なので,ファイルアクセスはサーバをグループとしてアクセスするようにし,一般ユーザはできるだけ読みとり権限以外,さらには,特定のファイル以外に与えないようにするのが望ましいです。本当に大事なファイルはsuperuserを所有者にしてそれ以外の人に作業できないようにさせます。またプログラムの開発はプログラムのインストールはsuperuserのみで行い,一部の言語モジュールのインストールや実行権限,コードの書き換えは所有者およびgroup権限(一部のバージョン管理ツールはインストール時にグループ権限や所有者をツール名に変更して所有者に権限付与している。こうすれば同一マシン上で複数ユーザーで共同作業が可能になる)で行い,一般ユーザにはサーバアクセス以外に何も権限を与えないことが望ましいです。

    ちなみに,vagrant はプロヴィジョニングと言って,初回起動時にVagrantfileにshell(など,shell以外にもprovisiongツールと連携可能)の一連のコマンドを(コマンドでやり直しが可能)自動で実行出来る機能が存在していて,そこに chmod 777 /var/www/html などと書き込めばvagrant初回起動時に権限付与ができます。
    具体的には,
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    (中)
    end

    の中のどこかに

    config.vm.provision :shell, :inline => <<-SCRIPT
    chmod 777 /var/www/html
    SCRIPT

    と書いてvagrat up,vagrant reload,(初回起動時以外はvagrant provision)とすれば,反映されます(直接ログインして権限変更する方が簡単だと思いますが)。因みにvagrant の起動コマンドは,スーパーユーザー権限でshellの実行を行うのでsudoいりません。一般ユーザー(defaultはvagrant)でshellを実行したい場合はprevillegedというオプションをつけるとできます。(所有者をユーザーにしたいユーザーのホームディレクトリ以下にファイルを配置したいshellのプロヴィジョニングによって得られたファイルの所有者を特定のユーザーにしたいなどの理由で変更します)

    少し書き方を変えていますが,以下の記事も参考になると思うのでよかったらどうぞ。

    http://k-holy.hatenablog.com/entry/2013/09/05/084237

    因みにudonya様が書かれている

    config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=666"]

    という記述は, ホストとゲストのosで共有するディレクトリを指定して,directoryの権限と,fileの権限を変更している記述ですのでゲストの/var/www/htmlを共有ディレクトリにしない限り権限付与との直接の関係はありません。

    またphpでwebアプリケーションなどを作成して実運用と同じように外部のマシンと接続で試したい場合,仮想マシンはゲストはホストと分離された別マシンと等価なので同じネットワーク内でつなげば,ゲストのサーバにホストのブラウザからアクセスするという方法が試せます。

    この場合は,Vagrantfileにホストオンリーアダプタという機能をonにするの記述を追加するのがいい方法だと思います。

    linuxは覚えることも多くて使いこなせるようになるまで苦労すると思いますが,日々コマンドを打ち込んで実行結果を見て何が起きているか考えること,何かやりづらいと思った時に効率のいい方法がないか調べること,ギークな人の記事を読むことを実践していけば着実にレベルが上がっていくと思うので頑張って下さい。

    キャンセル

  • 2016/03/06 11:44

    tkow様
    実運用の面までのアドバイス、丁寧な解説ありがとうございました!
    この回答を参考に今後も理解を深めていこうと思います。

    キャンセル

+1

vagrant ssh

 

して、仮想マシンがわで

sudo chmod 777 /var/www/html


で権限を付与することはできますよ。
777は誰でも書き込み出来る権限で、セキュリティ上あまり良くないので、後ほど勉強してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/06 11:43

    sekitaka_1214様
    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる