@@ -13,7 +13,145 @@ pip3 install --user sshcontroller-oroques
13
13
Note that the package has been exclusively tested on Python 3+.
14
14
15
15
## Usage
16
- Incoming
16
+
17
+ The code snippets can also be found at [ demo.py] ( ./examples/demo.py ) .
18
+
19
+ #### 1. Create a new SSH controller from a SSH key
20
+ ``` python
21
+ import sshcontroller
22
+
23
+ HOST_IP = " 93.184.216.34" # an IPv4 or IPv6 address
24
+ KEY_PWD = " password"
25
+
26
+ ssh_controller = sshcontroller.SSHController(
27
+ host = HOST_IP ,
28
+ user = " olivier" ,
29
+ key_path = " ~/.ssh/id_rsa" , # if omitted, look in agent and in ~/.ssh
30
+ key_password = KEY_PWD , # optional
31
+ key_type = " rsa" , # rsa (default), dsa, ecdsa or ed25519
32
+ port = 22 , # 22 is the default
33
+ )
34
+ ```
35
+
36
+ #### 2. Connect to remote host
37
+ ``` python
38
+ ssh_controller.connect()
39
+ ```
40
+
41
+ #### 3. Run a command
42
+ ``` python
43
+ return_code, output = ssh_controller.run(
44
+ command = " echo 'Hello world!' > /tmp/hello.txt" ,
45
+ display = True , # display output, false by default
46
+ combine_stderr = False , # combine stderr and stdout, false by default
47
+ capture_output = True , # return output, false by default
48
+ timeout = 10 , # command timeout in seconds, 600s by default
49
+ )
50
+ logging.info(f " return code: { return_code} , output: { output} " )
51
+ ```
52
+
53
+ #### 4. Transfer data with SFTP
54
+ All functions from paramiko's ` SFTPClient ` are available through the
55
+ ` SSHController ` object. Check
56
+ [ paramiko's documentation] ( http://docs.paramiko.org/en/stable/api/sftp.html#paramiko.sftp_client.SFTPClient )
57
+ for a complete list.
58
+
59
+ In addition, the package adds new methods:
60
+ * ` exists(path) ` : check that a file or a directory exists on the remote host
61
+ * ` list_dirs(path) ` : return the list of directories present in ` path `
62
+ * ` list_dirs(path) ` : return the list of files present in ` path `
63
+
64
+ ``` python
65
+ print (f " hello.txt exists: { ssh_controller.exists(' /tmp/hello.txt' )} " )
66
+ print (f " bonjour.txt exists: { ssh_controller.exists(' /tmp/bonjour.txt' )} " )
67
+
68
+ ssh_controller.get(" /tmp/hello.txt" , " /tmp/bonjour.txt" )
69
+
70
+ with open (" /tmp/bonjour.txt" , ' r' ) as bonjour:
71
+ for line in bonjour:
72
+ print (line, end = ' ' )
73
+ ```
74
+
75
+ #### 5. Disconnect
76
+ ``` python
77
+ ssh_controller.disconnect()
78
+ ```
79
+
80
+ #### 6. Use SSH password instead
81
+ ``` python
82
+ import sshcontroller
83
+
84
+ HOST_IP = " 93.184.216.34" # an IPv4 or IPv6 address
85
+ SSH_PWD = " "
86
+
87
+ ssh_controller = sshcontroller.SSHController(
88
+ host = HOST_IP ,
89
+ user = " root" ,
90
+ ssh_password = SSH_PWD
91
+ )
92
+ ssh_controller.connect()
93
+ ```
94
+
95
+ #### 7. Run a command until an event is set
96
+ If the argument ` stop_event ` is set when calling ` run() ` , the controller waits
97
+ for the given event to be triggered before stopping. This is especially useful
98
+ when using threads.
99
+
100
+ The example below starts two threads with an event attached to each one:
101
+ one is pinging localhost, the other sleeps for 10s. When the sleeping threads
102
+ has finished, we trigger the events to also stop the pinging thread.
103
+
104
+ ``` python
105
+ import logging
106
+ import queue
107
+ import sshcontroller
108
+ import threading
109
+ import time
110
+
111
+ output = queue.Queue() # a queue to store the ping command output
112
+ stop_event_sleep = threading.Event()
113
+ stop_event_ping = threading.Event()
114
+
115
+ kwargs_sleep = {
116
+ " command" : " echo 'thread sleep: sleeping for 10s' && sleep 10s" ,
117
+ " display" : True ,
118
+ " stop_event" : stop_event_sleep,
119
+ }
120
+ kwargs_ping = {
121
+ " command" : " echo 'thread ping: starting ping' && ping localhost" ,
122
+ " display" : True ,
123
+ " capture_output" : True ,
124
+ " stop_event" : stop_event_ping,
125
+ }
126
+
127
+ # call run() and store the command output in the queue
128
+ def wrapper (kwargs ):
129
+ return output.put(ssh_controller.run(** kwargs))
130
+
131
+ thread_sleep = threading.Thread(
132
+ target = ssh_controller.run, name = " thread_sleep" , kwargs = kwargs_sleep)
133
+ thread_ping = threading.Thread(
134
+ target = wrapper, name = " thread_ping" , args = (kwargs_ping, ))
135
+
136
+ thread_ping.start()
137
+ thread_sleep.start()
138
+
139
+ try :
140
+ thread_sleep.join()
141
+ except KeyboardInterrupt :
142
+ logging.info(" KeyboardInterrupt" )
143
+ finally :
144
+ logging.info(" Stopping threads" )
145
+ stop_event_sleep.set()
146
+ stop_event_ping.set()
147
+ time.sleep(2 )
148
+
149
+ return_code, ping_output = output.get()
150
+ logging.info(f " thread ping return code: { return_code} " )
151
+ logging.info(f " thread ping output length: { len (ping_output)} " )
152
+
153
+ ssh_controller.disconnect()
154
+ ```
17
155
18
156
## License
19
157
[ GNU Lesser General Public License v2.1] ( LICENSE )
0 commit comments