2019/11/25

sudo しないとアクセスできないファイルをローカルにコピーする方法

普通にscpとかを使ってもできない.
以下のようにsshすればできる.

ssh -t user@host 'echo パスワード |sudo -S cat ファイルパス' > ローカルファイル名

2019/11/06

異なるファイルが置かれた複数のデスクトップを切り替えながら使う方法

Dropboxがシンボリックリンク非対応になった問題を解決する方法 を探していたら,副産物として,デスクトップを簡単に切り替える方法を考えついたので,メモを残す.

タイトルに有る通り,別々のファイルが置かれたデスクトップを複数用意することができる方法であって,MacのMission Controlのように,隣のデスクトップに移動しても同じファイルがありつつ,ウィンドウを広げるスペースを確保する話とは全く異なるので注意.
つまり,例えば,仕事用のファイルを置いたデスクトップとプライベート用ファイルを置いたデスクトップをそれぞれ分けて使うことが可能になったりする.

使うのは,bindfsというツール.
bindfs は FUSEの仕組みを使って,任意のファイルシステムをマウントできるものらしい.
とりあえず以下でインストール.


brew cask install osxfuse
brew install bindfs

使い方は簡単で,

bindfs somedir/ mountdir/

とすると,somedirがmountdirにマウントされる.
これを使い,以下のように,任意のフォルダ(somedir)を~/Desktopにマウントすると,Desktopのファイル群がsomedirの中身に入れ替わる.
切り替えて戻しても,ファイルの配置はそのまま.

bindfs -o volname=Desktop ~/somedir/ ~/Desktop/

戻すときはアンマウント(ディスクを取り出す)すればOK.

Dropboxがシンボリックリンク非対応になった問題を解決する方法


先日,Dropboxから,今後はシンボリックリンクのファイルは同期しないようにする旨のアナウンスが来ていた.
Macでシンボリックリンクを使った 複数PCのDesktopをDropboxを使って同期する方法 が使えなくなってしまい頭を抱えてしまった.

試行錯誤の末,bindfsを使えば解決するばかりか,より良い実装にできそうということがわかったので,メモを残す.


悩んだ過程は以下の通り.

シンボリックリンクでDropboxは同期してくれない.
Googleドライブ,OneDriveも試したが,同じ仕様.
SugerSincはできるっぽいけど無料は90日限定.

ハードリンクならどうか.
ハードリンクは,High Sierra以降はファイルシステムとしてAPFSが強要されるため,ディレクトリのハードリンクは不可.
逐一ファイルごとにハードリンクを張るスクリプトを組むのは面倒臭すぎる...


結局たどり着いたのが,bindfs.
bindfs は FUSEの仕組みを使って,任意のファイルシステムをマウントできるものらしい.

とりあえずインストール.


brew cask install osxfuse
brew install bindfs

使い方は簡単で,

bindfs somedir/ mountdir/

とするだけ.
オプションを付けると色々とポリシーを変えたりできるらしい.
シンボリックリンクで実現していたときと同様に,DesktopをDropbox内にマウントしても,マウントされたファイルは同期対象にはならないので,Dropboxディレクトリ自体をDesktopディレクトリにマウントしてしまおう.
(このような使い方はAppleは想定していないと思うので,自己責任で)

以下のコマンドを打つと,Dropboxディレクトリに入っているものが,Desktopに表示されるようになる.

 bindfs -o volname=Desktop ~/Dropbox\ \(個人用\)/ ~/Desktop/

アンマウント(ディスクを取り出し)すると,元のDesktopに戻ります.
再度マウントするとちゃんと元の配置に戻るようになっている.


当然,再起動するとマウントされていない状態に戻るので,コマンドを打ち直す必要があります.
また,副作用として,ディスクとして扱われるのでDesktop外にファイルをドラッグすると,移動ではなくコピーになってしまいます.
コマンドキーを押しながらドラッグすると,移動になる(ただし,厳密には移動ではなく,コピーしてから削除なので,大きなファイルを移動するときはDropboxから直接動かしたほうが良い).

これでめでたく,複数PCのDesktopを同期することができました.