【Linux】uuencode/uudecodeでバイナリファイルをテキスト変換・復元する

目次

概要

バイナリファイル(画像、実行ファイル、圧縮アーカイブなど)を、メール本文やテキスト掲示板などに貼り付けられる「ASCIIテキスト形式」に変換(エンコード)し、それを元のバイナリに戻す(デコード)ためのコマンド群です。

現在では base64 コマンドが主流ですが、古くから存在する uuencode は、変換後のデータ内に「復元時のファイル名」や「パーミッション情報」を埋め込める点が特徴です。

※多くの環境では sharutils パッケージに含まれています。

仕様(引数・オプション)

構文

エンコード(テキスト化)

uuencode [オプション] [入力ファイル] 出力時のファイル名

※「入力ファイル」を省略すると標準入力から読み込みます。「出力時のファイル名」は必須です。

デコード(復元)

uudecode [オプション] [入力ファイル]

主な引数・オプション

コマンドオプション説明
uuencode-m従来のuuencode形式ではなく、Base64形式(MIME互換)でエンコードします。現代ではこちらが推奨されます。
uudecode-o <ファイル>埋め込まれたファイル名を無視し、指定したファイル名で出力します(output)。

基本の使い方

バイナリファイルをテキストデータに変換し、それを元に戻して同一性を確認する基本的な流れです。

コマンド

# 1. /bin/ls をBase64形式でエンコードし、ls-ascii というファイルに保存
# (復元時の名前を 'ls-restored' と指定)
uuencode -m /bin/ls ls-restored > ls-ascii

# 2. 生成されたテキストファイルの先頭を確認
head -n 3 ls-ascii

# 3. テキストファイルからバイナリを復元
uudecode ls-ascii

# 4. 元のファイルと復元されたファイルを比較(何も出なければ一致)
diff /bin/ls ls-restored

実行結果(headコマンド部分)

begin-base64 755 ls-restored
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAwARAAAAAAABAAAAAAAAAAOgPAAAA
AAAAAEAAOAACAEAAAgABAAEAAAA4AAEAAAA4AAEAAAAAAAAAAIAAAAAAAAAA

begin-base64 の行に、パーミッション(755)と復元後のファイル名(ls-restored)が含まれています。

実践コマンド

形式の違いを確認する(デフォルト vs Base64)

オプションなしのデフォルト形式(古い形式)と、-m を付けたBase64形式では、ヘッダーや使用される文字種が異なります。

# デフォルト形式(歴史的なuuencode形式)
uuencode test.bin test.bin > default.txt
head -n 1 default.txt
# 出力: begin 644 test.bin

# Base64形式(推奨)
uuencode -m test.bin test.bin > base64.txt
head -n 1 base64.txt
# 出力: begin-base64 644 test.bin

出力ファイル名を指定して復元する

通常 uudecode はエンコードデータ内に埋め込まれたファイル名で復元しようとしますが、-o オプションを使うことで、任意の名前で保存できます。

# archive.tar.gz.txt を復元し、restored_data.tar.gz という名前で保存
uudecode -o restored_data.tar.gz archive.tar.gz.txt

標準出力のスペシャルファイル名を活用する

エンコード時に「復元後のファイル名」として /dev/stdout を指定することで、デコード時にファイルを生成せず、そのまま標準出力へデータを流すことができます。これをパイプラインで活用します。

# エンコード: 復元名を /dev/stdout に指定して保存
uuencode archive.tar.gz /dev/stdout > archive.txt

# デコード: ファイルを作らず、展開処理へ直接パイプする
uudecode -o /dev/stdout archive.txt | tar xzv

標準入力からデコードする

ファイルからではなく、cat や他のコマンドの出力をパイプで受け取ってデコードします。

# ls-ascii の内容を標準入力から読み込んで復元
cat ls-ascii | uudecode -o ls-manual-restore

カスタムポイント

  • -m の常時利用: 特段の理由がない限り、互換性の高い -m (Base64) オプションを使用することを強く推奨します。
  • ファイル名指定: uuencode コマンドの最後の引数は「出力ファイル名」ではなく「復元されたときに使われるファイル名」です。実際に出力(保存)するにはリダイレクト > が必要である点に注意してください。

注意点

  1. ファイルサイズの増加:テキストエンコードを行うと、データサイズは元のバイナリに比べて約33%増加します。
  2. 暗号化ではない:あくまで「読める文字に変換しているだけ」であり、中身は丸見えです。パスワード保護や暗号化の機能はありません。
  3. コマンドの有無:最小構成のLinux環境ではインストールされていないことがあります(sharutils パッケージなどをインストールしてください)。

応用

ディレクトリをアーカイブしてそのままテキスト化する

tar コマンドで固めたデータを、パイプラインを通じて直接 uuencode に渡し、単一のテキストファイルとしてバックアップを作成します。

# logsディレクトリをtar.gz圧縮し、そのままテキスト化して backup_logs.txt に保存
tar czf - ./logs | uuencode -m logs_backup.tar.gz > backup_logs.txt

まとめ

uuencode/uudecodeは、バイナリデータを安全にテキストとして扱うための古典的かつ堅実なツールです。現代では base64 コマンドが使われることも多いですが、ファイル名やパーミッション情報をデータ自体に内包できる点において、uuencode は依然としてスクリプト処理や簡易バックアップの場面で独自の利便性を持っています。「データ本体」と「メタデータ(ファイル名・権限)」をセットでテキスト化したい場面で活用してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次