脚本捕获屏幕上的所有内容

时间:2016-02-25 09:54:03

标签: python linux scripting automation recording

所以我有这个python3脚本为我做了很多自动化测试,运行大约需要20分钟,并且需要一些用户交互。它还使用paramiko ssh到远程主机进行单独测试。

最后,我想把这个脚本交给我的团队的其他成员,但是它缺少一个功能:证据收集!

我需要将终端上显示的所有内容捕获到文件中。我一直在试验Linux命令'script'。但是,我找不到启动脚本和执行脚本的自动方法。

我在/ usr / bin /

中有一个命令
script log_name;python3.5 /home/centos/scripts/test.py

当我运行我的命令时,它就会失速。任何帮助将不胜感激!

谢谢:)

3 个答案:

答案 0 :(得分:2)

是否将输出重定向到您需要的文件?

python3.5 /home/centos/scripts/test.py > output.log 2>&1

或者,如果您想将输出保留在终端上并将其保存到文件中:

python3.5 /home/centos/scripts/test.py 2>&1 | tee output.log

答案 1 :(得分:2)

我需要这样做,最后得到一个结合pexpectttyrec的解决方案。

ttyrec生成可以使用几个不同的播放器应用程序播放的输出文件 - 我使用TermTVIPBT

如果内存服务,我必须使用pexpect来启动ttyrec(以及我的测试的其他命令),因为我使用Jenkins来安排测试的执行,而pexpect似乎是获得工作交互的最简单方法詹金斯工作中的贝壳。

在你的情况下,你可能只能使用ttyrec,并跳过pexpect步骤 - 尝试运行ttyrec文档中提到的ttyrec -e command

最后,关于交互式shell的主题,有一个名为“empty”的pexpect替代方案,我也取得了一些成功 - 请参阅http://empty.sourceforge.net/。如果您正在运行Ubuntu或Debian,则可以使用apt-get install empty-expect

安装空

答案 2 :(得分:1)

我实际上设法在python3中做了很多工作,但这里是python解决方案:

def record_log(output):
try:
    with open(LOG_RUN_OUTPUT, 'a') as file:
        file.write(output)
except:
    with open(LOG_RUN_OUTPUT, 'w') as file:
        file.write(output)


def execute(cmd, store=True):
proc = Popen(cmd.encode("utf8"), shell=True, stdout=PIPE, stderr=PIPE)
output = "\n".join((out.decode()for out in proc.communicate()))
template = '''Command:\n====================\n%s\nResult:\n====================\n%s'''
output = template % (cmd, output)
print(output)
if store:
    record_log(output)
return output


# SSH function
def ssh_connect(start_message, host_id, user_name, key, stage_commands):
print(start_message)
try:
    ssh.connect(hostname=host_id, username=user_name, key_filename=key, timeout=120)
except:
    print("Failed to connect to " + host_id)
for command in stage_commands:
    try:
        ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command)
    except:
        input("Paused, because " + command + " failed to run.\n  Please verify and press enter to continue.")
    else:
        template = '''Command:\n====================\n%s\nResult:\n====================\n%s'''
        output = ssh_stderr.read() + ssh_stdout.read()
        output = template % (command, output)
        record_log(output)
        print(output)