我想在Linux目标机器(具有python解释器)上运行一个名为test.py
的python脚本,并使用invoke.py
模块将命令的输出捕获到文本文件中,作为另一个python脚本paramiko
的一部分。
脚本中的语句stdin, stdout, sterr = ssh.exec_command("python invoke.py > log.txt")
生成一个空白文件log.txt。
请提出更正/替代方法。将输出正确地写入文件。
在本地运行时,test.py
输出合理的文本(预计将记录在log.txt中)。
有一些相关的文章here和here,但是没有人处理python脚本的输出
最佳答案
除了调用client.exec_command()之外,还可以使用client.open_channel()并使用通道 session 的recv()和recv_stderr()流来读取写stdout/std err:
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()
希望这个功能全面的功能对您有所帮助