Python脚本通过SSH隧道连接到Namecheap的MySQL数据库

时间:2015-03-13 02:53:45

标签: python mysql linux ssh ssh-tunnel

我正在尝试一些事情,因为两天谷歌搜索和阅读论坛没有任何成功。

我有一个在Namecheap.com上托管的MySQL数据库,我需要通过Python脚本从本地linux机器访问,以创建表和条目。 Namecheap说"

"出于安全原因,我们的共享服务器上禁用了远程MySQL连接,但您可以使用SSH-client(例如,Putty)和MySQL在您的PC和我们的服务器之间轻松设置SSH隧道端口(3306)转发。完成后,您将在本地计算机上侦听端口3306并将其转发到端口3306上的远程服务器本地主机。因此,您可以有效地连接到远程服务器的MySQL数据库,就好像它在您的当地的盒子。 "

并举例说明使用PuTTY

"使用您的服务器IP地址作为主机名和端口21098"

在PuTTY中创建会话

重点是我需要我的Python脚本自动执行此操作而不提示输入密码等。

已阅读有关paramiko的内容,但没有说明这一点,因为SSH对我来说是新鲜事(除了访问我的linux机器之外)。

输入密码后,我可以通过命令行手动登录我的主机帐户,但这只是全部,因为那时不知道如何运行我机器上的脚本。

ssh -p 21098 my_user_name@server137.web-hosting.com 

编辑:
很好,现在至少在清理了我的python目录之后发生了一些事情(剩下的paramiko.py文件创建了问题)。 在脚本的第2行也进行了一些小改动(ssh = SSHClient() - >> ssh = paramiko.SSHClient())

然后做了以下事情:

ssh -p 21098 my_username@server137.web-hosting.com

登录远程主机,登录成功后输入密码

ssh-keygen -t rsa

创建了一个没有pasphrase的密钥,我之后通过ftp将其恢复以将其保存在我的本地机器文件夹中

/home/daniel/python_scripts/sshkey

回到我的本地机器然后在python脚本下面运行

#!/usr/bin/python
import paramiko

#clean the screen
os.system('clear')
myPkey = paramiko.RSAKey.from_private_key_file('/home/daniel/python_scripts/sshkey/key')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #if you want to auto add the host RSA key
ssh.connect('server137.web-hosting.com', 21098, 'my_username', pkey=myPkey)

sys.exit()

但这就是我得到的:

Traceback (most recent call last):
File "./my_vimeo.py", line 13, in <module>
ssh.connect('server137.web-hosting.com', 21098, 'my_username', pkey=myPkey)
File "/usr/local/lib/python2.7/dist-packages/paramiko/client.py", line 307, in connect
look_for_keys, gss_auth, gss_kex, gss_deleg_creds, gss_host)
File "/usr/local/lib/python2.7/dist-packages/paramiko/client.py", line 519, in _auth
raise saved_exception
paramiko.ssh_exception.AuthenticationException: Authentication failed.

&#39; my_username&#39;显然不是所示的......

无论如何,有一些我不理解的东西,显然做错了.....

1 个答案:

答案 0 :(得分:2)

Paramiko真的是你想要的。

基本上,它是一个SSH客户端(就像PuTTY,对于一个..),甚至有TTY支持。 基本上,您将使用他们的类SSHClient并调用connect方法。你可以在没有密码的情况下完成。但是,您需要一个公钥,paramiko也支持代替密码。

所以,在某个地方,当你执行ssh -p 21098 my_user_name@server137.web-hosting.com时,你所说的是server137,检查我的hostkeys文件中的公钥,并确认我可以连接。

然后您可以使用公钥:

import paramiko

myPkey = paramiko.RSAKey.from_private_key_file('<private_key_path_on_your_server>')
ssh = SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #if you want to auto add the host RSA key
ssh.connect('server137.web-hosting.com', 21098, 'my_user_name', pkey=myPkey

您可以在此处查看如何设置密钥:Paramiko ssh connection without password

SSHClient的Paramiko文档:Paramiko Client docs