新年明けましておめでとうございます。今年も宜しくお願いします。
今年の一発目。FreeBSD ネタですが、sshd を port:22 ではないポートで起動するようにしてみたいと思います。そんなの簡単じゃん。て?そりゃーそーだけどさー。rcNG な起動スクリプトを書くのが難儀なのよ。
port:22 で起動する sshd は /etc/rc.conf に
と書けば良いのだけど、これとは別に、例えば port:22022 で sshd を起動したい。どうしてか?と、言えば網内では port:22 で ssh するんだけど、BB ルータの外側から各サーバにダイレクトに ssh したい場合、個々のサーバで sshd を別ポートで起動して、BB ルータ側でポートの転送をしてあげればダイレクトに入れるよねー。って感じですかね。
なんだよー。そんなの IPv6 あればできるじゃん。と思うんですけど、IPv4 の世界しか無い場合は不可能なので・・。
で、ここまでが前置きで、サーバを起動したときに sshd を port:22022 で起動するようにスクリプトを書くわけです。しかし、これがまた大変・・。例えば、sshd だけでなく、httpd を port:8080 で起動するスクリプトはどうするのだ?とか、色々出てきてですねぇ・・。
一応できたスクリプトがこんな感じ。
#!/bin/sh
#
# PROVIDE: sshd-diff-port
# REQUIRE: LOGIN cleanvar
#
# Define these smartd_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
port="22022"
sshd_diff_port_enable="${sshd_diff_port_enable-NO}"
sshd_diff_port_pidfile="/var/run/sshd-${port}.pid"
. /etc/rc.subr
name="sshd_diff_port"
rcvar=`set_rcvar`
command="/usr/sbin/sshd"
pidfile=${sshd_diff_port_pidfile}
load_rc_config $name
command_args="-o PidFile=${sshd_diff_port_pidfile} -p ${port}"
run_rc_command "$1"
|
簡単かぁ?これを書くために jman rc.subr してじっくりと眺めます。後はコマンド、今回の場合は sshd ですが、それのオプションをじっくりと調査します。
で、スクリプト名は sshd_diff_port としました。command_args で sshd のオプションを書きました。/etc/rc.conf.local には以下のように書けば起動できることでしょう。
sshd_diff_port_enable="YES"
|
良かった良かった。
それにしても rcNG スクリプトを書く上で疑問な点がまだ残っています。
スクリプトを起動してその中から実際のデーモンを起動した場合(firefox みたいなイメージかな) stop ができない。例えば kdm は スクリプトでそれを起動時に呼ぶのだけど、その中では kdm-bin をキックしている。その場合、stop オプションで実行しても kdm が終了しない。pidfile=${kdm_pidfile} を記述しても 以下のメッセージが出力され終了できない。なんで〜(?_?)。ちょっとだけrc.subr 見てみたけど $name とかが絡んでいる? けど、実際のプロセスは kdm ではなく、kdm-bin なのよー。どうすれば kill できるのー?
kdm not running? (check /var/run/kdm.pid).
|
で、できたスクリプトがこれ。stop は受け付けてくれないので rc スクリプト内で完結するようにした。reload も stop 部分は自前にして start だけ rc.subr に任せた。ダサいなぁ・・。
#!/bin/sh
#
# kdm start
#
# PROVIDE: kdm
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: FreeBSD shutdown
# Define these smartd_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
# /etc/rc.conf.d/kdm
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
kdm_enable="${kdm_enable-NO}"
kdm_pidfile="/var/run/kdm.pid"
. /etc/rc.subr
name="kdm"
rcvar=`set_rcvar`
load_rc_config $name
command="/usr/local/kde4/bin/kdm"
pidfile=${kdm_pidfile}
case $1 in
'stop' )
if [ -f ${pidfile} ] ; then
kill -TERM `cat ${pidfile}`
/bin/rm ${pidfile}
fi
echo 'Stopping kdm.'
exit;
;;
'restart' )
if [ -f ${pidfile} ] ; then
kill -TERM `cat ${pidfile}`
/bin/rm ${pidfile}
fi
echo 'Stopping kdm.'
;;
esac
run_rc_command "$1"
|
httpd を 8080 で起動するスクリプトはもう、書くのもイヤになっちゃった・・。どこかに rc スクリプトのサンプル置き場とか無いかなぁ?
本当に書き方、よく分からないや・・。きっと rc.subr 眺めて書くんでしょうなぁ・・。トホホ・・。
Linux の rc スクリプトも汚いと思っていたけど、最近の FreeBSD の rc スクリプト書くのも、簡単なのは良いのだけど、ちょっと何かやろうとしたら全然書けない・・。トホホ・・。