Как автоматически войти на ssh-сервер с платформой Exscript?
Мне нужно войти на сервер SSH и выполнить несколько команд "ROS" в одном сеансе. Я искал фреймворк, который оставался на связи после первой команды, и единственный, кто преуспел, был фреймворк Exscript. Мой код прост, я выбираю имя пользователя, порт, клиент и адрес из XML-файла и регистрируюсь с этими учетными данными. Но я всегда получаю сообщение об ошибке " Отказано в подключении" или " Окончательно отключено", когда я использую класс Account для автоматического входа в систему (без запроса ввода ввода имени пользователя и пароля), как рекомендует Учебник Exscript. Однако, если я запускаю свой код, не пытаясь выполнить автоматический вход в систему, аналогично коду "Начало работы" и с теми же значениями из XML для входа в систему, все работает нормально. Может кто-нибудь помочь с этим, пожалуйста?
Obs: уже пробовал коды в этой теме, и ни один из этих кодов не работал (даже без использования XML)
# -*- coding: utf-8 -*-
from Exscript.util.start import start
from Exscript.util.interact import read_login
from Exscript import Host, Account
import Exscript
from Exscript.protocols import SSH2
try:
import xml.etree.cElementTree as et
except ImportError:
import xml.etree.ElementTree as et
# Reads the XML File
xmlFile = et.parse('environment.xml')
# Find the root element from the file (in this case "environment")
root = xmlFile.getroot()
address = root.findtext('TURTLEBOT_IP')
usernameClient = root.findtext('USERNAME')
passwordClient = root.findtext('PASSWORD')
portClient = root.findtext('PORT')
myIP = root.findtext('MY_IP')
masterIP = root.findtext('MASTER_IP')
rosMasterURI = root.findtext('ROS_MASTER_URI')
rosHostname = root.findtext('ROS_HOSTNAME')
rosNamespace = root.findtext('ROS_NAMESPACE')
address = root.findtext('TURTLEBOT_IP')
usernameClient = root.findtext('USERNAME')
passwordClient = root.findtext('PASSWORD')
portClient = root.findtext('PORT')
perspectiveLocation = root.findtext('PERSPECTIVE_LOCATION')
rosSource = root.findtext("ROS_SOURCE")
rosEtc = root.findtext('ROS_ETC_DIRECTORY')
rosRoot = root.findtext('ROS_ROOT')
exportIP = str('ROS_IP='+myIP)
exportMasterIP = str('MASTER_IP='+myIP)
exportMasterIPURI = str('export ROS_MASTER_URI=http://$MASTER_IP:11311/')
exportRosIP = str('export ROS_IP=$MY_IP')
exportHostname = str('export ROS_HOSTNAME_IP=$MY_IP')
exportNamespace = str('export ROS_NAMESPACE='+rosNamespace)
print(exportMasterIP)
print(exportRosIP)
print(exportHostname)
print(exportNamespace)
# print(address)
accountLogin = [Account(usernameClient, passwordClient)]
conn = SSH2()
host1 = Host(address)
host1.set_account(accountLogin)
conn.connect(address)
def cmd(job, host, conn):
conn.execute(str(exportIP+'\n'+exportMasterIP+'\n'+exportMasterIPURI+'\n'+
exportRosIP+'\n'+exportHostname+'\n'+exportNamespace))
conn.execute('roscore')
conn.execute('roslaunch turtlebot_bringup minimal.launch')
conn.execute('roslaunch turtlebot_teleop keyboard_teleop.launch')
conn.execute()
start(accountLogin, host1, cmd, max_threads=2)
# conn.send('quit\r')
# conn.close()