Gambas France BETA


Pas de compte ? Incription

gb.sshclient

À propos de ce code

Voici la derniere version de gb.sshclient mis a jour le 13/04/2014 pour Gambas3

gb.sshclient est un composant permettant d'offrir une partie des possibilités des commandes SSH directement dans Gambas3.
Ce composant est écrit en gambas3 (gambas3-3.4 minimum) et manipule directement une librairie Linux nommée: libssh

Cette librairie peut être présent sur votre distribution Linux ou alors récupéré à l'adresse suivante:

http://www.libssh.org/

J'ai préféré utiliser cette librairie pour développer ce composant car elle offre pratiquement toutes les possibilitées des librairies OpenSSH et est plus facile a manipuler. De plus la documentation et les exemples sont beaucoup plus clairs et simples.

Le composant est fonctionnel avec la librairie 'libssh' dans la version minimum suivante: v5.9 (derniere version disponible: libssh4-0.6.3-13.1)

Le package pour Redhat/Fedora/Suse est disponible sur le site web de la librairie. Dans le cas des distributions Debian/Ubuntu/LinuxMint, il suffit de convertir le package .rpm en format .deb a l'aide de la commande 'alien'.
Ex:
- Etre utilisateur 'root'
- Télécharger le package de la librairie au format .rpm
- Installer la commande 'alien' sur votre machine Debian
- Convertir le package .rpm en .deb
- # alien -d -c -k --fixperms libssh4-0.6.3-13.1.i686.rpm
- Installer le package généré
- # dpkg -i libssh4_0.6.3-13.1_i386.deb

Une fois installée sur votre distribution Linux, les fichier concernés sont les suivants:

/usr/lib/libssh.so.4
/usr/lib/libssh.so.4.4.1
/usr/lib/libssh_threads.so.4
/usr/lib/libssh_threads.so.4.4.1

L’intérêt de ce composant est de pouvoir se connecter a une machine distante en SSH et d'effectuer plusieurs opérations en une et seule connexion dont voici la liste:

Déja opérationnel:
- Exécuter une ou plusieurs commandes sur la machine distante et récupérer le résultat directement dans Gambas
- Lire un ou plusieurs fichiers sur la machine distante et visualiser le contenu directement dans Gambas
- Copier un ou plusieurs fichiers de la machine distante sur votre disque dur local avec le nom de fichier que vous souhaitez
- Copier un ou plusieurs fichiers du disque dur local vers la machine distante
- Créer des répertoires avec les droits (droits du répertoire) sur la machine distante
- Créer un fichier avec les droits (droits du fichier) sur la machine distante avec le contenu que l'on souhaite
- Possibilité de créer un fichier sur la machine distante avec le contenu que l'on souhaite

A faire:
- Possibilité de créer un tunnel SSH entre 2 machines.

A faire si c'est possible:
- Créer un composant pour 'sshServer' qui permettrait de créer un serveur SSH dans son projet Gambas ou pour permettre des Tunnels SSH entre 2 applications Gambas. Une utiliserait le composant 'sshClient' et l'autre le composant 'sshServer'

Exemples d'utilisation:
- Vous trouverez un exemple de chaque possibilité dans le projet lui même du composant.
- Charger le projet dans l'IDE de Gambas

Si vous rencontrez des difficultées d'utilisation:
Vous pouvez me contacter directement sur le Forum de la Forge si vous rencontrez de problèmes avec ce composant.

Implementation du composant dans vos projets:
Le composant peut être utilisé tel quel en tant que composant pour vos futures applications mais il est aussi possible d'incorporer directement la Classe sshClient dans
votre projet. Cela offre moins de souplesse mais fonctionnera de la même maniere.

Code source

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
' Gambas module file

'----------------------------------------------
' Exemple d'utilisation du composant SshClient
'----------------------------------------------

PUBLIC SSHConnection AS SshClient

'-----------------------------------------------------

PUBLIC SUB Main()

DIM ListeCmd AS NEW String[]
DIM Cmd AS STRING
DIM fichierDistant AS STRING
DIM fichierLocal AS STRING
DIM dirDistant AS STRING
DIM donneeFichierLocal AS STRING
DIM TimerStart AS FLOAT
DIM TimerStop AS FLOAT
DIM TimerDelay AS FLOAT
DIM ModeShellCisco AS BOOLEAN

' Dans le cas ou la connexion ssh se fait sur des equipments Cisco
' il faut utiliser un shell pty
ModeShellCisco = FALSE

PRINT "Paramétrage ssh"
PRINT "Setting ssh"

