首页 > 解决方案 > 使用 Python 断开 ssh 连接

问题描述

我通常以这种方式建立 ssh 隧道:

ssh -ND 6666 -vvv -p 443 user@server

服务器的回答:

[...]
user@server's password: 
....
debug1: pledge: network 

从那里我知道隧道已经建立。如果不是在 vvv 模式下,我会使用 netstat 检查隧道状态。

netstat -tl

这是我对应的python3脚本:

import pexpect, sys

def ssh_con(host,user,password):
   child = pexpect.spawn("ssh -ND 6666 -vvv -p 443 %s@%s" % (user,host))
   i = child.expect([pexpect.TIMEOUT, 'password: '])
   if i == 0: #timeoutx
      print( "ssh connection timeout")
      sys.exit(1)
   if i == 1:
      print("ssh connection ok, sending password...")
      child.sendline(password)
      i = child.expect([pexpect.TIMEOUT, 'pledge: network'])
      if i==0:
         print("password timeout issue")
         sys.exit(1)
   elif i==1:
        print("tunnel sould be up and running now")

def main():       
  host = '206.189.126.158'
  user = 'cloudssh.us-jvkgouyg'
  password = 'lijuhih'

  child = ssh_con( host, user, password)

if __name__ == '__main__':
   main()

我有两个主要问题:

  1. 一旦隧道出现(“隧道现在应该启动并运行”),bash 提示符就会返回并且连接会立即丢失。(netstat 显示 FIN_WAIT)

  2. 另一个奇怪的事情是我有密码超时(不时)。我只是想知道在密码提示处引入延迟是否是个好主意。

谢谢各位!

标签: pythonsshssh-tunnelpexpect

解决方案


知道了!读取缓冲区大小设置为默认值。所以我需要从 ssh 命令 (-vvv) 中删除超详细模式,以及与详细输出相关的所有 pexpect 命令。我还需要将超时设置为无无限,或设置为 300 5 分钟...


推荐阅读