普段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本指でタップして出るメニューから「情報をみる」を選ぶ。
その一番下の「共有とアクセス権」のアクセス権を変更する。
対処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で管理する方が良い。
この記事に需要があるかはわからない。