' Creation d'une nouveau connexion SSH
' Creation of a new SSH connection
SSHConnection = NEW SshClient AS "SSHConnection"

' Paramétrage de la connexion SSH
' Setting the SSH connection
SSHConnection.Hostname = "127.0.0.1"
SSHConnection.Port = 22
SSHConnection.User = "yourlogin"
SSHConnection.Password = "yourpassword"
SSHConnection.TimeoutConn = 10
SSHConnection.StrictHostKeyCheck = TRUE
SSHConnection.AllowSSH1 = TRUE
SSHConnection.AllowSSH2 = TRUE
SSHConnection.ActiveLog = FALSE

' Définition de la liste des commandes a executer
' Definition of the list of commands to execute on remote machine
ListeCmd.Add("ps -edf | grep X")
ListeCmd.Add("ls -ltr")
ListeCmd.Add("( cd /tmp ; ls -ltr ; pwd)")
ListeCmd.Add("df -h")

' Pour tester sur un Routeur/Switch Cisco
' For test on Cisco Router/Switch
'ListeCmd.Add(" show ip int brief")
'ListeCmd.Add(" show int status")
'ListeCmd.Add(" show vlan")
'ListeCmd.Add(" show ip arp")
'ListeCmd.Add(" show arp")
'ListeCmd.Add(" show ip route | inc S")
'ListeCmd.Add(" show cdp neighbors detail")


' Connection SSH a la machine distante
' SSH connection to the remote machine
IF SSHConnection.Connect() < 0 THEN
PRINT "Connexion echouée !"
PRINT "Connexion failed !"
ELSE
PRINT "Execution des commandes sur la machine distante."
PRINT "Execute commands on remote machine."
PRINT "-------------------------------------------------------------------------------------"

IF ModeShellCisco = FALSE THEN
' Mode d'execution de commande a distance par SSH
FOR EACH Cmd IN ListeCmd
PRINT "Mode: Execution de commande"
IF SSHConnection.ExecRemoteCmd(Cmd) < 0 THEN
PRINT "Execution de la commande '" & Cmd & "' échouée !"
PRINT "Execution of command '" & Cmd & "' failed !"
PRINT "Message: " & SSHConnection.MessageErreur
ELSE
PRINT "Data: " & SSHConnection.DataRemoteCmd
ENDIF

PRINT "-------------------------------------------------------------------------------------"
NEXT
ELSE
' Mode d'execution de commande dans un shell PTY
PRINT "Mode: Execution de commande shell PTY"
IF SSHConnection.ExecRemoteCmdPty(ListeCmd) < 0 THEN
PRINT "Execution liste de la commande '" & ListeCmd[0] & "' échouée !, etc..."
PRINT "Execution of command list'" & ListeCmd[0] & "' failed !, etc..."
PRINT "Message: " & SSHConnection.MessageErreur
ELSE
PRINT "Data: " & SSHConnection.DataRemoteCmd
ENDIF
END IF

PRINT "-------------------------------------------------------------------------------------"

' Affichage du contenu d'un fichier de la machine distante
' Display content of file of remote machine
fichierDistant = "/etc/hosts"
fichierLocal = "/tmp/hostsfile.sav"

PRINT "Lecture d'un fichier sur la machine distante: " & fichierDistant
PRINT "Reading a file on remote machine: " & fichierDistant

IF SSHConnection.ScpReadFile(fichierDistant) < 0 THEN
PRINT " -> Lecture du fichier distant échouée !"
PRINT " -> Reading of remote file failed !"
ELSE
PRINT "Data:\n" & SSHConnection.DataReadFile
PRINT " -> Lecture du fichier distant effectuée avec succès."
PRINT " -> Reading a remote file with success."
ENDIF

PRINT "-------------------------------------------------------------------------------------"

' Recuperation d 'un fichier de la machine distante vers local
' Retreiving a file on remote machine to local
PRINT "Récupération d'un fichier de la machine distante en local:"
PRINT "Retreiving a file on remote machine to local:"
PRINT " - Remote: " & fichierDistant
PRINT " - Local : " & fichierLocal

IF SSHConnection.ScpGetFile(fichierDistant, fichierLocal) < 0 THEN
PRINT " -> Récupération du fichier distant vers disque local échouée !"
PRINT " -> Retreiving remote file to local disk failed !"
ELSE
PRINT " -> Récupération du fichier distant vers disque local effectuée avec succès."
PRINT " -> Retreiving remote file to local disk executed with success."
ENDIF

