shell 隐藏操作系统产生的控制台输出

rryofs0p  于 2023-02-13  发布在  Shell
关注(0)|答案(5)|浏览(342)

我正在调用这段代码,但它在我运行python脚本的控制台中产生了一些输出(由于tee命令):

os.system("echo 3 | sudo tee /proc/sys/vm/drop_caches")

此版本不生成控制台输出,但是否有其他方法?

os.system('sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"')
vybvopom

vybvopom1#

要以最"通用"的形式根据标题回答问题:
要**抑制 * 所有 * os.system()**的输出,请将>/dev/null 2>&1附加到shell命令,这将同时禁用stdout和stderr;例如:

import os
os.system('echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null 2>&1')

注意,os.system()在设计上将调用进程的stdout和stderr流的输出 * 通过 * 传递到控制台(终端)--Python代码永远看不到它们。
此外,如果shell命令失败,os.system()不会引发异常,而是返回一个退出代码;注意,提取shell命令的真正退出代码需要额外的工作:您需要通过应用>> 8从返回的16位值中提取高位字节(尽管您可以依赖0以外的返回值,该值暗示错误条件)。
考虑到os.system()的上述限制,通常值得使用subprocess模块中的函数
例如,subprocess.check_output()可以按如下方式使用:

import subprocess
subprocess.check_output('echo 3 | sudo tee /proc/sys/vm/drop_caches', shell=True)

上述机构将:

  • 捕获 * stdout * 输出并将其返回(在上例中忽略返回值)
  • 通过 * stderr * 输出;传递stderr=subprocess.STDOUT作为附加参数也将捕获stderr。
  • 如果shell命令失败,则引发错误。

注意:Python 3.5引入了subprocess.run(),它是os.system()subprocess.check_output()的更灵活的继承者-请参见www.example.comhttps://docs.python.org/3.5/library/subprocess.html#using-the-subprocess-module
注:

  • OP首先使用tee的原因--尽管对stdout输出不感兴趣--是因为使用> ...的天真尝试会在调用sudo之前 * 被解释,因此失败,因为写入/proc/sys/...所需的特权还没有被授予。
  • 无论您使用的是os.system()还是subprocess函数,* stdin * 在默认情况下都不受影响,因此如果您从终端调用脚本,当遇到sudo命令时,您将得到一个交互式密码提示(除非凭据已缓存)。
57hvy0tb

57hvy0tb2#

直接写入proc伪文件,而不是通过Python i/o lib。
这将要求您的脚本以root身份运行(通过sudo),这意味着您应该将其范围限制为仅管理员工具。这也允许脚本在sudo需要密码的设备上运行。
示例:

with open("/proc/sys/vm/drop_caches", "w") as drop_caches:
    drop_caches.write("3")
zc0qhyus

zc0qhyus3#

subprocess.check_call(command,stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

你忘了加stderr了。

ufj5ltwl

ufj5ltwl4#

你也可以使用这个简单的方法来实现子流程模块。

command = 'echo 3 | sudo tee /proc/sys/vm/drop_caches'
subprocess.check_call(shlex.split(command),stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL)

所有输出将被传递给DEVNULL。命令的任何问题都将被报告为异常。没有问题意味着没有输出。

rks48beu

rks48beu5#

我相信,当os.system无法隐藏控制台输出时,最简单的方法就是使用os.popen

os.popen("echo 3 | sudo tee /proc/sys/vm/drop_caches")

相关问题