我有一个python脚本(myscript.py),我在linux服务器上运行如下:
python myscript.py
在我的脚本中,我正在使用系统调用,例如:
os.system("./myprogram.pl -x 5 > results.out")
当我在os.system
调用时在服务器上运行myscript.py时,命令调用在服务器上可见。有没有办法隐藏所有命令调用,以便在程序中调用它们时不显示它们(myscript.py
)? (这不是关于隐藏输出导致程序中的命令调用)
答案 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 );
无论哪种方式,您都会将stdout
和stderr
的输出抑制为管道对象(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条目而不是删除它。由于它是由新流程设置的,因此存在竞争条件,有人可能会在更改之前看到它;并且有可能(当然可能超级用户)以其他方式获得相同的信息。没有安全的方法,也没有意图将你的命令行完全隐藏在其他用户之外。