Python:SSH连接使用终端,但不使用Python脚本

Python:SSH连接使用终端,但不使用Python脚本,python,ssh,Python,Ssh,当我使用终端时: ssh user@ip-adress 然后输入我的密码 ssh-password 然后一切正常,建立了一个连接,我可以通过退出关闭该连接 但当我试图用Python实现这一点时: import sshtunnel from sshtunnel import SSHTunnelForwarder sshtunnel.SSH_TIMEOUT = 5.0 sshtunnel.TUNNEL_TIMEOUT = 5.0 server = SSHTunnelForwarder(

当我使用终端时:

ssh user@ip-adress
然后输入我的密码

ssh-password
然后一切正常,建立了一个连接,我可以通过退出关闭该连接

但当我试图用Python实现这一点时:

import sshtunnel
from sshtunnel import SSHTunnelForwarder

sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0

server = SSHTunnelForwarder(
    'ip-adress', 22,
    ssh_username="user",
    ssh_password="ssh-password",
    remote_bind_address=('127.0.0.1', 3306)
)

server.start()

print(server.local_bind_port)
我将收到如下错误:

sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway

为什么?

实际上,您的两个示例之间存在差异。第一个只是建立一个SSH连接,其中Python代码试图建立到远程机器上的服务的连接,远程机器正在侦听端口3306(可能是MySQL)

因此,实际上只是建立一个SSH连接。我建议你去帕拉米科:

(引用:Paramiko是SSHv2协议[1]的Python(2.7,3.4+)实现,提供客户端和服务器功能)

使用此库基本上可以实现以下功能:

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd_to_execute)
因此,您可以执行任何任意命令(假设您有权限)——就像您在第一个示例中所做的那样

但是,当您确实想要连接到特定的服务(如MySQL)时。然后,您的第二种方法很好,您应该再次检查您的服务是否正在监听127.0.0.1:3306,例如,使用以下命令:

netstat -tulpen

(此命令需要在远程计算机上执行。)

增加详细信息以获取更多信息
-v,--verbose增加输出详细度(默认值:错误)
谢谢。是的,我的目标是通过SSH连接到MySQL数据库。“双重检查”是什么意思?当我尝试使用SSHTunnelForwarder连接到具有pymsql的MySQL数据时,我将收到相同的错误。看起来您的远程计算机上的MySQL服务没有运行,或者至少没有侦听“127.0.0.1”,3306。例如,它也可能正在收听'0.0.0.0',3306。使用命令
netstat-tulpen
,您可以获得绑定到端口的所有正在运行的服务的概览。我的建议是,首先检查您的MySQL服务是否在此处列出,并且IP:端口是否与脚本中的匹配。当我使用HeidiSQL或Sequepro之类的DB客户端时,我可以使用SSH(上面的IP地址、用户、SSH密码),并可以使用(MySQL主机:127.0.0.1、DB_用户、DB_密码,3306)连接到DB但是我也可以连接另一个MySQL主机,比如0.0.0.0。当我在Python中使用这些值时,上面给出了ssh网关错误。这里发生了什么?我猜是由于MySQL服务器出现问题导致连接失败。请尝试以下操作:打开bash或cmd并执行以下命令:`sshtunnel-v-U SSH_USERNAME-P SSH_PASSWORD-R 127.0.0.1:3306-P 22 SERVER_IP`我猜您将看到数字/代码10060-这意味着您不允许远程访问该服务。在用现有的用户名,密码等我收到:-bash:!0:未找到事件