先日はファイル同期にResilio Syncを紹介しましたが、TailscaleでVPNを構築している環境なら、ちょっとファイル送信するだけなら、もっと手軽に行うことが出来ます。Tailscaleに備わっている「Taildrop」という機能です。
Windowsならファイルの右クリックメニューから、iPhoneやMacから送信するには共有機能を利用してファイルをTailscaleに渡せば、ネットワークに参加している一覧が表示されるので、送信先を選ぶだけです。あっという間に送信されます。Airdropのような感じですね。
Taildropで受信したファイルの保存場所
Taildropで受信したファイルは、WindowsやMacならダウンロードフォルダに、Ubuntuの場合は次の場所に保存されます。
/var/lib/tailscale/files/

受信したファイルを特定のフォルダに移動させるにはコマンドを実行します。
ここではホームディレクトリにTaildropディレクトリを作成し、そこに移動させます。
保存ディレクトリ作成
mkdir -p ~/Taildrop
通常、Tailscaleコマンドは管理者権限が必要になるのですが、rootで実行すると届いたファイルが「root所有」になり、後で自分で編集・移動する際に「バツマーク(権限なし)」がつく原因になります。なので、自分をオペレーターに追加しておきましょう。これは再起動後も有効です。
オペレーターに自分を追加
sudo tailscale set --operator=$USER
届いたファイルを取得する
移動させるコマンドは下記です(上記を実施していない場合はsudoが必要)。
tailscale file get ~/Taildrop
もしroot権限でコピーした場合で所有権を自分にしたいなら、下記コマンドも実行しましょう。
sudo chown $USER:$USER ~/Taildrop -R
自動で保存するように設定する
毎回、上記のコマンドを実施するのが面倒な場合は、ファイルを自動的にホームディレクトリに保存するコマンドを実施します(最終的には、その先のシステム起動時に自動実行で可能なので、ここはスクリプトファイルに保存せず動作を確認する程度でOK)。
TARGET_DIR="$HOME/Taildrop"
# ディレクトリが存在しない場合は作成
mkdir -p "$TARGET_DIR"
# 受信待ちループを開始
# --loop: 常駐して監視
# --conflict=rename: 同名ファイルがある場合にリネームして保存
tailscale file get --loop --conflict=rename "$TARGET_DIR"
問題ないなら、これをスクリプトファイルとして保存して、実行します。
# スクリプトファイルを作成(上記を貼り付け)
nano ~/taildrop-auto.sh
# 実行権限を付与
chmod +x ~/taildrop-auto.sh
システム起動時に自動実行
パソコンを起動するたびに手動で実行するのは手間なため、systemdを使ってバックグラウンドで常駐させます。実際に運用するならこれを実施しておくのがおすすめ。
1. 保存用ディレクトリの作成
まず、ファイルを保存する場所を作成します。
mkdir -p ~/Taildrop
2. ユニットファイルの作成
ユーザー権限用の設定ディレクトリにファイルを作成します。
mkdir -p ~/.config/systemd/user/
nano ~/.config/systemd/user/taildrop.service
以下の内容を貼り付けて保存(Ctrl+O, Enter)し、終了(Ctrl+X)してください。--conflict=rename を入れているので、同名ファイルは自動でリネームされます。
[Unit]
Description=Taildrop Automatic Receiver
After=network-online.target
[Service]
ExecStart=/usr/bin/tailscale file get --loop --conflict=rename %h/Taildrop
Restart=always
[Install]
WantedBy=default.target
3. サービスの有効化と起動
自分のユーザー権限で実行するようにします。
# 設定を読み込み
systemctl --user daemon-reload
# サービスの有効化(次回ログイン時から自動起動)と今すぐ起動
systemctl --user enable --now taildrop.service
4. ログインしなくても動くようにする
通常、ユーザーサービスは「あなたがログインしている間」しか動きません。PCがついていれば常に受信できるようにするには、以下のコマンドを一度だけ実行します。
sudo loginctl enable-linger $USER
動作確認
正しく動いているかは以下のコマンドでチェックできます。
systemctl --user status taildrop.service
緑色の active (running) が出ていれば成功です。
ちなみに、Tailscaleには、そのほかにもTaildrive機能や、HTTPS化するTailscale Serve機能など便利な機能がありますが、これらもそのうち気が向いたら。
UbuntuからTaildropでファイル送信
Ubuntuで受信はこれで自動化出来ますが、Ubuntuからの送信は多少面倒です。
まずは送信先を確認します。
tailscale status
そして、以下の形式でファイルを送信します。最後のコロン「:」を忘れないように!
tailscale file cp [送信したいファイル名] [相手のデバイス名]:
WindowsやMac、iPhoneやAndroidからの送信は手軽なので、あとはUbuntuからの送信が手軽に出来るようになれば。
受信ファイルをホームフォルダ&自動実行を1コピペで
mkdir -p ~/TaildropCopy ~/.config/systemd/user/ && \
cat > ~/.config/systemd/user/taildrop.service << 'EOF'
[Unit]
Description=Taildrop Automatic Receiver
After=network-online.target
[Service]
ExecStart=/usr/bin/tailscale file get --loop --conflict=rename %h/TaildropCopy
Restart=always
[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload && \
systemctl --user enable --now taildrop.service && \
sudo loginctl enable-linger $USER && \
systemctl --user status taildrop.service
# 「Active: active (running)」 が出ていれば成功です
実行内容(順番に)
- TaildropCopy ディレクトリと systemd 設定ディレクトリを作成
- サービスファイルをヒアドキュメントで一括書き込み
- systemd の設定を再読み込み
- サービスを有効化+即時起動
- linger を有効化(ログアウト中も動作)
- ステータス確認(active (running) が出れば成功)


