Python SSH with Paramiko

 

We have exercised SSH by using the command line program in order to access a remote Linux server.

Now, we further explore doing so via programmatic means in Python.

Check out .

It provides a comprehensive wrapper for doing things over SSH such as uploading and download files (via SCP) as well as executing remote commands.  It references this .  However, it is not as “conda friendly” as it should be and has a bug. 

Use the following instructions to successfully execute the code.

  1. clone the repository and change directory into it
    $ git clone
    $ cd paramiko-tutorial
  2. Add this file to the repository
  3. Create and activate your environment (if you already have a comp835 env, update the name in the yml file accordingly) $ conda env create -f environment.yml
    $ conda activate comp835
  4. Add a .env file to the root directory which looks like the following with your respective environment variables replaced: REMOTE_HOST=3.90.20.34
    REMOTE_USERNAME=unhusernamelogin
    REMOTE_PASSWORD=
    SSH_KEY_FILEPATH=/Path/To/Comp835/Private/Key/comp835s21m1
    REMOTE_PATH=/home/unhusernamelogin
  5. Replace this snippet from paramiko_tutorial/__init__.py      remote.execute_commands(
             [
                “cd /var/www/ && ls”,
                “tail /var/log/nginx/access.log”,
                “ps aux | grep node”,
                “cd /uploads/ && ls”,
             ]
         )
    with simply this: remote.execute_commands(
             [
                “ls -l”,
             ]
         )
  6. Then replace line 106 in paramiko_tutorial/client.py.  From: stdin, stdout, stderr = self.client.exec_command(cmd)
    to stdin, stdout, stderr = self.connection.exec_command(cmd)
  7. And then execute the main python main.py

If needed, use a “git status” and “git diff” to confirm your changes.  Note that the .gitignore will ignore the .env. 
It should look like this:

(comp835) Tims-MacBook-Pro:paramiko-tutorial proftim$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   paramiko_tutorial/__init__.py
    modified:   paramiko_tutorial/client.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    environment.yml

For your submission, provide the git diff output as well as the output from successfully having run the code in a rich text document (rtf file format). 

Attempt 1Comments