先日、紆余曲折あってRaspberry Piに、起動時に特定のサーバーに対してリモートトンネルを掘るように、/etc/rc.localに
autossh user@example.com -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &
# https://www2.filewo.net/wordpress/2014/08/05/ssh%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%EF%BC%88ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%EF%BC%89%E3%80%90%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA/#i-21 を参考
のように記述していたのですが、OSの起動ログを確認してみると、
Failed to start /etc/rc.local Compatibility.
というエラーメッセージが発生。
起動後journalctlで調べてみると
ssh exited prematurely with status 0
というメッセージが出ていました。
調べたところ、こちらのサイトに答えが乗っていました。
Autossh error with upstart script: ssh exited prematurely with status 0 [closed] – serverfault
どうやら、rc.localでsshコマンドを動かしてしまうと、sshコマンドが出力する対話メッセージが原因で問題が起きてしまうようです。
ということで、ssh(autossh)コマンドに “-N”オプションを付けて、非対話モードにします。
autossh user@example.com -N -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &
これで/etc/rc.localが起動で失敗することはなくなりました。
ちなみに、autosshは完全にkillされるまで動き続けるため、コマンドの最後に”&”をつけてバックグラウンドにしないといつまでたっても起動が終わらないという状態になりますので注意が必要です。
/etc/rc.localは手軽に起動時にスクリプトを実行させるにはいい仕組みですが、上記のようなことを考えるとやはり起動時に実行させる処理は可能な限りデーモン化した方がよいのかもしれませんね…(;´∀`)