こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。
業務では Windows ⇔ Linux 間でデータのやりとりをすることが良くあります。でも、Windows で圧縮されたファイルを Linux 上で解凍、またはその逆の場合も、文字化けを起こしてしまって困った経験をされた方も多いのではないでしょうか?
そんなときの解決方法をご紹介します。
Windows → Linux 文字化け回避する方法
Windows (Shift_JIS) でファイル名に日本語が含まれる zip ファイルを作成し、 Linux (UTF-8) において unzip コマンドで解凍する場合、下記のように「-O」 オプションを使用することで、文字コードを変換して解凍することができます。
# ls -il 16971791 -rw-r--r--. 1 root root 338 4月 27 16:06 ???{???t?@?C??.zip # unzip -O sjis ???{???t?@?C??.zip Archive: 凞 褪@C .zip creating: 日本語ファイル/ extracting: 日本語ファイル/文字化け.txt
「-O」オプションは、 RHEL 同梱版の unzip では unzip-6.0-3.el6 (RHEL6)、unzip-6.0-16.el7 (RHEL7) 以降でサポートされます。
Linux → Windows 文字化け回避する方法
RHEL 同梱版の zip なら、unzip と同様に便利なオプションが用意されていると思いましたが、残念ながら、zip コマンドは圧縮した時点でファイル名の文字コードを変換する方法はありません。
そのため、Linux で zip コマンドでファイル名に日本語が含まれる zip ファイルを作成し、Windows で解凍する場合では、下記のように、任意のディレクトリにて、まず convmv コマンド (# yum install convmv で導入) を使用して圧縮したいファイルの文字コードを変換してから、zip コマンドでディレクトリ名を指定して圧縮することで、文字化けを起こさずに解凍することができます。
# mkdir /tmp/hoge # cd /tmp/hoge/ # convmv -r -f utf8 -t sjis hoge --notest Ready! # zip -r /tmp/hoge.zip . adding: hoge (stored 0%)
p7zip パッケージをインストールしてみる
zip で用いられる暗号アルゴリズムは、zipcrypto と呼ばれるものです。zipcrypto は強度的に問題があり、パスワードは英数小文字のみ、8桁の構成は 1秒以下で解析できたり、従来言われてきたパスワードは 4種類 93字の組み合わせ、8桁の構成でも 2週間ですべての組み合わせが解析できてしまいます。
RHEL 同梱版の zip、unzip コマンドでは使用される暗号化アルゴリズムは zipcrypto のみで、AES256 等の他の強力な暗号アルゴリズムをサポートしていないため使用できません。より強度の強い AES256 暗号化形式でパスワード付 zipファイルを作成するには p7zip パッケージが必要です。しかしながら、p7zip パッケージは RHEL では提供、およびサポートされておらず、EPEL リポジトリをインストールしてから p7zip パッケージをインストールする必要があります。
# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm を取得中 警告: /var/tmp/rpm-tmp.Uzrx9V: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY 準備しています... ################################# [100%] 更新中 / インストール中... 1:epel-release-7-11 ################################# [100%] # yum -y install p7zip 読み込んだプラグイン:langpacks, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ p7zip.x86_64 0:16.02-10.el7 を インストール --> 依存性解決を終了しました。 依存性を解決しました (省略) インストール: p7zip.x86_64 0:16.02-10.el7 完了しました!
7za コマンドを使ってみる
AES256 暗号化形式でパスワード付 zip ファイル、以下のように「-mem=AES256」を指定して実行します。
「-m」オプションは圧縮方法を設定するもので、空白を入れずに、「em」を「AES256」に指定するという意味になります。「-m」オプションについて、ココを確認してください。
# 7za a -tzip -pMYPASSWORD -mem=AES256 hoge.zip 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI) Open archiv: hoge.zip -- Path = hoge.zip Type = zip Physical Size = 10702 Scanning the drive: 13 folders, 20 files, 25069 bytes (25 KiB) Updating archive: hoge.zip Items to compress: 33 Files read from disk: 20 Archive size: 17831 bytes (18 KiB) Everything is Ok
また、以下のようにパスワードなしで -p パラメータを指定することで、パスワードを入力するよう求められます。こちらの方法は、スクリーン上にパスワードを表示しないため、より安全であると考えられます。
# 7za a -tzip -p -mem=AES256 hoge.zip 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI) Open archive: hoge.zip -- Path = hoge.zip Type = zip Physical Size = 298 Scanning the drive: 13 folders, 19 files, 14621 bytes (15 KiB) Updating archive: hoge.zip Items to compress: 32 Enter password (will not be echoed): Verify password (will not be echoed) : Files read from disk: 19 Archive size: 10702 bytes (11 KiB) Everything is Ok
解凍するには、「x」オプション指定して実行する場合、圧縮時のディレクトリ構成をそのまま解凍します。「e」オプションを指定する場合、圧縮時のディレクトリ構成を無視して解凍します。
# 7za x hoge.zip 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (206D7),ASM,AES-NI) Scanning the drive for archives: 1 file, 17253 bytes (17 KiB) Extracting archive: hoge.zip -- Path = hoge.zip Type = zip Physical Size = 17253 (省略) ERROR: Wrong password : 文字化け.txt Sub items Errors: 19 Archives with Errors: 1 Sub items Errors: 19
以上で zip、unzip コマンドを用いて zip ファイルの文字化けの解決方法や、7za コマンドを用いてより安全な暗号化形式の zip ファイルの作成 (圧縮・解凍する) 方法を説明しました。