Synchronisation de threads dans python
Bonjour,
Je suis actuellement en train de développer un script python qui me permet d'éxécuter via SSH des commandes sur des machines à distance.
La classe que j'utilise pour la connexion SSH est très proche de celle qu'il y a sur ce site : https://daanlenaerts.com/blog/2016/0...aramiko-shell/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import threading, paramiko
class ssh:
shell = None
client = None
transport = None
def __init__(self, address, username, password):
print("Connecting to server on ip", str(address) + ".")
self.client = paramiko.client.SSHClient()
self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
self.client.connect(address, username=username, password=password, look_for_keys=False)
self.transport = paramiko.Transport((address, 22))
self.transport.connect(username=username, password=password)
thread = threading.Thread(target=self.process)
thread.daemon = True
thread.start()
def closeConnection(self):
if(self.client != None):
self.client.close()
self.transport.close()
def openShell(self):
self.shell = self.client.invoke_shell()
def sendShell(self, command):
if(self.shell):
self.shell.send(command + "\n")
else:
print("Shell not opened.")
def process(self):
global connection
while True:
# Print data when available
if self.shell != None and self.shell.recv_ready():
alldata = self.shell.recv(1024)
while self.shell.recv_ready():
alldata += self.shell.recv(1024)
strdata = str(alldata, "utf8")
strdata.replace('\r', '')
print(strdata, end = "")
if(strdata.endswith("$ ")):
print("\n$ ", end = "")
sshUsername = "SSH USERNAME"
sshPassword = "SSH PASSWORD"
sshServer = "SSH SERVER ADDRESS"
connection = ssh(sshServer, sshUsername, sshPassword)
connection.openShell()
while True:
command = input('$ ')
if command.startswith(" "):
command = command[1:]
connection.sendShell(command) |
J'aimerais que l'éxécution de mes commande soit séquentielle c'est à dire qu'avant d'éxécuter la commande suivante, on attende que celle en cours soit terminée.
Pour cela j'avais pensé à utiliser un mutex. Je prend le mutex à l'émission de la commande (dans ma "boucle" principale) , et j'attends la réception d'un pattern particulié qui signifie la fin de ma commande (genre "root >") et de libérer le mutex à ce moment la, afin que la boucle principale puisse passer à la commande suivante.
Cependant ca ne fonctionne pas. Soit mon programme se bloque au bout de la deuxième commande, soit il exécute toutes mes commandes d'un coup (sans forcémment laisser à une commande le temps de se finir).
Je ne suis également pas très fan de la solution du shell interactif que j'utilse, mais c'est la seule que j'ai trouvé qui me garde l'environnement comme je veux (comme si j'étais moi même sur le shell en fait)
Bref si quelqu'un a une idée je suis preneur :)