管理者権限不要でリモートの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」という、macOS 時代の名残を残した名称のソフトウェアですが、今でも「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」)

comments powered by Disqus