PRINT "-------------------------------------------------------------------------------------"

'Envoi d'un fichier local vers la machine distante
' Sending a local file to the remote machine
fichierLocal = "/tmp/hostsfile.sav"
fichierDistant = "/tmp/hostsfile_remote.sav"

PRINT "Envoi d'un fichier local sur la machine distante: " & fichierLocal
PRINT "Sending a local file to the remote machine: " & fichierLocal
PRINT " - Local : " & fichierLocal
PRINT " - Remote: " & fichierDistant

IF SSHConnection.ScpPutFile(fichierLocal, fichierDistant) < 0 THEN
PRINT " -> Envoi du fichier local échouée !"
PRINT " -> Sending local file failed !"
ELSE
PRINT " -> Envoi du fichier local effectué avec succès."
PRINT " -> Sending local file with success."
ENDIF

PRINT "-------------------------------------------------------------------------------------"

' Création d'un repertoire sur la machine distante
' Creation of a directory on the remote machine
dirDistant = "/tmp/directory1"

PRINT "Création d'un repertoire sur la machine distante:"
PRINT "Creation of a directory on the remote machine:"
PRINT " - Directory: " & dirDistant

IF SSHConnection.ScpNewRemoteDir(dirDistant, "0755") < 0 THEN
PRINT " -> Création du répertoire sur la machine distante échouée !"
PRINT " -> Creation of the directory on remote machine failed !"
ELSE
PRINT " -> Création du répertoire sur la machine distante effectuée avec succès."
PRINT " -> Creation of the directory on remote machine with success."
ENDIF

PRINT "-------------------------------------------------------------------------------------"

' Création d'un nouveau fichier + data sur la machine distante
' Creation of a new file + data on the remote machine
fichierDistant = "/tmp/newfile1.txt"
fichierLocal = "/etc/hosts"

PRINT "Création d'un nouveau fichier + data sur la machine distante:"
PRINT "Creation of a new file + data on the remote machine:"
PRINT " - File: " & fichierDistant

TRY donneeFichierLocal = File.Load(fichierLocal)
IF ERROR THEN
PRINT "Lecture du contenu du fichier local impossible: " & fichierLocal
PRINT "Reading the content of local file impossible: " & fichierLocal
ELSE

IF SSHConnection.ScpNewRemoteFile(fichierDistant, donneeFichierLocal, "0644") < 0 THEN
PRINT " -> Création du nouveau fichier + data sur la machine distante échouée !"
PRINT " -> Creation of new file + data on remote machine failed !"
ELSE
PRINT " -> Création du nouveau fichier + data sur la machine distante effectuée avec succès."
PRINT " -> Creation of new file + data on remote machine with success."
ENDIF

END IF

PRINT "-------------------------------------------------------------------------------------"


TimerStop = Timer
TimerDelay = TimerStop - TimerStart

PRINT "Temps d'execution: " & Format$(TimerDelay, "0.000") & "sec)"
PRINT "Execution time: " & Format$(TimerDelay, "0.000") & "sec)"

END IF

' Fermeture de la connexion
SSHConnection.Disconnect()

PRINT "Fin de la connexion..."
PRINT "End of connection..."

END


PUBLIC SUB SSHConnection_ProgressGetFile(Pourcentage AS INTEGER)

' Evenement lorsque l'indice de progression de la copie d'un fichier distant vers local change
' Event when the progress index of the copy of a remote file to local change

PRINT "Progression GET fichier: " & Pourcentage & "%"
PRINT "Progress GET file: " & Pourcentage & "%"

END

PUBLIC SUB SSHConnection_ProgressPutFile(Pourcentage AS INTEGER)

' Evenement lorsque l'indice de progression de la copie d'un fichier local vers distant change
' Event when the progress index of the copy of a local file to remote change

PRINT "Progression PUT fichier: " & Pourcentage & "%"
PRINT "Progress PUT file: " & Pourcentage & "%"

END

PUBLIC SUB SSHConnection_sshError(MessageText AS STRING)

' Evenement lorsqu'une erreur apparait dans l'objet SshClient
' Event when an error appears in the SshClient object

PRINT "[SSH] " & MessageText

END

PUBLIC SUB SSHConnection_sshCmdRecieveData(sText AS STRING)

' Evenement: Données renvoyés par une commande executée a distance
' Event: Datas sended by the command executed on remote machine

'Print "[CMD] \n" & sText


END

Commentaires

Commentaire de cfb, Le 27/5/2015 à 01:45:27
Merci!!! :cheers: