python - 使用 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()
我有两个主要问题:
一旦隧道出现(“隧道现在应该启动并运行”),bash 提示符就会返回并且连接会立即丢失。(netstat 显示 FIN_WAIT)
另一个奇怪的事情是我有密码超时(不时)。我只是想知道在密码提示处引入延迟是否是个好主意。
谢谢各位!
解决方案
知道了!读取缓冲区大小设置为默认值。所以我需要从 ssh 命令 (-vvv) 中删除超详细模式,以及与详细输出相关的所有 pexpect 命令。我还需要将超时设置为无无限,或设置为 300 5 分钟...
推荐阅读
- python - 如何在 Azure Functions 中添加和执行二进制文件?
- sql - SQL 获取与事件的交集的所有组合
- ios - 配置文件不支持钥匙串共享功能和缺少的权利
- ios - 配置文件不包括 application-identifier 和 keychain-access-groups 权利
- multithreading - 不兼容的类型:“常规过程和方法指针”
- java - Java - 单词加扰器[保留第一个和最后一个字母]
- java - 如何扩展 ConnectionService?
- java - 获取多个 Element JSoup Java Android
- ios - 从 iOS 上的 React Native 应用程序访问 NSUserDefaults
- nrules - NRules 会议如何比较事实?