schedule2019-01-30

ファイルの権限を変更できない。Googleドライブのシンボリックリンクが原因でした

普段Gitにあげるほどでもないコードの開発は、マイドライブで行いバックアップしている。 MacのGoogleドライブのファイルストリーム内のファイルは読み書き権限の変更ができないようだ。 chmodやファイルの「情報をみる」から権限の変更を色々と試してみたが、失敗した。

結局、他のフォルダで試してみたところ変更ができたため原因はGoogleドライブと結論着けている。 ドライブ内のファイルはシンボリックリンクになっているため変更できない。 対処法はマイドライブ以外のディレクトリに移すこと。

メモしていたので気づくまでの過程を残す。

症状

lambda_function.pyの権限を変更できず困った。

$ ls -l lambda_function.py
-rwx------@  1 user  staff     3414  1 30 00:58 lambda_function.py

AWS Lambdaにファイルをあげて実行しようとしたとき、Permission denied (実行ファイルの権限がない)とエラーが出ました。

「あー、権限ね。」とコマンドでchmod 755 ファイル名としてもまたエラーが。。。

権限をみると-rwx------@と自分の権限しか付いていません。 rootで実行してもダメでした。

補足

chmodはファイルの読み書き実行とユーザーの権限を変更できるコマンド。

コマンド以外の方法では、ファイルを2本指でタップして出るメニューから「情報をみる」を選ぶ。

info

その一番下の「共有とアクセス権」のアクセス権を変更する。

auth

対処1 謎の@

ls -lで確認すると-rwx------@となっており**@が原因だと考えた。 @は拡張ファイル属性**といってrwx以外の属性が付いている印です。

どんな属性かはコマンドls -l@で見ることができます。

$ ls -l@ lambda_function.py
-rwx------@ 1 user  staff  3414  1 30 00:58 lambda_function.py
        com.apple.lastuseddate#PS         16

このファイルにはcom.apple.lastuseddate#PSの属性が付いていた。。 よくわかっていませんが、ここによるとディスクスペース解放のためのものらしいです。 そう言われると、一度間違えてゴミ箱に捨てた覚えがある。。。

@を消す

下の記事に消す方法が書いてありました。(この方は別の拡張ファイル属性がついているようです)

[Sy] Macのパーミッションにある@(アットマーク)の正体と消す方法

拡張ファイル属性を削除します。 コマンドはxattr -d [削除したい属性] [ファイル名]です。

$ xattr -d com.apple.lastuseddate#PS lambda_function.py
$ ls -l lambda_function.py
-rwx------  1 user  staff  3414  1 30 00:58 lambda_function.py

消えた!!

権限の変更は。。。

$ chmod 755 lambda_function.py
$ ls -l lambda_function.py
-rwx------  1 user  staff  3414  1 30 00:58 lambda_function.py

ダメだった!!

参考

対処2 Googleドライブ

ls -lで権限を見たとき全てのファイル/ディレクトリが700になっていることが不自然だった。

$ ls -l
-rwx------@  1 user  staff     3414  1 30 00:58 lambda_function.py
drwx------   2 user  staff     4096  1 30 00:22 python_dateutil-2.7.5.dist-info
drwx------   3 user  staff     4096  1 30 00:22 s3transfer
drwx------   2 user  staff     4096  1 30 00:22 s3transfer-0.1.13.dist-info
(省略)

デスクトップのものはdrwxr-xr-xなどある。 そこで、ファイルを移したところ権限の変更ができた。

なぜGoogleドライブでは権限の変更ができないのか

なぜかわからずむしゃくしゃしたので探ってみた。

~直下で確認するとGoogleドライブの属性がdではなくlだと気づいた。

lrwx------   1 user  staff    20  1 30 08:40 Google Drive File Stream -> /Volumes/GoogleDrive
drwx------+  3 user  staff    96  2  1  2018 Movies
drwx------+  5 user  staff   160  6 27  2018 Music

dはディレクトリ、lはシンボリックリンクを表す。

なぜシンボリックリンクは権限の変更ができないのか

シンボリックリンクの権限に意味はないから。 リンク先の実態のあるファイルの権限を変える必要がある。

また、-rオプションでリンク先のディレクトリ内も再帰的に操作することを防いでいる。 オプション-Rなどを使ってリンク先を辿って変更できる。 しかし、試したがGoogleドライブ内のファイルは変更できなかった。

結論

長々と書いたが、他のディレクトリに移せばすぐに解決する。 ローカルなソースコードの管理はGoogleドライブで良いが、他の環境で動かすコードはGitで管理する方が良い。

この記事に需要があるかはわからない。