How to execute a script remotely in Python using SSH?

Jack picture Jack · Jan 9, 2012 · Viewed 31.7k times · Source
def execute(self,command):
            to_exec = self.transport.open_session()
            to_exec.exec_command(command)
            print 'Command executed'
connection.execute("install.sh")

When I check the remote system, I found the script didn't run. Any clue?

Answer

aculich picture aculich · Jan 10, 2012

The code below will do what you want and you can adapt it to your execute function:

from paramiko import SSHClient
host="hostname"
user="username"
client = SSHClient()
client.load_system_host_keys()
client.connect(host, username=user)
stdin, stdout, stderr = client.exec_command('./install.sh')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()

Note, though, that commands will default to your $HOME directory, so you'll either need to have install.sh in your $PATH or (most likely) you'll need to cd to the directory that contains the install.sh script.

You can check your default path with:

stdin, stdout, stderr = client.exec_command('getconf PATH')
print "PATH: ", stdout.readlines()

However, if it is not in your path you can cd and execute the script like this:

stdin, stdout, stderr = client.exec_command('(cd /path/to/files; ./install.sh)')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()

If the script is not in your$PATH you'll need to use ./install.sh instead of install.sh, just like you would if you were on the command line.

If you are still having problems after everything above it might also be good to check the permissions of the install.sh file, too:

stdin, stdout, stderr = client.exec_command('ls -la install.sh')
print "permissions: ", stdout.readlines()