2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linuxからスマホへ:ネットワークを介さない「物理層」コピペ

2
Last updated at Posted at 2026-01-12

1. 背景:スマホ入力のストレスとネットワークの制約

PCで作成したテキストをスマホに送りたい場面は多いものです。しかし、セキュリティポリシーによりPCとスマホを同一セグメントのネットワークに接続できない環境(KDE Connect等が使えない状況)では、テキスト転送は意外と面倒なものです。

本稿では、QRコードを媒介にした「エアギャップ(物理隔離)」越えの転送手法を紹介します。スマホのソフトウェアキーボードによる入力ストレスから解放される、きわめてプリミティブで堅牢な解決策です。

2. 実装のロジック

仕組みは単純です。

  1. PC側で任意のテキストをQRコード(PNG画像)に変換して表示。
  2. スマホのカメラ(Googleレンズ等)で読み取り、クリップボードにコピー。

依存ツールのインストール

以下のパッケージが必要です。

  • qrencode: テキストのQRコード変換
  • xclip: クリップボード操作
  • xdg-utils: 画像ビューアの呼び出し

3. シェルスクリプト:qr-send.sh

入力ソースを「標準入力」「引数」「クリップボード」から柔軟に受け取れるようにしました。

#!/bin/bash

# 依存コマンドチェック
if ! command -v qrencode &> /dev/null; then
    echo "Error: qrencode がありません。"
    exit 1
fi
if ! command -v xclip &> /dev/null; then
    echo "Error: xclip がありません。"
    exit 1
fi

# 一時ファイル作成
TEMP_IMG=$(mktemp /tmp/qrcode.XXXXXX.png)

# --- 入力ソースの取得ロジック ---
if [ -p /dev/stdin ]; then
    # パイプ入力がある場合
    INPUT=$(cat)
elif [ -n "$1" ]; then
    # 引数がある場合
    INPUT="$1"
else
    # 何もない場合はクリップボードから
    echo "クリップボードから取得中..."
    INPUT=$(xclip -o -selection clipboard)
fi

# 入力が空なら対話入力を促す
if [ -z "$INPUT" ]; then
    echo "テキストを入力してください(入力完了は Ctrl+D):"
    INPUT=$(cat)
fi

# --- QRコード生成 ---
# -s 10: ドットサイズ
qrencode -s 10 -o "$TEMP_IMG" "$INPUT"

# --- 表示 ---
if [ -f "$TEMP_IMG" ]; then
    echo "QRコードを表示します: $TEMP_IMG"
    nohup xdg-open "$TEMP_IMG" >/dev/null 2>&1 &
else
    echo "生成に失敗しました。"
    exit 1
fi

使い方

  • クリップボードを転送: qr-send.sh
  • 特定の文字列を転送: qr-send.sh "Hello World"
  • コマンド出力を転送: cat memo.txt | qr-send.sh

4. Emacsからの連携:my-region-to-qrcode

エディタから離れることなく、選択範囲(Region)を即座にスマホへ送出します。

;; == QR Code Generation ==
(defun my-region-to-qrcode (start end)
    (interactive "r")
  (let ((text-file (make-temp-file "qr-text" nil ".txt"))
        (img-file (make-temp-file "qr-image" nil ".png"))
        (exit-code 0))

    ;; 1. テキスト書き出し
    (write-region start end text-file)

    ;; 2. qrencode 実行
    (setq exit-code
          (call-process "qrencode" nil nil nil "-s" "10" "-r" text-file "-o" img-file))

    (if (and (= exit-code 0) (file-exists-p img-file))
        (progn
          (message "QRコードを表示: %s" img-file)
            (call-process-shell-command
           (format "nohup xdg-open %s >/dev/null 2>&1 &" img-file)
           nil 0))
      (message "QRコード生成失敗 (Exit code: %d)" exit-code))))

5. 運用上の留意点

  • データ量: QRコードの特性上、実用的な転送量は数百文字〜1,000文字程度です(このスクリプトを書いた動機も、SNSへの投稿メッセージをPCで入力することでした)。
  • セキュリティ: 生成された画像は /tmp に保存されます。共有PCを利用している場合は、画像ビューアを閉じた後に手動で削除するか、at コマンド等で時間差削除する設定を検討してください。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?