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

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

screen のロック機能を殺す

みなさん screen 使ってますか? 私は未だに使ってますが、世の中的には tmux が主流なんでしょうかね。

こいつにはなぜかスクリーンロックって機能があって、 ワンタッチで画面(コンソールだけど)をパスワードロックできます。

まぁ、イマドキな環境ならパスワードなんて使わないですよね……何なら覚えてないまである。 乱数で作ってそのまま破棄しちゃう。

そんなわけで、誤爆して困ることになるのですが、なんとこいつ、 SSH コネクションを張りなおすと何事もなく再接続できます。

……ロックの意味???

前置きが長いですがやることはひとつ。 screen の起動前にこいつ。

setenv LOCKPRG /usr/bin/true
screen

sh 系を使ってるならこっちで。

export LOCKPRG=/usr/bin/true
screen

今回はこれだけ。ほんとに備忘録やね。

openntpd で時刻合わせ

ついうっかり設定を忘れていたものがあったので、設定の手順をメモ。

まずは openntpd をインストールします。

$ sudo pkg install openntpd

で、 /usr/local/etc/ntpd.conf を編集。

servers ntp.nict.jp

もうこの1行だけでいいんじゃないかな。

次は /etc/syslog.conf を編集。

!ntpd
*.*                                             /var/log/ntpd.log

以前はコメントアウトを解除するだけでよかったのに、 いつの間にか消えてしまっていた…… ていうか最近は /etc/syslog.d/ に書くべきなのかもしれない。

$ sudo touch /var/log/ntpd.log
$ sudo chmod 644 /var/log/ntpd.log
$ sudo /etc/rc.d/syslogd restart

ログファイルを作って記録を開始。 syslogdreload でもいいのかもしれない?

で、 /etc/rc.conf に以下の行を追加。

openntpd_enable="YES"

はい、実行開始。

$ sudo /usr/local/etc/rc.d/openntpd start

暇だったらログとか眺めるなど。

$ tail -f /var/log/ntpd.log
XXX XX 00:31:15 host ntpd[1278]: clock is now synced

よしっ。

あ、あんまり時刻がズレてると調整してくれなかったりするみたいなので、 そういう時は先に $ sudo ntpdate ntp.nict.jp とか打つといい(のかな?)。

ログローテートも忘れないこと

syslog の設定を変えたのはいいけど、 それだけだとログファイルが肥大化して泣くことになりました。

という訳で /usr/local/etc/newsyslog.conf.d/ntp.conf を作ります。

/var/log/ntpd.log       root:wheel      644     5       100     *       CEXp

最初に書くのはさっき syslog.conf に書いたファイル名。

で、後ろに続くのはファイルオーナー・パーミッション・連番で残すファイル数。 さらにローテートの条件になるファイルサイズと時刻。 オプションの CEXp は私の好み。

これでだいじょぶそう。

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 で読み込めるツール限定ですが。