zipコマンドでパスワード付き圧縮ファイルを生成する
はじめに
最近はめっきり使わなくなった zip ファイル形式。
圧縮率は gzip 、 bz 、 7z や Zsrtandard という圧縮アルゴリズムも登場していますが、未だに 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.txt
、 workdir/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.txt
、 workdir/2.txt
という 2 つのファイルを用意し、圧縮します。workdir/1.txt
、 workdir/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 ファイル」のネタを扱うのはドキドキしますが、こういう方法もあるよということで読み物として楽しんでください。
ディスカッション
コメント一覧
まだ、コメントがありません