Help us understand the problem. What is going on with this article?

zip コマンドの -P と -e オプションを同時に指定した時の挙動がバージョンによって異なる

発生した事象

とある、ちょっと古めのOSバージョン使ってるサーバから、
新しいサーバにアプリケーションを移管した際に遭遇した事象。

そのプログラムでは、OS側のzipコマンドを呼び出して、
パスワード付きzipファイルを生成する処理をしていたのだが
古いサーバでは正常に動作するのに、
新しいサーバではzipファイルが生成されない現象が発生していた。

そのソースコードでは、以下のようなコマンドをOSに投げていた。

zip -j -P "password" -e "awesome.zip" "awesome.csv"

アプリケーションからの動作テストではどうにも原因がわからなかったので
サーバに入って該当コマンドを直接叩いてみた。

移行前のサーバ

old$ zip -j -P "password" -e "awesome.zip" "awesome.csv" 

  adding: awesome.csv (stored 0%)

移行後のサーバ

new$ zip -j -P "password" -e "awesome.zip" "awesome.csv" 
Enter password: 
Verify password: 
  adding: awesome.csv (stored 0%)

移行後のサーバでは、-Pオプションを指定しているにもかかわらず
プロンプトでパスワード入力を求められた。

zipコマンドのオプションについて調査

プログラム中では、zipの実行オプションで、e と P を渡しているが、これらの意味は以下の通り:

   -e     Encrypt the contents of the zip archive using a password which is entered on the terminal in response to a prompt (this
      will not be echoed; if standard error is not a tty, zip will exit with an error).  The password prompt is  repeated  to
      save the user from typing errors.

   -P password
      use  password  to  encrypt zipfile entries (if any).  THIS IS INSECURE!  Many multi-user operating systems provide ways
      for any user to see the current command line of any other user; even on stand-alone systems there is always the  threat
      of  over-the-shoulder peeking.  Storing the plaintext password as part of a command line in an automated script is even
      worse.  Whenever possible, use the non-echoing, interactive prompt to enter passwords.  (And where  security  is    truly
      important,  use  strong  encryption  such  as Pretty Good Privacy instead of the relatively weak encryption provided by
      standard zipfile utilities.)

-Pは オプション引数からパスワードを渡すもの。
一方 -e は、対話式にパスワードを与えるもの。
なので、当該のコマンドでは、共存できないオプション指定がバッティングしていたことがわかった。

で、この2つのオプションを同時に指定した場合に、どちらが優先されるかが
zipのバージョンによって異なっているのでは、と推測。

移管前、移管後それぞれのzipのバージョンは以下であった。

old$ zip -?
Copyright (C) 1990-2005 Info-ZIP
Type 'zip "-L"' for software license.
Zip 2.31 (March 8th 2005). Usage:
new$ zip -?
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:

やはりバージョンが違った。

解決策

-e オプションを削除してコマンドを実行。
移管前、移管後どちらのサーバでもパスワードを聞かれることなく、パスワード付きZipファイルを生成できた。

old$ zip -j -P "password" "awesome.zip" "awesome.csv" 
  adding: awesome.csv (stored 0%)
new$ zip -j -P "password" "awesome.zip" "awesome.csv" 
  adding: awesome.csv (stored 0%)

それにしても、もとのアプリケーション実装者は、どのような意図で -e、-Pの両オプションを指定したのだろうか…
今となっては実装者がいないため、真相はわからなかった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away