我有2台機器。其中有我的機器和運行 SSH Docker 容器的機器。某些服務正在我的電腦上的指定連接埠上運行,並且我正在將連接埠轉送到 SSHD 容器。然後我嘗試終止轉送(以及 SSH 連線本身)。
當直接將連接埠轉送到第二台機器時(連接到普通的,而不是 dockerized SSHD),我能夠找到轉送的 PID,從而殺死它。
ssh -N -R 20030:127.0.0.1:20000 [email protected] -p 22 -v
netstat
方法
root@host /home/username # netstat -antlp | grep 20030
tcp 0 0 127.0.0.1:20030 0.0.0.0:* LISTEN 5918/sshd: username
tcp6 0 0 ::1:20030 :::* LISTEN 5918/sshd: username
root@host /home/username # kill -9 5918
lsof
方法
root@host /home/username # lsof -n | grep 20030
sshd 6866 username 9u IPv6 1070467 0t0 TCP [::1]:20030 (LISTEN)
sshd 6866 username 10u IPv4 1070468 0t0 TCP 127.0.0.1:20030 (LISTEN)
root@host /home/username # kill -9 6866
轉送被終止,SSH 連線也被終止,因為我要求僅使用 SSH-N
選項進行轉送。
然而,當在 Docker 容器內使用 SSHD 時,情況就沒那麼簡單了。
假設容器的 SSHD 在連接埠 2222 上運行。
ssh -N -R 20030:127.0.0.1:20000 [email protected] -p 2222 -v
然後我進入容器並嘗試與之前相同的方法。
netstat
方法
root@f9702d3087f0:/# netstat -antlp | grep 20030
tcp 0 0 0.0.0.0:20030 0.0.0.0:* LISTEN -
tcp6 0 0 :::20030 :::* LISTEN -
lsof
方法
root@f9702d3087f0:/# lsof -n | grep 20030
root@f9702d3087f0:/#
請注意,我現在無法找到轉送的 PID。 Docker 容器與直接連接到主機有何不同?我對在客戶端這樣做不感興趣。
答案1
使用此選項運行容器:docker run [...] --cap-add=SYS_PTRACE
使用 Docker Compose 時,請將其新增至容器的定義:
cap_add:
- SYS_PTRACE
它有什麼作用?來自 Docker 文件:
SYS_PTRACE 使用 ptrace(2) 追蹤任意進程。