Как выполнить скрипт удаленно в Python, используя SSH? - PullRequest
7 голосов
/ 09 января 2012
def execute(self,command):
            to_exec = self.transport.open_session()
            to_exec.exec_command(command)
            print 'Command executed'
connection.execute("install.sh")

Когда я проверял удаленную систему, я обнаружил, что скрипт не запускается.Любая подсказка?

Ответы [ 3 ]

17 голосов
/ 10 января 2012

Приведенный ниже код будет делать то, что вы хотите, и вы можете адаптировать его к вашей execute функции:

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()

Обратите внимание, что команды по умолчанию будут находиться в вашем каталоге $HOME, поэтому вы 'либо вам потребуется install.sh в вашем $PATH, либо (скорее всего) вам потребуется cd в каталог, содержащий скрипт install.sh.

Вы можете проверить путь по умолчанию с помощью:

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

Однако, если он не находится на вашем пути, вы можете cd и выполнить скрипт следующим образом:

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

Если скрипт не находится в вашем $PATHвам нужно будет использовать ./install.sh вместо install.sh, как если бы вы были в командной строке.

Если у вас все еще есть проблемы после всего вышеперечисленного, возможно, было бы также полезно проверитьправа доступа к файлу install.sh:

stdin, stdout, stderr = client.exec_command('ls -la install.sh')
print "permissions: ", stdout.readlines()
0 голосов
/ 26 марта 2018
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)
0 голосов
/ 09 января 2012
subprocess.Popen('ssh thehost install.sh')

См. Модуль subprocess.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...