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
してるのなんで?と聞かれたのでその理由。