Posted at

複数のファイルを終端に改行がなければ改行を追加して結合する

SSH の authorized_keys や SSL 証明書でサーバ証明書と中間証明書を結合するとき、単に複数のファイルを結合するなら cat すればいいだけですが、ファイルの終端が改行で終わっていない場合、改行なしでファイルが連結されてしまうことがあります。

例えば server.pem と chain.pem があったとして server.pem の終端が改行で終わっていないと cat server.pem chain.pem

-----BEGIN CERTIFICATE-----

MII...
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

などとなってしまいます。

cat ではなく awk 1 で連結すれば OK です。

awk 1 server.pem chain.pem

-----BEGIN CERTIFICATE-----

MII...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MII...
-----END CERTIFICATE-----

パイプするときも awk 1 を通せば終端が改行でなければ改行が追加されます。

curl -s http://gitlab.example.com/oreore.keys | awk 1

gitlab から公開鍵を取り出すと改行が無いので割と罠です。


1 は、パターンが 1 という式で、アクションは省略、という意味です。

パターンに式を記述した場合、0 ではない数字、または、空ではない文字列、のときにマッチと評価されるので、1 なら常にマッチします。

アクションが省略された場合は {print} となります。つまり、全行で print が行われます。

awk は最終行は改行が無くても行と認識します、そして print は行を改行付きで表示します。


いつも authorized_keys で awk 1 してるのなんで?と聞かれたのでその理由。