ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

nc でデータを送りたいとき

まず、受け側は ipfw のポートを開けます。

$ sudo ipfw add 10060 pass tcp from any to xxx.xxx.xxx.xxx 8080 setup keep-state

で、 nc で LISTEN しますが、引数がポイント。

$ nc -l -N -d 8080

送る側からも nc で送ります。

$ echo "ABC" | nc xxx.xxx.xxx.xxx 8080

ポイントになるのは受け側の nc の引数で、 受けるのみなら -d で stdin を捨てて、 -N で終了後にソケットを shutdown をします。

これがないと、データを送り終わっても TCP コネクションを終了できずに、 nc もずっと走り続けます。

なんで……

nc で IPv6 で Listen する

メモ書き。

nc で Listen したいとき。

$ nc -l 8080

だと IPv4 でしか Listen してくれません。

実際、

$ netstat -an | grep 8080
tcp4       0      0 *.8080                *.*                    LISTEN

という感じで tcp4 で Listen してます。

IPv6 でやりたいときは

$ nc -6 -l 8080
$ netstat -an | grep 8080
tcp6       0      0 *.8080                *.*                    LISTEN

こんな感じ。

今回はただのメモ。

ファイルの重複行検知

UNIX シェルでテキストファイルをばばーっと処理してる時に、
データ数となりがちな行数を数えるコマンドは良く知られてると思います。

$ wc -l file.txt

さて、これで表示されるのはあくまで行数なので、
データ数がこれより多いことはあり得ませんが、少ない可能性はあります。
そう、データが重複しているケースです。

そこで必要になるのが重複行のチェック。ここで以下のコマンド。

$ cat file.txt | sort | uniq -c | grep -v "^   1 " | wc -l
       0

一旦ソートしてから uniq -c で同一の行の数を数えます。
そして、1 行しかない=重複がない行を除外すると、
重複している行のみ残るので、wc -l で数えます。

コマンドを組み合わせただけですが、意外と便利っぽいので備忘録に。

システムファイルの自動バックアップの話

最近お世話になることがあったので。

FreeBSD は、cron から起動される periodic で、
いくつかシステムにとって重要なデータがバックアップされています。

/var/backups にいろいろ置いてあって、aliases だとか、
起動パーティションのデータとか、gpart の結果とか。
master.passwd とか、pkg のデータベースなどもあります。

それぞれ、periodic の daily で走るスクリプトによってバックアップが行われていて、
現在の状態が最新のバックアップと異なっていれば、
コピーして圧縮を行う感じでやってるみたいです。

その中でも最近お世話になったのが pkg のデータベース。
pkg のインストール済み一覧とかは、/var/db/pkg/local.sqlite にあるのですが、
ディスクのエラーで破損してしまいました。
そんなときの復旧手順です。

ネットで検索すると、pkg backup を使うみたいな話があったりしますが、
/var/backups に置いてあるのは SQLite の生データなので、これでは復元できません。

具体的には以下のコマンドで復旧します。

$ sudo mv /var/db/pkg/local.sqlite{,.bak}
$ xzcat var/backups/pkg.sql.xz.7 | sudo pkg shell ".read /dev/stdin"

1行目は元の SQLite ファイルをリネームして保存してます。
破損していることが分かっているなら別に削除でもいいのですがなんとなく。

2行目が復元のコマンドです。
xz で圧縮されているので、xzcat で伸張したデータを stdout に流します。
そして、pkg shell は SQLite の対話環境を起動するサブコマンドです。
パイプで流し込んだデータは stdin から読み込めるので、/dev/stdin をファイルとして開いて、
そこからデータを読み込みます。.read は読み込んだ SQL を実行する命令です。
なお、当然ながら SQLite 対話環境は sudo 権限で起動する必要があります。

ポイントとしては、パイプで流し込んだデータは /dev/stdin をファイルとして開くと、
そのまま読み込める。というのは意外と汎用性が高そう?と思ったりしました。

大抵のコマンドは入力ファイル名に - を指定すると stdin から読んでくれたりしますが。
たまにそういう気が利かないツールでも、/dev/stdin を読めば OK なのは便利です。
ただし、/dev/stdin はシークができないので、1pass で読み込めるツール限定ですが。

なんか fdc0 がエラー吐いてるが…?

という訳で、たまにシステムアップデートして再起動すると、 なんか起動時のログで fdc0 がエラーを吐いている訳です。

fdc0: <Enhanced floppy controller> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: non-PNP ISA device will be removed from GENERIC in FreeBSD 14.
fdc0: cmd 08 failed at in byte 1 of 1
fdc0: sense intr err reading stat reg 0
fdc0: cmd 08 failed at in byte 1 of 1
fdc0: sense intr err reading stat reg 0
fdc0: cmd 08 failed at in byte 1 of 1
fdc0: sense intr err reading stat reg 0
fdc0: cmd 08 failed at in byte 1 of 1
fdc0: sense intr err reading stat reg 0

うーん?フロッピーのコントローラですか……しかも ISA の……? いや、このマシンにフロッピーディスクドライブなんてついてないが???

という訳で、そんなときはこれ。 /boot/loader.conf に以下の一行を追加。

hint.fdc.0.disabled="1"

はい、消えたー。

てか、いつのバージョンからこれ出るようになったんだろう?ちなみに今は 13.1-R。

PPPoE ルータの機能も持ってきてしまった話

普通に Buffalo とか NEC の民生用ルータを使ってたんだけれども、 いい加減いろいろ嫌気がさしてきたので。

まぁ、おうちサーバのメンテをするとインターネットに繋がらなくなる問題があるので、 今まで妥協して民生用ルータを使っていたけれども、最近は IPv6 だけでもだいぶ生きていけるし、 いざとなればスマフォがあるので大丈夫かな?と思って。

PPPoE クライアントの設定をする

いつの間にか、ppp デーモンが PPPoE に対応してたのですね。 なんと便利な時代になったことでしょう。 インストール直後状態の FreeBSD でも設定を書くだけで PPPoE 接続できるだなんて。

などとうわ言のように繰り返しながら設定を書きます。

# /etc/ppp/ppp.conf
default:
  set device PPPoE:em0
  set mru 1454
  set mtu 1454
  disable ipv6cp

prov:
  set authname <PPPoE_LOGIN_ID>
  set authkey <PPPoE_PASSWORD>

末尾2行をプロバイダから提供の文字列に置き換えて使います。あと NIC のデバイス名が1か所。

なお、パスワードをベタで書いてあることから分かる通り、 /etc/ppp/ppp.confパーミッションを 600 にするのを忘れないこと。

# /etc/rc.conf
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="prov"
ppp_nat="NO"

これで普通に立ち上がるようになります。

$ sudo /etc/rc.d/ppp start
$ ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1454
        options=80000<LINKSTATE>
        inet XXX.XXX.XXX.XXX --> YYY.YYY.YYY.YYY netmask 0xffffffff
        groups: tun
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        Opened by PID 735

すばらしい。ただ設定ファイルを書いただけで動くのである。 これが本来 OS のあるべき姿なのかもしれない。 もう昔とは違うということを思い知るのである。

pf NAT の設定をする

まぁ、こっちは MAP-E の時に散々実験したので省略。 基本的に同じことを tun0 に対してやるだけ。

うーん、ひねりがないな。まぁ備忘録として。

ああ、 tun0 のデバイス名は ppp.conf で固定できる気がするからそのうちやる。

あとなんか起動時に warning が出てるのでそのうち調べる。 なんか知らんけど動いてるから気にしなくてもいいのかも知れないけど。