this one などのガイドに従って、systemdでautosshを使用して起動時に永続的なssh接続を開始しようとしています。そうすると、接続してすぐに切断され、ログにはほとんど情報がありません。私のシステムは(uname -a)です:
Linux local_machine_name 3.16.0-4-AMD64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
実行時:
autossh -M 0 dbase1
上記のコマンドを実行すると、接続が数日間安定します。 dbase1は私の構成ファイルで定義されており、(匿名化された)次のようになります。
Host dbase1
HostName x.x.x.x
User serverusername
LocalForward 54320 localhost:5432
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
ProxyCommand ssh -q [email protected] nc %h %p 2> /dev/null
次に、/ etc/systemd/system /に次のサービスを作成しました
[Unit]
Description=AutoSSH tunnel service
After=network.target
[Service]
Type=simple
User=*username with cert and config file in home/username/.ssh/ folder*
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -vvv -M 0 dbase1
[Install]
WantedBy=multi-user.target
Systemctlデーモンをリロードしてサービスを開始した後、接続が確立されてから切断されます。以下は、journalctl -u myautossh.serviceの出力です(リモートサーバーからのウェルカムメッセージから始まり、接続を確認しています)。
Jul 21 14:38:30 local_machine_name autossh[555]: *** Connection successful, welcome to the remote server! ***
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: client_input_channel_req: channel 2 rtype exit-status reply
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: rcvd eof
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: output open -> drain
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: obuf empty
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: close_write
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: output drain -> closed
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: rcvd close
Jul 21 14:38:30 local_machine_name autossh[555]: debug3: channel 2: will not send data after close
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: almost dead
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: gc: notify user
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: gc: user detached
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: send close
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: is dead
Jul 21 14:38:30 local_machine_name autossh[555]: debug2: channel 2: garbage collecting
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: channel 2: free: client-session, nchannels 3
Jul 21 14:38:30 local_machine_name autossh[555]: debug3: channel 2: status: The following connections are open:
Jul 21 14:38:30 local_machine_name autossh[555]: #2 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cc -1)
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: channel 0: free: port listener, nchannels 2
Jul 21 14:38:30 local_machine_name autossh[555]: debug3: channel 0: status: The following connections are open:
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: channel 1: free: port listener, nchannels 1
Jul 21 14:38:30 local_machine_name autossh[555]: debug3: channel 1: status: The following connections are open:
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: fd 0 clearing O_NONBLOCK
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: fd 1 clearing O_NONBLOCK
Jul 21 14:38:30 local_machine_name autossh[555]: debug3: fd 2 is not O_NONBLOCK
Jul 21 14:38:30 local_machine_name autossh[555]: Transferred: sent 3372, received 3384 bytes, in 0.7 seconds
Jul 21 14:38:30 local_machine_name autossh[555]: Bytes per second: sent 4633.6, received 4650.1
Jul 21 14:38:30 local_machine_name autossh[555]: debug1: Exit status 0
/ var/log/syslogを見ると、次の行が追加されるだけです(サーバー接続が成功し、上記のエラーメッセージが表示された後)。
Jul 21 14:38:30 local_machine_name autossh[555]: ssh exited with status 0; autossh exiting
それが切断される理由を誰かが知っていますか?
問題はsystemd内にstdinがないためであると思われるため、sshコマンドが接続してから入力を読み取ろうとし、eofで停止します。不足しているオプションは-N
です:
ExecStart=/usr/bin/autossh -vvv -N -M 0 dbase1
OpenSSH 5.4以降を使用している場合は、netcat nc
の使用を、ssh組み込みの同等の-W
で置き換えることができます。
ProxyCommand ssh -q -W %h:%p [email protected]
ネットワークが完全に稼働する前に、サービスが開始しようとしている可能性があります。 After=network.target
をAfter=network-online.target
に置き換えてみてください。
違いの詳細については、systemd wikiの NetworkTargetページ を参照してください。
ターミナルでroot(Sudo)としてautosshコマンドを実行し、認証を承認します(つまり、「yes」と入力します)。これは、IDファイルへのパスが正しいことも確認します。