rc.localにSSHトンネルを張るコマンドを書いたらrc.localがこけるようになった話

takahashi 著者:takahashi

rc.localにSSHトンネルを張るコマンドを書いたらrc.localがこけるようになった話

先日、紆余曲折あってRaspberry Piに、起動時に特定のサーバーに対してリモートトンネルを掘るように、/etc/rc.localに

autossh user@example.com -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &amp;
# 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 &amp;

これで/etc/rc.localが起動で失敗することはなくなりました。

ちなみに、autosshは完全にkillされるまで動き続けるため、コマンドの最後に”&”をつけてバックグラウンドにしないといつまでたっても起動が終わらないという状態になりますので注意が必要です。

/etc/rc.localは手軽に起動時にスクリプトを実行させるにはいい仕組みですが、上記のようなことを考えるとやはり起動時に実行させる処理は可能な限りデーモン化した方がよいのかもしれませんね…(;´∀`)

  • この記事いいね! (0)

著者について

takahashi

takahashi administrator

Webエンジニア。 趣味で自宅サーバーを稼働中。 ファンタジーが好き。