如何保持ssh连接打开,并在python中进行多个请求和输出



因为这个问题似乎是针对其他地方,所以我要在这里指出我的问题:

在我的python脚本中,我使用ssh对远程服务器使用多个请求:

def ssh(command):
command = 'ssh SERVER "command"'
output = subprocess.check_output(
command, 
stderr=subprocess.STDOUT,
shell=True,
universal_newlines=True
)
return output

这里我将得到file1的内容为output

我现在有多个方法使用这个函数:

def show_one():
ssh('cat file1')
def show_two():
ssh('cat file2')
def run():
one = show_one()
print(one)
two = show_two()
print(two)

执行run()将打开和关闭每个show_*方法的ssh连接,这使得它非常慢。

解决方案:

  1. 我可以输入:
Host SERVER
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p

进入我的.ssh/config,但我想解决这个在python。

  1. 有ssh标志-T保持连接打开,在前面提到的问题一个答案是使用Popen()p.communicate(),但它是不可能得到communicates之间的输出,因为它抛出一个错误ValueError: Cannot send input after starting communication

  2. 我可以以某种方式改变我的功能来执行单个ssh命令,如echo "--show1--"; cat file1; echo "--show2--"; cat file2,但这对我来说看起来很黑客,我希望有一个更好的方法来保持ssh连接打开并像正常一样使用它。

  3. 我想要的:例如一个python/bashic做同样的我可以配置在.ssh/config(见1.)声明一个特定的套接字的连接,并显式地打开,使用,关闭它

尝试从类创建ssh对象并将其传递给函数:

import paramiko
from pythonping import ping
from scp import SCPClient
class SSH():
def __init__(self, ip='192.168.1.1', username='user', password='pass',connect=True,Timeout=10):
self.ip = ip
self.username = username
self.password = password
self.Timeout=Timeout
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if connect:
self.OpenConnection()
self.scp = SCPClient(self.ssh.get_transport())
def OpenConnection(self):
try:
skip_ping = False
ping_res=False
log.info('Sending ping to host (timeout=3,count=3) :'+self.ip)
try:
PingRes = ping(target=self.ip,timeout=3,count=3, verbose=True)
log.info('Ping to host result :' + str(PingRes.success()))
ping_res=PingRes.success()
except:
skip_ping=True
if ping_res or skip_ping:
log.info('Starting to open connection....')
self.ssh.connect(hostname=self.ip, username=self.username, password=self.password, timeout=self.Timeout, auth_timeout=self.Timeout,banner_timeout=self.Timeout)
self.scp = SCPClient(self.ssh.get_transport())
log.info('Connection open')
return True
else:
log.error('ssh OpenConnection failed: No Ping to host')
return False
myssh = SSH(ip='192.168.1.1',password='mypass',username='myusername')

ping结果被封装在try catch中,因为有时我的机器会返回一个错误,您可以删除它并只验证ping到主机。自我。SCP用于文件传输。

相关内容

  • 没有找到相关文章

最新更新