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

在python脚本中隐藏os.system命令行调用,python,os.system,Python,Os.system,我有一个在linux服务器上运行的python脚本(myscript.py),如下所示: python myscript.py 在我的脚本中,我使用系统调用,示例如下: os.system("./myprogram.pl -x 5 > results.out") 每当有os.system调用时,我在服务器上运行myscript.py时,服务器上就会看到命令调用。有没有办法隐藏所有的命令调用,以便在程序中调用时不显示它们(myscript.py)?(这不是关于在程序中隐藏命令调用产生的输出

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

python myscript.py

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

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

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

您可以使用子流程管道而不是os.system命令:

import subprocess;

NewPipeObject = subprocess.Popen( [ './myprogram.pl -x 5 > results.out' ],
                                  stdout= subprocess.PIPE,
                                  stderr= subprocess.PIPE );
或者,您可以利用子流程管道参数的列表格式(它在每个列表元素之间添加了一个空格),并将它们表示为以下内容(这将更易于概括):


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

使用子流程模块创建子流程,这样您就不会看到来自流程的任何输出,除非您直接从管道读取

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

你的意思是,你能隐藏命令,不让它出现在ps、top和其他类似的工具中吗?没有

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

$0 = 'new program name';

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

为什么需要这样做?好奇的人想知道!您可以覆盖sys.\uu stdout\uuuu或其他类似的攻击,但我认为更好的解决方案是使用子流程模块,甚至使用类似invoke的库。啊,我怀疑您的意思是命令的stdout是可见的。我一度认为您想从操作系统进程列表中隐藏进程。这还不清楚。服务器被很多人使用,我想把我的工作保密,这包括我使用的工具。@MartijnPieters-事实上,我认为他确实想对流程命令行保密。你实际上不能传递
['./myprogram.pl-x 5>results.out']使用
shell=False
时,将
转换为
Popen
,这是
Popen
的默认值。您必须将其作为列表传递:
Popen(['./myprogram.pl','-x',5'])
。将stdout重定向到
results.out
,然后将使用
stdout
关键字参数完成,因为将'>'用于stdout重定向是一个仅支持shell的功能。另一个选项是使用
shell=True
,在这种情况下,您将以字符串形式传递完整的命令。
$0 = 'new program name';