web-dev-qa-db-ja.com

Pythonを使用してsshでコマンドを実行します

Pythonでいくつかのコマンドラインコマンドを自動化するスクリプトを書いています。現時点では、こうして電話をしています:

cmd = "some unix command"
retcode = subprocess.call(cmd,Shell=True)

ただし、リモートマシンでいくつかのコマンドを実行する必要があります。手動で、sshを使用してログインし、コマンドを実行します。 Pythonでこれをどのように自動化しますか?リモートマシンに(既知の)パスワードでログインする必要があるため、cmd = ssh user@remotehostを使用することはできません。使用するモジュールがあるかどうか疑問に思っていますか?

105
fredley

paramiko を紹介します

この質問 を参照してください

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd_to_execute)
161
shahjapan

または、単に commands.getstatusoutput を使用できます。

   commands.getstatusoutput("ssh machine 1 'your script'")

私はそれを広範囲に使用し、うまく機能します。

Python 2.6+では、 subprocess.check_output を使用します。

44
powerrox

Fabric を見ましたか? Pythonを使用して、SSH経由であらゆる種類のリモート処理を実行できます。

26
supersighs

Paramikoが少し低すぎることがわかり、Fabricはライブラリとして使用するのに特に適していないので、paramikoを使用して少し優れたものを実装する spur という独自のライブラリをまとめましたインタフェース:

import spur

Shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = Shell.run(["echo", "-n", "hello"])
print result.output # prints hello

シェル内で実行する必要がある場合:

Shell.run(["sh", "-c", "echo -n hello"])
15

paramikoを使用してすべてが既に(推奨)されており、複数のコマンドを一度に実行できるようにするpythonコード(APIとも言う)を共有しています。

別のノードでコマンドを実行するには:Commands().run_cmd(Host_ip, list_of_commands)

1つのTODOが表示されます。いずれかのコマンドが実行に失敗した場合、実行を停止し続けます。その方法はわかりません。あなたの知識を共有してください

#!/usr/bin/python

import os
import sys
import select
import paramiko
import time


class Commands:
    def __init__(self, retry_time=0):
        self.retry_time = retry_time
        pass

    def run_cmd(self, Host_ip, cmd_list):
        i = 0
        while True:
        # print("Trying to connect to %s (%i/%i)" % (self.Host, i, self.retry_time))
        try:
            ssh = paramiko.SSHClient()
            ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(Host_ip)
            break
        except paramiko.AuthenticationException:
            print("Authentication failed when connecting to %s" % Host_ip)
            sys.exit(1)
        except:
            print("Could not SSH to %s, waiting for it to start" % Host_ip)
            i += 1
            time.sleep(2)

        # If we could not connect within time limit
        if i >= self.retry_time:
            print("Could not connect to %s. Giving up" % Host_ip)
            sys.exit(1)
        # After connection is successful
        # Send the command
        for command in cmd_list:
            # print command
            print "> " + command
            # execute commands
            stdin, stdout, stderr = ssh.exec_command(command)
            # TODO() : if an error is thrown, stop further rules and revert back changes
            # Wait for the command to terminate
            while not stdout.channel.exit_status_ready():
                # Only print data if there is data to read in the channel
                if stdout.channel.recv_ready():
                    rl, wl, xl = select.select([ stdout.channel ], [ ], [ ], 0.0)
                    if len(rl) > 0:
                        tmp = stdout.channel.recv(1024)
                        output = tmp.decode()
                        print output

        # Close SSH connection
        ssh.close()
        return

def main(args=None):
    if args is None:
        print "arguments expected"
    else:
        # args = {'<ip_address>', <list_of_commands>}
        mytest = Commands()
        mytest.run_cmd(Host_ip=args[0], cmd_list=args[1])
    return


if __== "__main__":
    main(sys.argv[1:])

ありがとうございました!

6
IAmSurajBobade

paramiko a bunch(Nice)and pxssh (nice)も使用しました。どちらかをお勧めします。動作は少し異なりますが、使用方法が比較的大きく重複しています。

4
Eric Snow
#Reading the Host,username,password,port from Excel file
import paramiko 
import xlrd

ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())

loc = ('/Users/harshgow/Documents/PYTHON_WORK/labcred.xlsx')
wo = xlrd.open_workbook(loc)
sheet = wo.sheet_by_index(0)
Host = sheet.cell_value(0,1)
Port = int(sheet.cell_value(3,1))
User = sheet.cell_value(1,1)
Pass = sheet.cell_value(2,1)

def details(Host,Port,User,Pass):
    ssh.connect(Host, Port, User, Pass)
    print('connected to ip ',Host)
    stdin, stdout, stderr = ssh.exec_command("")
    stdin.write('xcommand SystemUnit Boot Action: Restart\n')
    print('success')

details(Host,Port,User,Pass)
1
Harshan Gowda

完璧に機能します...

import paramiko
import time

ssh = paramiko.SSHClient()
#ssh.load_system_Host_keys()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.106.104.24', port=22, username='admin', password='')

time.sleep(5)
print('connected')
stdin, stdout, stderr = ssh.exec_command(" ")

def execute():
       stdin.write('xcommand SystemUnit Boot Action: Restart\n')
       print('success')

execute()
0
Harshan Gowda

paramiko本当に重要な行(行3)を追加した後、最終的に私のために働きました:

import paramiko

p = paramiko.SSHClient()
p.set_missing_Host_key_policy(paramiko.AutoAddPolicy())   # This script doesn't work for me unless this line is added!
p.connect("server", port=22, username="username", password="password")
stdin, stdout, stderr = p.exec_command("your command")
opt = stdout.readlines()
opt = "".join(opt)
print(opt)

Paramikoパッケージがインストールされていることを確認してください。ソリューションの元のソース: ソース

0

複雑にしないでおく。ライブラリは必要ありません。

import subprocess

subprocess.Popen("ssh {user}@{Host} {cmd}".format(user=user, Host=host, cmd='ls -l'), Shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
0
Ronn Macc

spurplusをご覧ください。これはspurを中心に開発したラッパーで、型注釈といくつかの小さな仕掛けを提供します(SFTPの再接続、md5etc。): https://pypi.org/project/spurplus/

0
marko.ristin