質問: `~/Pictures/backup/` というディレクトリの下に写真がたくさんあります。Permission はこのようになっています ``` $ ls -l IMG_0944.JPG -rw-r--r-- 1 Yosh Yosh 2192854 Mar 2 2019 IMG_0944.JPG ``` 写真の整理をしたくて、とりあえずこのディレクトリにあるファイルの exif 等をよんでデータベースを作るようなプログラムを作成しました。このプログラムは既存の画像ファイルを読み込むだけで、上書きしたり消去したりはしないはずですが、もしかすると自分がバグを作り込んでいて、そうした挙動をしてしまうかもしれません。 写真のデータが失われることは絶対に避けたいので、何らかの方法で実行時にこれらのファイルへの書き込み・消去ができないような(しかしこのプログラムが作るデータベースは書き込めるような)制限をかけられないかと思いました。このようなうまい方法はあるでしょうか?あるいは、同様の目標を達成するために一般に用いられる他の方法がありますか?(バックアップをとっておくことは勿論自明で重要な解決策ですが、それはさておき) 環境は Ubuntu 18.04.4 LTS です。
回答: 別ユーザでプログラムを実行することにより、ファイル書き込みでエラーにすることができます。 ``` $ ls -l testfile -rw-rw-r-- 1 tst tst 19 Jul 15 23:47 testfile $ cat testfile テストデータ ``` testfileの所有者はtstで、otherの書き込みパーミッション(w)がないため、tstユーザ以外のユーザはこのファイルに書き込むことができません。 testfileに書き込むプログラムprg.shを別ユーザ(tst2)で実行してみます。 【prg.sh】 ``` #!/bin/sh id echo "BUG" > ./testfile ``` prg.shの実行結果 ``` $ su tst2 ./prg.sh Password: uid=1002(tst2) gid=1002(tst2) groups=1002(tst2) ./prg.sh: line 3: ./testfile: Permission denied $ ls -l testfile -rw-rw-r-- 1 tst tst 19 Jul 15 23:47 testfile $ cat testfile テストデータ ``` prg.shの3行目の`echo "BUG" > ./testfile`でエラーが発生しています。 testfileはタイムスタンプ、内容とも変化していません。 コメントにあるYoshさんの懸念ですが、 > > ちなみに、1つのプログラムの実行のためにユーザを追加することはよく有ることなのでしょうか?: ある種の濫用なのかどうかを気にしています) > > > この仕組みはもともと他のユーザに修正させたくないためのものですので、本来の使い方であり、濫用とは思えません。 ※ユーザが多数の場合はメンテナンスの手間を考えるかもしれませんが、今回のケースでは問題にならないと思います。 検証に使用した環境はWSLの`Ubuntu 18.04.4 LTS`です。