因为这个问题似乎是针对其他地方,所以我要在这里指出我的问题:
在我的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连接,这使得它非常慢。
解决方案:
- 我可以输入:
Host SERVER
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p
进入我的.ssh/config
,但我想解决这个在python。
有ssh标志
-T
保持连接打开,在前面提到的问题一个答案是使用Popen()
和p.communicate()
,但它是不可能得到communicates
之间的输出,因为它抛出一个错误ValueError: Cannot send input after starting communication
我可以以某种方式改变我的功能来执行单个ssh命令,如
echo "--show1--"; cat file1; echo "--show2--"; cat file2
,但这对我来说看起来很黑客,我希望有一个更好的方法来保持ssh连接打开并像正常一样使用它。我想要的:例如一个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用于文件传输。