Mac

管理者権限不要でリモートのSSHサーバをローカルにマウントし、リモートのファイルを大量処理する

投稿日:

WordPressのテーマファイルやプラグインのちょっとした修正時、リモートのSSHサーバ上に存在する画像ファイルに対して一括して圧縮をかけたいなど、リモートのSSHサーバに対して、毎回SSHで接続してファイルを更新するのが手間だなあという時があります。そのような場合には、リモートのSSHサーバをローカルのディレクトリのように扱うことのできる「FUSE」(Filesystem in Userspace)という仕組みが便利です。UNIX系OSのディストリビューションで利用できます。

「FUSE」の最大の特徴は、root権限を持たない一般ユーザが、独自のファイルシステム(APFS、HFS+、NTFSなど)を生成できることです。通常、ファイルシステムの生成にはroot権限(カーネルへのアクセス)を必要としますが、「FUSE」が橋渡しの役割を担い、一般ユーザにおいてもファイルシステムを生成することができるようになります。(実際には、橋渡しの役割をしているだけなので、内部では通常のファイルシステム生成と同様の動きをします)。

きっかけは、WordPress上に保存されている画像ファイル(/uploadsディレクトリ配下)に対して、一括で画像圧縮を行いたいと思ったことでした。

macOS用に提供されている「FUSE for macOS」

上記の仕組みは、macOSでも使用することができます。「osxfuse」という、OS X時代の名残を残した名称のソフトウェアですが、今でも「FUSE for macOS」として生き残り続けています。

前述のように「FUSE」は、橋渡しをするためだけの役割を担います。実際のマウント操作を行うためには別のプログラムの助けが必要です。今回のようにリモートのSSHサーバをローカルにマウントして、といった場合には「sshfs」が便利です。文字通り「SSHサーバに対して擬似的なファイルシステム(File System)を生成して、ローカルディレクトリのように扱うことのできるようにする仕組みです。

「FUSE for macOS」「sshfs」のインストール

これらは全てmacOSの代表的なパッケージマネージャであるHomebrewでインストールすることが可能です。Homebrewについては、macOSのパッケージ管理にはHomebrewを使おう!Homebrewを使用する理由や便利な使い方までご紹介でご紹介しています。

インストールするには、ターミナルから以下のコマンドを実行します。

brew cask install osxfuse
brew install sshfs

「FUSE for macOS」のインストールには管理者権限が必要となりますので、その権限を持つユーザで実行してください。「sshfs」は/usr/local/にアクセスできるユーザであれば誰でも構いません。(Homebrewの動作環境に準拠)

「sshfs」でリモートのSSHサーバをマウント、アンマウントする

では、実際に「sshfs」でマウントしてみます。まずは、マウントポイントとなるディレクトリを作成しておきましょう。ここではsshfsという仮のディレクトリを用意しましたが、実際に使用する場合は話わかりやすい名称が良いでしょう。

mkdir /mnt/sshfs

続いて、リモートのSSHサーバのディレクトリをマウントします。

sshfs -p <Port Number> <User Name>@<Host Name>:<Remote Directory> <Local Directory>

ここで、-pオプションはSSHサーバに対して接続する際のポート番号(省略した場合は「22」。例えば、XSERVERの場合は「10022」)を表します。相手先のSSHサーバによっては、デフォルトの22番ポートから変更されている場合もありますので注意してください。

<User Name>は、SSHサーバで接続する際のユーザ名を指定します。省略すると現在ログインしているユーザのユーザ名がそのまま使用されます。

<Host Name>は、接続先のSSHサーバのドメイン名、もしくはIPアドレスを指定します。必須であり省略することはできません。

<Remote Directory>は、SSHサーバのリモートディレクトリを指定します。省略すると、<User Name>で指定したユーザのホームディレクトリがマウントされます。特定のディレクトリ(例えば、uploadsディレクトリなど)をマウントしたい場合に指定します。注意したいのが、<Remote Directory>の前の:(コロン)は必須ということです。コロンを忘れてしまうと「missing host」というエラーが表示されます。

接続時にパスワードを聞かれます(公開鍵認証を指定している場合は不要)ので、入力してマウントします。マウントできたかどうか実際に下記のコマンドで確認します。

df -h /mnt/sshfs

ファイルシステムとして認識されていることがわかります。

Filesystem      Size   Used  Avail Capacity iused      ifree %iused  Mounted on
XXXXXXXXXXXXX  1.0Ti    0Bi  1.0Ti     0%       0 1000000000    0%   /mnt/sshfs

認識されれば、あとはローカルディレクトリにあるファイルと同様の操作を行うことができます。もちろんリモート接続しているサーバのディレクトリを、あたかもローカルディレクトリのように表示しているだけなので、多少レスポンスに時間がかかります。

また、Finderからも下記のように表示されます。

続いて、アンマウントする方法です。Finderから実施する場合には、ファイルシステムのアイコンを右クリックして「取り出す」、ターミナルから実行する場合は、以下のコマンドを実行します。

umount /mnt/sshfs

まとめ

今回は、「FUSE」と呼ばれるカーネルを操作できない一般ユーザが、独自の仮想ファイルシステムを生成できる方法をご紹介しました。今回ご紹介した「sshfs」以外にも、様々なファイルシステムが用意されていますので、興味のある方はHomebrewなどで探してみてください。(FTPの場合は、「curlftpfs」)

-Mac
-,

執筆者: