zipコマンドでパスワード付き圧縮ファイルを生成する

2023-03-27Bash,Linux,Ubuntu

はじめに

最近はめっきり使わなくなった zip ファイル形式。

圧縮率は gzipbz7zZsrtandard という圧縮アルゴリズムも登場していますが、未だに zip でファイルを公開してるサービスもあります。

そんな zip 形式の圧縮ファイルを生成するためのコマンド zip を使って「パスワード付き zip ファイル」を生成する方法について紹介します。

※「パスワード付き zip ファイル」というネタを扱うと、炎上しそうでドキドキします※

検証環境

今回の検証環境は Ubuntu 22.10 を利用しますが、他の Linux ディストリビューションであれば大きな違いはないと思っています。

$ uname -moi
aarch64 aarch64 GNU/Linux

$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu Kinetic Kudu (development branch)"
NAME="Ubuntu"
VERSION_ID="22.10"

$ bash -version | head -n 1
GNU bash, バージョン 5.2.0(1)-release (aarch64-unknown-linux-gnu)

$ zip --version | head -n 2
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.

zip コマンドのインストール

もし zip コマンドがインストールされていない場合には、 apt コマンドでインストールしましょう。

インストール済みの場合には読み飛ばしていただいて構いません。

$ apt install -y zip
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  zip
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
173 kB のアーカイブを取得する必要があります。
この操作後に追加で 523 kB のディスク容量が消費されます。
取得:1 http://ports.ubuntu.com/ubuntu-ports kinetic/main arm64 zip arm64 3.0-12build2 [173 kB]
173 kB を 2秒 で取得しました (107 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
以前に未選択のパッケージ zip を選択しています。
(データベースを読み込んでいます ... 現在 30707 個のファイルとディレクトリがインストールされています。)
.../zip_3.0-12build2_arm64.deb を展開する準備をしています ...
zip (3.0-12build2) を展開しています...
zip (3.0-12build2) を設定しています ...
man-db (2.10.2-2) のトリガを処理しています ...

zip コマンドでファイルを圧縮(パスワードなし)

圧縮

zip コマンドでパスワードなしのファイルを生成します。

ここでは workdir/1.txtworkdir/2.txt という 2 つのファイルを用意し、圧縮します。

# ディレクトリ作成
$ mkdir workdir

# ファイル作成
$ echo hello > workdir/1.txt
$ echo world > workdir/2.txt

# 圧縮ファイル 「workdir.zip」 を作成
$ zip -r workdir.zip workdir
  adding: workdir/1.txt (stored 0%)
  adding: workdir/2.txt (stored 0%)

$ ls
workdir  workdir.zip

圧縮ファイル workdir.zip ができました。

展開

先ほど作成した zip ファイルを unzip コマンドで展開します。

作業用ディレクトリ unzip/ を作成し、この中で展開して挙動を確認します。

# ディレクトリを生成
$ mkdir unzip/

# zip ファイルを移動
$ mv workdir.zip unzip/

# ディレクトリを移動
$ cd unzip/

# zip ファイルを展開
$ unzip workdir.zip
Archive:  workdir.zip
 extracting: workdir/1.txt
 extracting: workdir/2.txt

# 展開されたファイルを確認
$ ls
workdir.zip  workdir

$ cat workdir/1.txt
hello

$ cat workdir/2.txt
world

zip コマンドでファイルを圧縮(パスワードあり)

圧縮

今度は zip コマンドでパスワード付きファイルを生成します。

先程同様 workdir/1.txtworkdir/2.txt という 2 つのファイルを用意し、圧縮します。
workdir/1.txtworkdir/2.txt はすでに作成済みですので、先程のファイルを流用します。

パスワードを付与するにはzip コマンド実行時に --encrypt オプションを指定します。
パスワードの指定方法は 2 つあります。

1 つ目はユーザのインタラクティブな入力で指定します。

$ ls workdir
1.txt  2.txt

# パスワードの入力を 2回 促されます
$ zip --encrypt -r workdir-with-pass.zip workdir
updating: workdir/ (stored 0%)
updating: workdir/2.txt (stored 0%)
updating: workdir/1.txt (stored 0%)

2 つ目はオプション --password YOUR_PASSWORD の形式で指定します。
ただし、こちらの方法では Bash や Zsh の操作がコマンド履歴に情報が残ってしまいます
環境変数として指定する、履歴を残さないようにする、シェルに隠蔽するなど何らかの方法でパスワードが履歴に残らないように気をつけましょう

$ zip --encrypt --password hogehoge -r workdir-with-pass.zip workdir
updating: workdir/ (stored 0%)
updating: workdir/2.txt (stored 0%)
updating: workdir/1.txt (stored 0%)

展開

展開方法はパスワードなしのケース同様、 unzip コマンドを利用します。

作業用ディレクトリ unzip/ を作成し、この中で展開して挙動を確認します。
先ほどとの違いは、 unzip コマンド実行時にパスワードの入力を求められる点です。正しいパスワードを入力しましょう。

# ディレクトリを生成
$ mkdir unzip/

# zip ファイルを移動
$ mv workdir-with-pass.zip unzip/

# ディレクトリを移動
$ cd unzip/

$ unzip workdir-with-pass.zip
Archive:  workdir-with-pass.zip
   creating: workdir/
[workdir-with-pass.zip] workdir/2.txt password:
 extracting: workdir/2.txt
 extracting: workdir/1.txt

# 展開されたファイルを確認
$ ls
workdir.zip  workdir

$ cat workdir/1.txt
hello

$ cat workdir/2.txt
world

ひとこと

再三ですが、 今どき 「パスワード付き zip ファイル」のネタを扱うのはドキドキしますが、こういう方法もあるよということで読み物として楽しんでください。

2023-03-27Bash,Linux,Ubuntu