我想在Linux目标机器(具有python解释器)上运行python脚本test.py
,并在文本文件中捕获命令的输出,作为另一个python脚本{{1}的一部分使用invoke.py
模块。
脚本中的陈述
paramiko
生成空白文件log.txt。
请建议更正/替代方法来执行此操作。正确地将输出写入文件。
stdin, stdout, sterr = ssh.exec_command("python invoke.py > log.txt")
在本地运行时输出合理的文本(预计会记录在log.txt中)。
答案 0 :(得分:0)
而不是调用client.exec_command(),您可以使用client.open_channel()并使用通道会话的recv()和recv_stderr()流来读取写入stdout / std错误:
def sshExecute(hostname, username, password, command, logpath = None):
buffSize = 2048
port = 22
client = paramiko.Transport((hostname, port))
client.connect(username=username, password=password)
if logpath == None:
logpath = "./"
timestamp = int(time.time())
hostname_prefix = "host-%s-%s"%(hostname.replace(".","-"),timestamp)
stdout_data_filename = os.path.join(logpath,"%s.out"%(hostname_prefix))
stderr_data_filename = os.path.join(logpath,"%s.err"%(hostname_prefix))
stdout_data = open(stdout_data_filename,"w")
stderr_data = open(stderr_data_filename,"w")
sshSession = client.open_channel(kind='session')
sshSession.exec_command(command)
while True:
if sshSession.recv_ready():
stdout_data.write(sshSession.recv(buffSize))
if sshSession.recv_stderr_ready():
stderr_data.write(sshSession.recv_stderr(buffSize))
if sshSession.exit_status_ready():
break
stdout_data.close()
stderr_data.close()
sshSession.close()
client.close()
return sshSession.recv_exit_status()
希望这个完全有效的功能可以帮助你