아래 가이드에 따라 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
왜 연결이 끊어졌는지 아는 사람이 있나요?
답변1
문제는 systemd에 표준 입력이 없어서 ssh 명령이 연결한 다음 입력 읽기를 시도하고 eof에서 중지된다는 것입니다. 누락된 옵션은 다음과 같습니다 -N
.
ExecStart=/usr/bin/autossh -vvv -N -M 0 dbase1
nc
OpenSSH 5.4 이상이 있는 경우 netcat 사용을 ssh 내장 해당 기능으로 대체할 수 있습니다 -W
.
ProxyCommand ssh -q -W %h:%p [email protected]
답변2
네트워크가 완전히 가동되기 전에 서비스가 시작을 시도할 수 있습니다. After=network.target
으로 교체해 보세요 After=network-online.target
.
보다웹 대상 페이지차이점에 대한 자세한 내용을 보려면 systemd wiki를 방문하세요.
답변3
터미널에서 루트(sudo)로 autossh 명령을 실행하고 신뢰성을 승인합니다(즉, "yes" 입력). 또한 ID 파일의 경로가 올바른지 확인합니다.