Python 如何使用SSH隧道在远程服务器上执行代码?

Python 如何使用SSH隧道在远程服务器上执行代码?,python,Python,我正在使用SSH隧道更新远程服务器上的数据库。关于这一点,我有一些疑问 下面是ssh隧道的示例代码 import mysql.connector import sshtunnel sshtunnel.SSH_TIMEOUT = 5.0 sshtunnel.TUNNEL_TIMEOUT = 5.0 with sshtunnel.SSHTunnelForwarder( ('ssh.pythonanywhere.com'), ssh_username='your PythonAny

我正在使用SSH隧道更新远程服务器上的数据库。关于这一点,我有一些疑问

下面是ssh隧道的示例代码

import mysql.connector
import sshtunnel

sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0

with sshtunnel.SSHTunnelForwarder(
    ('ssh.pythonanywhere.com'),
    ssh_username='your PythonAnywhere username', ssh_password='the password you use to log in to the PythonAnywhere website',
    remote_bind_address=('your PythonAnywhere database hostname, eg. yourusername.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
    connection = mysql.connector.connect(
        user='your PythonAnywhere username', password='your PythonAnywhere database password',
        host='127.0.0.1', port=tunnel.local_bind_port,
        database='your database name, eg yourusername$mydatabase',
    )
    # Do stuff
    connection.close()
SSH隧道(这里是dostuff)中的所有代码都是在远程服务器上执行的吗? 如果我在SSH隧道之外的计算机上处理一些数据,这些数据是否通过SSH隧道传递到远程服务器


我有一个工作的例子,但我的很多东西都被黑客攻击了。只需要确认一下

希望这是一些帮助

一点背景-我做了一些类似于您的用例的工作。但是我首选的ssh隧道是
paramiko
。下面是一个如何工作的示例

有大量的paramiko API文档,您可以在以下网址找到:

我使用以下方法在受密码保护的客户端上执行命令:

import paramiko
import sys

nbytes = 4096
hostname = 'hostname'
port = 22
username = 'username' 
password = 'password'
command = 'ls'

client = paramiko.Transport((hostname, port))
client.connect(username=username, password=password)

stdout_data = []
stderr_data = []
session = client.open_channel(kind='session')
session.exec_command(command)
while True:
    if session.recv_ready():
        stdout_data.append(session.recv(nbytes))
    if session.recv_stderr_ready():
        stderr_data.append(session.recv_stderr(nbytes))
    if session.exit_status_ready():
        break

print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)

session.close()
client.close()
我的答案基于帕拉米科的经验

  • 在远程服务器中执行的唯一代码是传递给
    会话的命令,如
    session.exec_命令(command)
    。我相信在您的情况下,您需要将其传递到
    隧道

  • 是的,您可以在运行此代码的本地/主机上处理某些数据。处理完之后,您可以构建新命令并执行它,如上所述

  • 不知道您的上下文,但是如果您想在远程服务器上执行数据库操作,您的
    mysql.connector.connect
    可以直接使用ssh,然后连接到数据库