在python脚本中隐藏os.system命令行调用

时间:2014-07-14 19:27:45

标签: python os.system

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

python myscript.py

在我的脚本中,我正在使用系统调用,例如:

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

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

3 个答案:

答案 0 :(得分:0)

您可以使用子进程管道而不是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)。

答案 1 :(得分:0)

使用子进程模块创建子进程,这样除非直接从PIPE读取,否则不会看到进程的任何输出。

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

答案 2 :(得分:0)

你的意思是,你能隐瞒这个命令出现在ps,top和其他类似工具中吗?否。

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

$0 = 'new program name';

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