43
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

tarで特定ファイルだけ取り出したり余分なディレクトリを作らないようにしたりなどのオプションメモ

Last updated at Posted at 2014-07-09

例として、pecoのバイナリアーカイブを取ってきて余分なファイルを作らずに/usr/local/bin/pecoに実行ファイルを置いてみよう。

例)pecoのアーカイブから実行ファイルだけ取り出してみる

pecoのバイナリアーカイブの構成を確認

ちなみにpecoのアーカイブを普通に解凍すると以下の様なディレクトリとファイル構成になっている。

$ tar xf peco_linux_amd64.tar.gz
$ find
./peco_linux_amd64
./peco_linux_amd64/peco
./peco_linux_amd64/Changes

pecoだけを目的の場所に取り出す方法

先ほど確認したアーカイブの内、peco_linux_amd64/peco だけを取り出して /usr/local/bin に置きたいわけだ。man tar とか確認しながら出来のが↓これ。

[[ ${OSTYPE} =~ ^linux ]] &&
curl -sL "https://github.com/peco/peco/releases/download/latest/peco_linux_amd64.tar.gz" |
sudo tar xz \
  -C /usr/local/bin/ \
  --strip=1 \
  '*/peco' \
  --no-same-owner \
  --no-same-permissions

オプション解説

1個ずつ解説しよう。

  • curl−s …これはダウンロードの進捗状況とかが表示されるのを抑制する。
  • curl-L …これはリダイレクトに対応するオプションだ。コレがないとリダイレクトが発生した場合に追っかけてダウンロードしてくれないのでよく使う。
  • sudo …/usr/local/binは一般ユーザで書き込みできないので。
  • tar xz …これは説明不要かな。xは展開、zはgz圧縮を解凍する。パイプで繋いでるからcurlでDLしてきたのの解凍だ。
  • tar-C …これは解凍先のディレクトリを変更する。これだけつけると/usr/local/bin/peco_linux_amd64/pecoとかが出来ちゃう。
  • tar--strip=1 …これはtarアーカイブ内のディレクトリを1階層分無視する。つまりpeco_linux_amd64/が無くなって、その結果-Cと合わせて/usr/local/bin/pecoとかが出来る事になる。ただしここまでだと/usr/local/bin/Changesとかも出来ちゃうので困る。
  • '*/peco' …特にオプションとか無くアーカイブ内のファイル名を列挙すれば特定ファイルだけ取り出せる。peco_linux_amd64/pecoとかって書いても良いけど、バイナリタイプとかバージョンがついててディレクトリ名が固定じゃないことが多いのでワイルドカードを使って指定している。ここまでで無事/usr/local/bin/pecoのみを作成すること出来た。
  • tar--no-same-owner …これはセキュリティに関するオプションと思って良いかな。rootで解凍するとuid情報とかもそのまま引き継いでしまうため他の環境で作ったアーカイブを解凍すると変なオーナーのファイルが出来てしまうので、それを避けるためにつける。
  • tar--no-same-permissions …セキュリティ的にはこっちのが最重要かな。tarはパーミッション情報がついてればそのまま解凍してくれる。メジャーなアーカイブなら普通は問題無いとは思うけど、悪意のあるアーカイブを解凍した場合にSUIDビットが立ったファイルが仕込まれてる可能性もゼロではない。SUIDビットが立ったファイルってのは例えば chmod 4755 とかで作れる。このビットが立った実行ファイルは一般ユーザが使う場合でもファイルオーナーの権限(大抵はroot)で動作してしまうので大変危険だ。そういった余計なパーミッションを引き継がないのがこのオプションの目的。

めでたし

こうして思慮深くオプションを選んで実行することで以下の様な実行ファイルを得ることが出来るわけだ。

$ ls -l /usr/local/bin/peco
-rwxr-xr-x 1 root root 4343112  7月  7 12:10 /usr/local/bin/peco

今回は備忘録として peco のアーカイブを例に試したけど、一度こういうのをメモっておくと後で確認しやすくて良い。

43
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?