python - python Telnet 通过 SSH 隧道
问题描述
我编写了一个 python 脚本,它将启动一个 SSH 会话,然后它将 Telnet 到一个交换机。使用 pexpect、pxssh 和 telnetlib。
一切似乎都在工作,我可以访问一些开关。但对于大多数人来说,我得到了这个错误:
socket.error: [Errno 111] 连接被拒绝
或者有时:
没有到主机的路由
我检查了,有一个服务器在默认端口上侦听,我的防火墙已关闭。
- 请注意,交换机没有限制,我的 IP 已列入白名单*
还有什么似乎不对,当我尝试在脚本之外(在 shell 中)使用 SSH 和 TELNET 命令时,一切都会正常工作,我可以访问交换机。
我将不胜感激任何反馈。
from pexpect import pxssh
import sys
import telnetlib
s = pxssh.pxssh()
hostname = ('#')
username = ('##')
password = ('###')
#LOGIN TO SSH HOST
s.login(hostname,username,password)
user=('####')
passw=('#####')
tn = telnetlib.Telnet(host)
tn.read_until("username: ")
tn.write(user+"\n")
tn.read_until("password: ")
tn.write(passw+"\n")
tn.write("terminal length 0\n")
tn.write("show interface description\n")
tn.write("exit\n")
data = tn.read_all()
print data
解决方案
SSH 本身并不是真正的隧道。它是一个应用层协议。Telnet也是应用层协议,至少需要TCP层隧道。如果你想在SSH 中远程登录,你需要telnet
通过 SSH 在远程服务器上使用命令。
from pexpect import pxssh
s = pxssh.pxssh()
hostname = ('#')
username = ('##')
password = ('###')
s.login(hostname,username,password)
s.sendline('telnet [your hostname]')
s.sendline('show interface description\n')
推荐阅读
- python - 使用 pyautogui 更改鼠标速度
- postgresql - 在关系数据库中创建用户后调用脚本是否可取?
- mongodb - 重新安装后Mongodb无法识别过去的数据文件(.wt)
- xcode - 如何在外部 ssd 中安装 xcode 11.7
- python - 加载 python 包需要很长时间(3.5 on Anaconda for Windows)
- c# - 如何获取 Dynamics 365 令牌?
- c# - Visual Studio C# SerialPort 数据转 ASCII - Encoding.ASCII.GetString(data, 0, data.Length);
- r - 将因子转换为数值返回零
- node.js - Electron 中的自签名证书
- opengl - 如何在vmware中将opengl升级到3.3