Pythonでいくつかのコマンドラインコマンドを自動化するスクリプトを書いています。現時点では、こうして電話をしています:
cmd = "some unix command"
retcode = subprocess.call(cmd,Shell=True)
ただし、リモートマシンでいくつかのコマンドを実行する必要があります。手動で、sshを使用してログインし、コマンドを実行します。 Pythonでこれをどのように自動化しますか?リモートマシンに(既知の)パスワードでログインする必要があるため、cmd = ssh user@remotehost
を使用することはできません。使用するモジュールがあるかどうか疑問に思っていますか?
または、単に commands.getstatusoutput を使用できます。
commands.getstatusoutput("ssh machine 1 'your script'")
私はそれを広範囲に使用し、うまく機能します。
Python 2.6+では、 subprocess.check_output
を使用します。
Fabric を見ましたか? Pythonを使用して、SSH経由であらゆる種類のリモート処理を実行できます。
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"])
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:])
ありがとうございました!
#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)
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()
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パッケージがインストールされていることを確認してください。ソリューションの元のソース: ソース
複雑にしないでおく。ライブラリは必要ありません。
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()
spurplus
をご覧ください。これはspur
を中心に開発したラッパーで、型注釈といくつかの小さな仕掛けを提供します(SFTPの再接続、md5etc。): https://pypi.org/project/spurplus/