autossh
다음과 같이 로컬 컴퓨터에서 실행 하면 :
autossh -M 20000 -f - nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
ssh
백그라운드에서 다음 명령이 자동으로 실행됩니다. 이는 제가 예상한 것과 정확히 같습니다.
ps aux | grep -i ssh
/usr/lib/autossh/autossh -M 20000 -f - nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server
/usr/bin/ssh -L 20000:127.0.0.1:20000 -R 20000:127.0.0.1:20001 -N -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
그러나 원격 서버 A에서 실행된 동일한 명령은 다음만 표시합니다 ps
.
/usr/lib/autossh/autossh -M 20000 -f - nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
기본 명령이 시작되지 않는 것 같습니다 ssh
.
ssh
( 원격 서버 A에서 수동으로 명령을 시작 하면 원격 서버 B에 올바르게 연결할 수 있습니다.)
명령이 로컬 컴퓨터와 원격 컴퓨터에서 다르게 작동하는 이유를 알 수 없습니다.
두 autossh
버전 모두 1.4g
내 로컬 컴퓨터와 원격 서버 A에 있습니다.
두 시스템 모두 Ubuntu 20.04를 실행하고 있습니다.
편집하다:
Stéphane Chazelas의 의견: 실제로 두 개의 서로 다른 원격 시스템에서 명령을 시도할 때 두 가지 약간 다른 동작을 발견했습니다.
1.
$ strace -fe execve autossh -M 20000 -f -nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
execve("/usr/bin/autossh", ["autossh", "-M", "20000", "-f", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x7fff532c2f68 /* 40 vars */) = 0
strace: Process 23539 attached
[pid 23539] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23539, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
strace: Process 23540 attached
[pid 23540] execve("/bin/egrep", ["egrep", "-q", "--", "-f?M ?[0-9]+"], 0x55b83714eae8 /* 38 vars */) = 0
[pid 23540] execve("/home/username/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/home/username/.local/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/home/username/anaconda3/condabin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/opt/blenderc/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/usr/local/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/usr/local/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/usr/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/usr/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = -1 ENOENT (No such file or directory)
[pid 23540] execve("/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x55b692ae0a28 /* 38 vars */) = 0
[pid 23540] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23540, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
execve("/usr/lib/autossh/autossh", ["/usr/lib/autossh/autossh", "-M", "20000", "-f", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x55b83714f470 /* 38 vars */) = 0
strace: Process 23541 attached
[pid 23538] +++ exited with 0 +++
strace: Process 23542 attached
[pid 23542] execve("/usr/bin/ssh", ["/usr/bin/ssh", "-L", "20000:127.0.0.1:20000", "-R", "20000:127.0.0.1:20001", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x7ffce7ca53e0 /* 38 vars */) = 0
[pid 23542] +++ exited with 255 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23542, si_uid=1000, si_status=255, si_utime=2, si_stime=0} ---
strace: Process 23543 attached
[pid 23543] execve("/usr/bin/ssh", ["/usr/bin/ssh", "-L", "20000:127.0.0.1:20000", "-R", "20000:127.0.0.1:20001", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x7ffce7ca53e0 /* 38 vars */) = 0
(마지막 3줄은 매번 다른 프로세스 ID를 사용하여 일정한 간격으로 무기한 반복됩니다.)
2.
$ strace -fe execve autossh -M 20000 -f -nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
execve("/usr/bin/autossh", ["autossh", "-M", "20000", "-f", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x7fff7be64dc8 /* 34 vars */) = 0
strace: Process 3850 attached
[pid 3850] +++ exited with 0 +++
strace: Process 3851 attached
[pid 3849] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3850, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
[pid 3851] execve("/bin/egrep", ["egrep", "-q", "--", "-f?M ?[0-9]+"], 0x55690bd42a08 /* 32 vars */) = 0
[pid 3851] execve("/usr/local/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = -1 ENOENT (No such file or directory)
[pid 3851] execve("/usr/local/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = -1 ENOENT (No such file or directory)
[pid 3851] execve("/usr/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = -1 ENOENT (No such file or directory)
[pid 3851] execve("/usr/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = -1 ENOENT (No such file or directory)
[pid 3851] execve("/sbin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = -1 ENOENT (No such file or directory)
[pid 3851] execve("/bin/grep", ["grep", "-E", "-q", "--", "-f?M ?[0-9]+"], 0x5637ad7d9958 /* 32 vars */) = 0
[pid 3851] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3851, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
execve("/usr/lib/autossh/autossh", ["/usr/lib/autossh/autossh", "-M", "20000", "-f", "-nNT", "-L", "192.168.144.1:5433:127.0.0.1:5432", "remote-user@remote-server-B"], 0x55690bd433a0 /* 32 vars */) = 0
strace: Process 3852 attached
[pid 3849] +++ exited with 0 +++
+++ exited with 1 +++
(그런 다음 즉시 사용자에게 콘솔을 반환합니다)
답변1
autossh
글쎄요, 원격 컴퓨터와 로컬 컴퓨터에서 사용할 때 발생하는 약간의 차이를 발견했습니다 .
후자의 컴퓨터에서는 원격 서버 B에 연결하는 데 사용되는 SSH 키의 비밀번호를 입력하라는 GUI 팝업이 표시되었습니다.
동일한 서버 B에 연결하기 위해 원격 시스템을 사용할 때 autossh
GUI(헤드리스 서버)가 없기 때문에 이 암호 프롬프트가 나타나지 않습니다(그러나 ssh
직접 사용하면 자연스럽게 암호를 묻는 메시지가 나타납니다).
따라서 실행하기 전에 터미널에 키 비밀번호를 알려주어야 합니다 autossh
. 예를 들어 ssh-agent
실행하기 전에 실행 중인 터미널 내에서 를 사용하여 이 작업을 수행할 수 있습니다 autossh
. 그러다가 갑자기 효과가 있었습니다.
상세한 솔루션
이 솔루션은 예로 제공됩니다.
~/.bashrc
파일을 가져오기 전에(또는 터미널을 다시 열기 전에) 다음을 파일에 추가하세요 .
ssh-eval() {
eval $(ssh-agent) && ssh-add "${1}"
}
export -f ssh-eval
그런 다음 다음을 실행하십시오.
ssh-eval ~/.ssh/your_ssh_key
해당하는 내용을 입력하세요암호! 이것은 autossh
실제 작업에서 누락된 부분입니다!
autossh
모니터링 포트를 사용하여 실행아니요이미 리모컨에서 사용 중입니다!
autossh -M 20002 -f - nNT -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
해당 포트는 20000
내 로컬 컴퓨터에서 사용되기 때문에 다른 컴퓨터에서 동일한 포트를 사용할 때 연결할 수 없습니다. 해당 명령 자체를 실행해야만 ssh
알 수 있습니다. 예를 들면 다음과 같습니다.
$ ssh -L 20000:127.0.0.1:20000 -R 20000:127.0.0.1:20001 -N -L 192.168.144.1:5433:127.0.0.1:5432 remote-user@remote-server-B
Enter passphrase for key '/home/username/.ssh/your_ssh_key':
****
Warning: remote port forwarding failed for listen port 20000
또한 로컬 포트가 아직 사용되지 않았음을 참고하세요. 그렇지 않으면 다음과 같은 결과가 발생합니다.
...
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 5433
마지막으로 중요한 것은 다음과 같이 모니터링 포트를 +1만큼 "맹목적으로" 늘리지 마십시오.
-M 포트[:echo_port]
사용할 기본 모니터링 포트를 지정합니다. 에코 포트가 없으면 해당 포트와 그 위의 포트(포트 + 1)에서 사용 중인 다른 포트가 없어야 합니다. autossh는 기본 모니터링 포트에서 테스트 데이터를 보내고 위의 포트에서 이를 수신합니다. 예를 들어, "-M 20000"을 지정하면 autossh는 데이터가 포트 20000에서 전송되고 포트 20001에서 수신될 수 있도록 전달을 설정합니다.