У меня есть команда, такая как
ssh -S myAuthServer hostname
Я пытался создать фрагмент кода, и я не уверен, как реализовать часть -S
. Код, который у меня есть на данный момент:
#!/usr/bin/python
import paramiko
from paramiko import SSHClient, SSHConfig, SSHException
paramiko.util.log_to_file("/tmp/script.log")
def getSSHConnection():
config = SSHConfig()
host='server1'
# setup SSH client
client = SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#Check for proxy settings
proxy = paramiko.ProxyCommand('ssh -S myAuthServer root@%s' % host)
print "proxy:", proxy
#Setup the SSH connection
try:
if (proxy is None):
client.connect(host, port=22, username='root')
else:
print "-> Using paramiko with proxy"
client.connect(host, port=22, username='root', sock=proxy)
except SSHException, ex:
print ex
if client:
stdin, stdout, stderr = client.exec_command('hostname')
tables=stdout.readlines()
print "stdin:", stdin
print "stdout:", stdout
print "stderr:", stderr
print "tables:", tables
return client
getSSHConnection()
Ошибка, которую я получаю
INF [20181011-11:14:55.131] thr=1 paramiko.hostkeys: Unable to handle key of type 1024
DEB [20181011-11:14:55.161] thr=2 paramiko.transport: starting thread (client mode): 0x4f35fd0L
DEB [20181011-11:14:55.161] thr=2 paramiko.transport: Local version/idstring: SSH-2.0-paramiko_2.2.1
ERR [20181011-11:15:10.242] thr=2 paramiko.transport: Exception: Error reading SSH protocol banner
ERR [20181011-11:15:10.245] thr=2 paramiko.transport: Traceback (most recent call last):
ERR [20181011-11:15:10.246] thr=2 paramiko.transport: File "/Users/root/Library/Python/2.7/lib/python/site-packages/paramiko/transport.py", line 1805, in run
ERR [20181011-11:15:10.246] thr=2 paramiko.transport: self._check_banner()
ERR [20181011-11:15:10.246] thr=2 paramiko.transport: File "/Users/root/Library/Python/2.7/lib/python/site-packages/paramiko/transport.py", line 1957, in _check_banner
ERR [20181011-11:15:10.246] thr=2 paramiko.transport: 'Error reading SSH protocol banner' + str(e)
ERR [20181011-11:15:10.246] thr=2 paramiko.transport: SSHException: Error reading SSH protocol banner
ERR [20181011-11:15:10.246] thr=2 paramiko.transport:
Вы не можете заставить Paramiko использовать oursshbinary
как реализацию SSH. Вы даже не можете использовать ssh
.
Парамико - это сам ssh
.
Это же (как вы знаете сейчас), как будто вы хотели использовать ssh
oursshbinary
(это не имеет смысла). Вы должны заставить Paramiko сделать то, что делает oursshbinary
. Но мы не знаем, что делает oursshbinary
, по сравнению с ssh
.
Ответ на предыдущую версию вашего вопроса:
-S
клиента OpenSSH ssh
создает совместное использование соединений, которое может быть повторно использовано другими экземплярами ssh
или других инструментов OpenSSH (например, sftp
).
Парамико не поддерживает соединение. Для этого нет смысла делать это.
Совместное использование имеет смысл для инструментов/приложений. Один экземпляр инструмента создает соединение, а другие экземпляры одного и того же или другого инструмента могут повторно использовать соединение.
Но вам это не нужно в скрипте/при программировании. У вас есть экземпляр сеанса SSH. Вы можете использовать его для нескольких целей на протяжении всего скрипта/программы. Другими словами, вы можете поделиться своим экземпляром.
В частности, с SSH, совместное использование OpenSSH открывает отдельный SSH-канал для клиента совместного доступа. С помощью Paramiko вы можете открывать несколько разделенных каналов по одному и тому же соединению SSH. Вот как это делают методы Transport.open_sftp_client
(или SSHClient.open_sftp
), Transport.open_session
(SSHClient.invoke_shell
, SSHClient.exec_command
). Все они внутренне называют Transport.open_channel
. Вы можете вызывать все это столько раз, сколько вам нужно, для одного сеанса SSH.