【问题标题】:Hide os.system command line call in python script在 python 脚本中隐藏 os.system 命令行调用
【发布时间】:2014-09-04 19:52:18
【问题描述】:

我有一个在 linux 服务器上运行的 python 脚本 (myscript.py),如下所示:

python myscript.py

在我的脚本中,我使用的是系统调用,示例如下:

os.system("./myprogram.pl -x 5 > results.out")

每当有os.system 调用时,当我在服务器上运行 myscript.py 时,命令调用在服务器上可见。有没有办法隐藏所有命令调用,以便在程序中调用它们时不显示它们(myscript.py)? (这不是隐藏导致程序内命令调用的输出)

【问题讨论】:

  • 那为什么需要呢?好奇的人想知道!
  • 你可以覆盖 sys.__stdout__ 或其他类似的黑客,但我认为更好的解决方案是使用 subprocess 模块 - 甚至是像调用这样的库。
  • 啊,我怀疑你的意思是 命令的标准输出 是可见的。我一度以为您想从操作系统进程列表中隐藏该进程。不清楚。
  • 服务器被很多人使用,我想保持我的工作隐私,这包括我使用的工具。
  • @MartijnPieters - 实际上,我认为他确实想对进程命令行保密。

标签: python os.system


【解决方案1】:

您可以使用子进程管道代替 os.system 命令:

import subprocess;

NewPipeObject = subprocess.Popen( [ './myprogram.pl -x 5 > results.out' ],
                                  stdout= subprocess.PIPE,
                                  stderr= subprocess.PIPE );

或者您可以利用子流程管道参数的列表格式(它在每个列表元素之间添加一个空格)并将它们呈现为如下(这将更容易概括):

import subprocess;

NewPipeObject = subprocess.Popen( [ './myprogram.pl',
                                    '-x',
                                    '5',
                                    '>',
                                    'results.out' ],
                                  stdout= subprocess.PIPE,
                                  stderr= subprocess.PIPE );

无论哪种方式,您都将来自 stdoutstderr 的输出抑制到管道对象 (NewPipeObject) 中。

【讨论】:

  • 在使用shell=False时,实际上不能将[ './myprogram.pl -x 5 > results.out' ]传递给Popen,这是Popen的默认值。您必须将每个它作为列表传递:Popen(['./myprogram.pl', '-x', '5'])。然后将使用 stdout 关键字参数将 stdout 重定向到 results.out,因为使用 '>' 进行 stdout 重定向是 shell-only 功能。另一种选择是使用shell=True,在这种情况下,您可以将完整的命令作为字符串传递。
【解决方案2】:

使用 subprocess 模块创建一个子流程,这样您就不会看到该流程的任何输出,除非您直接从 PIPE 中读取。

process = subprocess.Popen(['perl', 'myprogram.pl'], stdout = subprocess.PIPE )

【讨论】:

    【解决方案3】:

    你的意思是,你能隐藏命令在 ps、top 和其他此类工具中显示吗?没有。

    在某些系统上,myprogram.pl 本身可以隐藏其命令行,使其不出现在 ps 中;例如在 perl 中:

    $0 = 'new program name';
    

    编辑 ps 条目而不是删除它。由于它是由新进程设置的,因此存在竞争条件,有人可能会在更改之前看到它;并且有可能(超级用户当然可以)以其他方式获得相同的信息。没有安全的方法,也没有打算完全对其他用户隐藏您的命令行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2013-09-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 2013-05-25
      相关资源
      最近更新 更多