我正在重写我写入Python的Bash脚本.那个剧本的关键是
ssh -t first.com "ssh second.com very_remote_command"
Run Code Online (Sandbox Code Playgroud)
我在使用paramiko进行嵌套身份验证时遇到问题.我无法找到任何处理我的确切情况的例子,但我能够在远程主机上找到sudo的例子.
第一种方法写入stdin
ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("sudo dmesg")
stdin.write('lol\n')
stdin.flush()
Run Code Online (Sandbox Code Playgroud)
第二个创建一个通道并使用类似socket的send和recv.
我能够让stdin.write与sudo一起工作,但它不能与远程主机上的ssh一起使用.
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')
stdin, stdout, stderr = ssh.exec_command('ssh luser@second.com')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()
ssh.close()
Run Code Online (Sandbox Code Playgroud)
... ...打印
---- out ----
[]
---- error ----
['Pseudo-terminal will not be allocated …Run Code Online (Sandbox Code Playgroud) 创建从REMOTE到PROXY的ssh连接,以将REMOTE计算机上端口22上的ssh流量转发到PROXY服务器上的端口8000.
#从REMOTE机器运行
ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER @ PROXY_HOSTNAME
创建一个从LOCAL到PROXY的ssh隧道,并将来自LOCAL:1234的ssh流量转发到PROXY:8000(然后转发到REMOTE:22).
#从LOCAL机器运行
ssh -L 1234:localhost:8000 PROXY_USER @ PROXY_HOSTNAME
创建从LOCAL到REMOTE的转发ssh连接(通过PROXY).
#在新的终端窗口中从LOCAL机器运行
ssh -p 1234 REMOTE_USER @ localhost#我现在已经转到REMOTE框并可以运行命令
我查看了一些与使用Paramiko进行端口转发相关的问题,但它们似乎并未解决这种特定情况.
如何使用Paramiko运行上面的步骤2和3?我基本上想运行:
import paramiko
# Create the tunnel connection
tunnel_cli = paramiko.SSHClient()
tunnel_cli.connect(PROXY_HOSTNAME, PROXY_PORT, PROXY_USER)
# Create the forwarded connection and issue commands from LOCAL on the REMOTE box
fwd_cli = paramiko.SSHClient()
fwd_cli.connect('localhost', LOCAL_PORT, REMOTE_USER)
fwd_cli.exec_command('pwd')
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用python中的MySQLdb连接到远程服务器上的MySQL数据库.问题是首先我需要SSH到主机,然后从那里,我需要连接到MySQL服务器.但是,我遇到的问题是MySQLdb似乎没有办法在连接到SQL服务器之前建立SSH连接.我检查了文档,但没有运气.
这是我连接的方式:
conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')
Run Code Online (Sandbox Code Playgroud)
但我真正需要的是这样的:
conn = MySQLdb.connect(sshhost = 'sshhost.domain.com', sshuser = 'sshusername', sshpasswd = 'sshpasswd', host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')
Run Code Online (Sandbox Code Playgroud)
这当然只是弥补了.有人可以提出任何建议吗?
我在使用 SSH 隧道连接到远程数据库时遇到问题(现在我正在尝试使用 Paramiko)。这是我的代码:
#!/usr/bin/env python3
import psycopg2
import paramiko
import time
#ssh = paramiko.SSHClient()
#ssh.load_system_host_keys()
#ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#ssh.connect('pluton.kt.agh.edu.pl', 22, username='aburban', password='pass')
t = paramiko.Transport(('pluton.kt.agh.edu.pl', 22))
t.connect(username="aburban", password='pass')
c = paramiko.Channel(t)
conn = psycopg2.connect(database="dotest")
curs = conn.cursor()
sql = "select * from tabelka"
curs.execute(sql)
rows = curs.fetchall()
print(rows)
Run Code Online (Sandbox Code Playgroud)
问题是该程序总是尝试连接到本地数据库。我尝试了其他 SSH 隧道,也出现了同样的情况。远程服务器上的数据库存在,并且通过终端使用“经典”SSH 连接可以正常工作。