How to execute a script remotely in Python using SSH?

Posted on

Question :

How to execute a script remotely in Python using SSH?
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?

Asked By: Jack

||

Answer #1:

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()
Answered By: aculich

Answer #2:

ssh = paramiko.client.SSHClient()
ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
ssh.connect(hostname=host, username=username, password = password)
chan = ssh.invoke_shell()

def run_cmd(cmd):    
    print('='*30)
    print('[CMD]', cmd)
    chan.send(cmd + 'n')
    time.sleep(2)
    buff = ''
    while chan.recv_ready():
        print('Reading buffer')
        resp = chan.recv(9999)
        buff = resp.decode()
        print(resp.decode())

        if 'password' in buff:
            time.sleep(1)
            chan.send(password + 'n')        
        time.sleep(2)

    print('Command was successful: ' + cmd)
Answered By: tnusraddinov

Answer #3:

subprocess.Popen('ssh thehost install.sh')

See the subprocess module.

Answered By: Matt Joiner

Leave a Reply

Your email address will not be published. Required fields are marked *