CUBE SUGAR CONTAINER

技術系のこと書きます。

SSHFS を使ってリモートホストのディレクトリをマウントする

SSH でログインできるリモートホストとのファイルのやり取りは SCP を使うことが多い。 ただ、頻繁にやり取りするときは、それも面倒に感じることがある。 ただ、あんまり手間のかかる設定作業はしたくない。 そんなときは SSHFS を使うと手軽に楽ができそう。

使った環境は次の通り。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
$ uname -r
4.15.0-20-generic

下準備

まず、ファイルを頻繁にやり取りする先として 192.168.33.10 という IP アドレスのホストがいたとする。

$ ping -c 3 192.168.33.10
PING 192.168.33.10 (192.168.33.10) 56(84) bytes of data.
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.761 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.473 ms
64 bytes from 192.168.33.10: icmp_seq=3 ttl=64 time=0.646 ms

--- 192.168.33.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2029ms
rtt min/avg/max/mdev = 0.473/0.626/0.761/0.121 ms

このホストには、あらかじめ SSH の公開鍵をインストールしておく。

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Yby6vBiMZBv1q76ncrJYOQAMiVbHOaTEFmcGX09pTXQ vagrant@vagrant
The key's randomart image is:
+---[RSA 2048]----+
|o.o==*.. .=o E   |
|=..oB+..oo ..    |
|o...... =.       |
|.  . . . o       |
|. +   . S        |
| + *   o         |
|  * o o          |
| oo..=..         |
|. .**++.         |
+----[SHA256]-----+
$ ssh-copy-id -i ~/.ssh/id_rsa.pub vagrant@192.168.33.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vagrant/.ssh/id_rsa.pub"
The authenticity of host '192.168.33.10 (192.168.33.10)' can't be established.
ECDSA key fingerprint is SHA256:8qF9F+rTQA5Mqn+DhSCuAdo6jvL6RrXNBDQAEeuSkRk.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vagrant@192.168.33.10's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'vagrant@192.168.33.10'"
and check to make sure that only the key(s) you wanted were added.

これで、パスワードを入力しなくてもホストに SSH でログインできるようになった。

$ ssh vagrant@192.168.33.10 "echo Hello, World!"
Hello, World!

続いてローカルのマシンには SSHFS をインストールしておく。

$ sudo apt-get -y install sshfs

これで下準備が整った。

SCP を使ってファイルをやり取りする場合

まず、前提として SCP を使ってファイルをやり取りする場合に必要となる作業を確認しておこう。 scp コマンドを使って、転送元と転送先を指定する。

$ echo "Hello, SCP!" > greet.txt
$ scp greet.txt vagrant@192.168.33.10:~/
greet.txt                                                                                                 100%   12     9.7KB/s   00:00    

SSH で確認すると、ちゃんとファイルが転送できている。

$ ssh vagrant@192.168.33.10 "cat greet.txt"
Hello, SCP!

ただ、何度もこれをやるのは結構しんどい。

基本的な使い方

続いては SSHFS を使ってみよう。

まずはマウントポイントになるディレクトリを用意する。

$ mkdir sshfsmnt

続いて sshfs コマンドを使って、マウントしたいリモートホストのディレクトリと、ローカルホストのマウント先のディレクトリを指定する。

$ sshfs vagrant@192.168.33.10:/home/vagrant/ sshfsmnt

これで df コマンドの結果に SSHFS でマウントした内容が表示されるようになる。

$ df
Filesystem                           1K-blocks     Used Available Use% Mounted on
udev                                    484508        0    484508   0% /dev
tmpfs                                   100916     5440     95476   6% /run
/dev/mapper/vagrant--vg-root          64800356  1849852  59629060   4% /
tmpfs                                   504560        0    504560   0% /dev/shm
tmpfs                                     5120        0      5120   0% /run/lock
tmpfs                                   504560        0    504560   0% /sys/fs/cgroup
vagrant                              244810132 88761060 156049072  37% /vagrant
tmpfs                                   100912        0    100912   0% /run/user/1000
vagrant@192.168.33.10:/home/vagrant/  64800356  1793032  59685880   3% /home/vagrant/sshfsmnt

マウントしたディレクトリの中身を確認すると、先ほど scp コマンドで転送したファイルもちゃんと見えている。

$ ls sshfsmnt/
greet.txt
$ cat sshfsmnt/greet.txt 
Hello, SCP!

試しに、このファイルを書き換えてみよう。

$ echo "Hello, SSHFS!" > sshfsmnt/greet.txt 

改めて ssh コマンドを使ってリモートホスト上でファイルの内容を確認する。

$ ssh vagrant@192.168.33.10 "cat greet.txt"
Hello, SSHFS!

ちゃんとリモートホスト上のファイルが書き換わっていることが分かる。

いじょう。