※当ブログではアフィリエイト広告を利用しています
数年前から仕事でMacを使うようになったのですが、とにかく困ったのが取引先へのファイル送付です。
Macで普通に作ったzipをWindowsへ送ると、全角文字のファイル名が文字化けしてしまいます。
Windows側で対応する方法はあるのですが、一般的な企業ではそのような対応は取られておらず、私の経験上100%文字化けしました。
一念発起していい方法がないか取り組んだ結果、いい感じにできたので紹介しようと思います。
目次
前提
- そもそもzip暗号化で送るのは〜とか、メールでパスワードを別送するのは〜という議論はここではしません。私の周りではまだまだ根強く存在する風習なのです。
- ある程度ターミナルが使える人を想定しています。
- macOS Mojave(10.14.5)、PHP 7.3.6で確認しています。
ユースケースのデザイン(という名の要件定義)
ユースケースとして、以下のようなことが簡単にできれば良いと考えました。
- Windows向けの暗号化zipファイルを生成する
- 生成されたzipファイルをメールに添付して取引先へ送付する
- パスワードを別メールで通知する
zipファイルをメールで送るのは、取引先にファイルを送付するときに限られます。
そして、その際には必ずパスワードをかけて暗号化します。
昔はWindowsのVMを立ち上げ、その中にインストールした7zipを使って暗号化するという非常に面倒な手法を取っていました。今考えると本当に謎です。
ということで、ざっくり要件として、
- コマンド一つでWindows向けのzipファイルを生成できる
- ついでに暗号化もできる
というのが最低限できれば良いかなーと考えました。その後、実際に取引先にメールするときのことを想定して、
- パスワードは毎回ランダムに16文字を生成する
- クリップボードにコピーしてそのままメールに貼り付けできる
こともできると便利だなーと思い、機能に盛り込むことにしました。
技術調査
色々と方法を調べていたところ、自分の要望に近い素晴らしいツールが公開されていました。
https://github.com/macyarounanoka/mac-zip-windows
Windowsでも文字化けしないzipを生成しないのはもちろん、Windowsでは不要な__MACOSXや.DS_storeファイルを削除してくれます。
さらに、Windowsでは使用できない文字を検出してくれたり、テキストファイルの場合は改行コードを変換してくれます。(これは好みが分かれるかもですが)
PHPで動作するものですが、macOSではPHPが標準で導入されているはずです。(私の環境はHomebrewで違うバージョン入れているので実際のところは分からず)
こちらをForkさせていただいて、暗号化機能を作り込むことにしました。
Fork後の変更点
Forkしたリポジトリはこちら。
https://github.com/k8sinfo/mac-zip-windows
zipファイル名から拡張子の削除
hogehoge.txt というファイルをzip化すると、hogehoge.txt.zip というファイルができてしまいます。
個人的には拡張子は不要だったため、hogehoge.zip となるように修正しました。
暗号化機能の追加
暗号化にはzipcloakというコマンドツールを使っています。
しかし、zipcloakには標準入力からパスワードを通す方法がなさそう(ソース書き換えて改造する必要あり)なので、expectコマンドを使ってターミナルへのパスワード入力を自動化しました。
また、パスワードはpbcopyでクリップボードへコピーされるようにしました。
あと、一応暗号化がいらない場合に備えて、-nオプションを追加しました。-nオプションを指定すると、暗号化処理が行われないようになります。
パスワードを指定できるようにすることも考えましたが、自分の使い方だと不要な機能と判断だし割り切りました。
導入方法
以下のPHPファイルを保存し、実行権限をchmodで付与し、PATHの通った場所に置くだけです。
https://raw.githubusercontent.com/k8sinfo/mac-zip-windows/master/windowszip
windowszipという名前にする必要はなく、wzなど省略しても良いかもしれません。
使い方
元々はwindowszipというコマンドですが、長いので私は省略して使っています。
$ wz hogehoge.txt
Password: @3zA+RTsVeRak%G2
コマンドが正常終了すると、暗号化されたzipファイルが同じディレクトリに生成されると共に、表示されたパスワードがクリップボードにコピーされます。
パスワードは英数字と記号から紛らわしいのとエスケープしづらいのを除いたものの中からランダムに16文字で生成されます。
コマンドが正常終了すると、暗号化されたzipファイルが同じディレクトリに生成されると共に、表示されたパスワードがクリップボードにコピーされます。
うっかりクリップボードを上書きしても大丈夫なように、ターミナルにパスワードが表示されるようにしています。
FAQ
自分の使い方と少し合わないので機能修正/追加したい
Forkして自分だけのツールを作ってみてください。
不具合見つけたんだけど
Issueあげてください。誰かが直してくれるかもしれません。
ちなみに私は正常系しかテストしてません。別に金もらってる訳でもないし良い子は真似しないようにしてください。
パスワードを平文でターミナルに表示するのはセキュリティー上どうなの?
基本的には取引先にzipを意味もなく暗号化して送るツールなのでまあいいかと思っています。
-q とかで表示しないモードを作るのも良さそうですね。誰かが実装してくれるかもしれません。
ターミナルは苦手なのでGUIで暗号化できるようにしたい
サービスを追加することでできるようになるかもしれませんが、Fork後のツールでは試していません。元となったツール作成者さんの記事を参考にしてみてください。
http://fanblogs.jp/macyarounanoka/archive/274/0
まとめ
今までできそうでできなかったことが実現できて個人的に満足してます。
誰かの参考になれば嬉しいです。