pythonpython-3.xsshexpectparamiko

I am having trouble running a command on a remote host in Python


I need to run a command on a remote host from a Python 3 script. I have tried several methods, but I cannot get any of them working. I tried using paramiko but pip fails when attempting to load the bcrypt module from the cryptography library. Apparently there is a missing equals sign according to the Python exception when running pip3 install paramiko.

I tried using pxssh from pexpect, but it raises an exception when I try to login saying it cannot establish a connection to the host. It does this whether I try the remote host or localhost

#! /usr/bin/python3

from pexpect import pxssh
ssh = pxssh.pxssh()

if not ssh.login("192.168.1.34", "xxxxxxx", "yyyyyyyy"):
    print("Failed")

I tried the following code:

#! /usr/bin/python3

import time, subprocess, sys

IP = "192.168.1.34"

with open ("/var/run/thermostat/insideT", "r") as infile:
    Temp = float(infile.read())    # Get inside temperature
if Temp > 75:
    TString = IP + '"/usr/bin/gpio write 0 1"\n
    subprocess.run(["ssh", TString])

But I get an error from ssh saying it cannot resolve the hostname 192.168.1.34. I have tried several different variations on the subprocess call.

ssh: Could not resolve hostname 192.168.1.34 : Name or service not known

ssh 192.168.1.34 "gpio write 0 1" works just fine.

Another way to handle this would be to read the value of the /var/run/thermostat/insideT on the local system from the remote system if that would be easier. I can run the script from either system.

Both hosts are Raspberry Pi systems running a recent version of Raspberry Pi OS. Note I have a passwordless login enabled for ssh between the systems.


Solution

  • I finally got it to work by eliminating some of the white space like this:

    subprocess.run(["ssh", IP, "/usr/bin/gpio", "write 0 1"])

    I still do not quite understand why ssh was complaining, rather than bash.