Linux
tar

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

More than 1 year has passed since last update.

例として、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 のアーカイブを例に試したけど、一度こういうのをメモっておくと後で確認しやすくて良い。