【问题标题】:Find recently modified files and manipulate output查找最近修改的文件并操作输出
【发布时间】:2016-03-01 10:58:36
【问题描述】:

我的意图:

  1. 查找最近 2 天内修改过的文件。

  2. 获取每个文件的最后 500 行(因为应用程序日志文件很大)。

  3. 将每个尾部输出放入不同的文件中(因为我需要将其下载到远程机器上)。

然后我使用 Python Fabric 将这些文件从远程机器下载到本地机器。

我可以使用 :find /opt/tomcat/logs -mtime -2 -exec sudo tail -500 '{}' \; 完成 1 和 2

我能够使用以下方法执行 2 和 3: 'sudo tail -500 ' + filename + ' | sudo tee ' + logfilename + '_tail'

如何在 1 个命令中完成 1、2 和 3?

我需要在 1 个命令中使用它,因为我正在使用 Python sshcon.exec_command() 在远程机器上执行此操作。

【问题讨论】:

  • 编写一个shell脚本并从Python中调用它。
  • 我需要在多台服务器上进行上述操作...有什么比将shell脚本上传到每台服务器更简单的方法吗?

标签: python linux unix find tail


【解决方案1】:

编写一个 shell 脚本来实现您想要的最终结果。

然后使用 subprocess 模块运行它。

确保您在 subprocess.call() 时通过管道传输 shell 脚本

import subprocess
subprocess.call("sshpass -p pass ssh -o StrictHostKeyChecking=no \
               user@remote_server_ip  'bash -s' < your_script.sh ",shell=True)

假设您有一个脚本 test_script.sh,并且您想在三个服务器(1.2.3.4、1.2.3.5、1.2.3.6)上运行它。现在的方法应该是:

import subprocess
servers = [1.2.3.4, 1.2.3.5, 1.2.3.6]
for server in servers:
    subprocess.call("sshpass -p password ssh -o StrictHostKeyChecking=no \
           username@{0} 'bash -s' < test_script.sh ".format(server),shell=True)

如果您安装了sshpass,这将足以实现您的目标。

【讨论】:

  • 我需要在多台服务器上进行这种操作...有什么比将shell脚本上传到每台服务器更简单的方法吗?
  • 您不需要在我上面的方法中将shell脚本上传到每个服务器。你可以看到更新的答案。
  • call 的参数是单个命令;您最好将其标记为列表并丢失 icky shell=True
最近更新 更多