Paramiko is a powerful Python library that allows developers to establish secure connections and execute commands on remote machines. This makes it a popular choice for automating tasks and managing servers. In this article, we will explore how to use Paramiko to run interactive commands on remote machines.
To get started, we first need to install Paramiko using pip:
```
pip install paramiko
```
Once installed, we can import the necessary modules and create a client object:
```
import paramiko
client = paramiko.SSHClient()
```
Next, we need to establish a connection to the remote machine. This can be done by specifying the host, username, and password:
```
client.connect(hostname='example.com', username='admin', password='password')
```
We can also specify a port number if the server is listening on a non-default port:
```
client.connect(hostname='example.com', username='admin', password='password', port=2222)
```
Now that we have established a connection, we can execute commands on the remote machine. Paramiko provides a method called `exec_command()` which takes in the command as an argument and returns three objects: the standard input, standard output, and standard error.
Let's try executing the `ls` command on the remote machine and print out the results:
```
stdin, stdout, stderr = client.exec_command('ls')
for line in stdout.readlines():
print(line.strip())
```
This will print out the list of files and directories in the current directory on the remote machine. We can also execute multiple commands by passing them as a single string separated by a semicolon:
```
stdin, stdout, stderr = client.exec_command('pwd; ls')
for line in stdout.readlines():
print(line.strip())
```
In addition to executing commands, Paramiko also allows us to interact with the remote machine in an interactive shell. This can be useful when we need to enter multiple commands or when the command requires user input.
To do this, we first need to create a channel using the `invoke_shell()` method:
```
channel = client.invoke_shell()
```
We can then use the `send()` method to send commands to the remote machine and the `recv()` method to receive the output:
```
channel.send('cd documents\r')
channel.send('ls\r')
while not channel.recv_ready():
continue
output = channel.recv(1024)
print(output.decode())
```
Here, we are changing the directory to "documents" and then listing the files in that directory. Notice that we are using the `send()` method to send the commands and the `recv()` method to receive the output. We also need to add carriage return (`\r`) at the end of each command to simulate pressing the enter key.
Finally, to close the connection, we can use the `close()` method:
```
client.close()
```
In conclusion, Paramiko is a powerful library that allows developers to run interactive commands on remote machines. With its easy-to-use methods, we can establish secure connections and automate tasks on remote servers. So next time you need to manage a server or automate a task, give Paramiko a try!