if platform.system() == 'Windows': term_width = 100 else: _, term_width = os.popen("stty size", "r").read().split() term_width = int(term_width)是什么意思
时间: 2023-05-30 18:07:40 浏览: 194
这段代码用于获取当前终端的宽度(以字符数为单位)。如果操作系统是Windows,则默认终端宽度为100个字符。如果操作系统是其他系统,则使用os.popen("stty size", "r").read().split()来获取终端宽度,并将其转换为整数类型。
相关问题
def exec_shell(name ,cmd_str ,timeout=5 * 60): ret_values = [128] start_time = time.time() result = subprocess.Popen(cmd_str, shell=True) isrun = True while result.poll() is None and isrun: now = time.time() if now - start_time >= timeout and result.poll() is None: break time.sleep(1) ret = os.system('ssh -o ConnectTimeout=3 '+ name +' \"cd\"') if ret != 0: logging.info('%s Connect Timeout, ERROR: %d' % (name,ret)) isrun = False if result.poll() is None: result.terminate() # os.killpg(os.getpgid(result.pid), signal.SIGTERM) # os.kill(result.pid, signal.SIGKILL) kill_process(result.pid) ret_values[0] = 65535 else: ret_values[0] = result.returncode return ret_values[0]代码问题
这段代码看起来是用于执行 shell 命令的函数,但是其中有一些问题:
1. 在函数内部执行了一个无限循环,如果命令执行时间超过了指定的 timeout 时间,就会退出循环。但是这个循环会一直占用 CPU 资源,不太合理。可以使用 Python 的 `subprocess.call()` 函数来执行命令,并且可以通过 `timeout` 参数设置超时时间。
2. 在循环内部还执行了一个 `os.system()` 命令,这个命令会新开一个进程去执行 `ssh` 命令,这样会增加系统负担。可以使用 `paramiko` 库来实现 SSH 连接。
3. 函数最后返回的 `ret_values[0]` 只有一个元素,而且这个元素在函数内部已经被修改了,使用一个变量就可以了。
下面是修改后的代码:
```python
import subprocess
import time
import paramiko
def exec_shell(name, cmd_str, timeout=5*60):
start_time = time.time()
try:
result = subprocess.run(cmd_str, shell=True, check=True, timeout=timeout)
ret = result.returncode
except subprocess.TimeoutExpired:
ret = 65535
except subprocess.CalledProcessError as e:
ret = e.returncode
except Exception as e:
ret = 128
# 这里可以根据返回值做相应的处理,比如记录日志等
return ret
def ssh_connect(name):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(name, timeout=3)
return True
except:
return False
def exec_ssh_cmd(name, cmd_str, timeout=5*60):
start_time = time.time()
while True:
if ssh_connect(name):
break
now = time.time()
if now - start_time >= timeout:
logging.info('%s Connect Timeout' % name)
return 65535
time.sleep(1)
stdin, stdout, stderr = ssh.exec_command(cmd_str, timeout=timeout)
ret = stdout.channel.recv_exit_status()
# 这里可以根据返回值做相应的处理,比如记录日志等
return ret
```
其中 `exec_shell()` 函数使用了 Python 内置的 `subprocess.run()` 函数来执行 shell 命令,可以设置超时时间和检查命令是否执行成功的选项,这样就不需要使用循环了。
另外,我还添加了一个 `ssh_connect()` 函数来判断是否能够连接到远程服务器,以及一个 `exec_ssh_cmd()` 函数来执行 SSH 命令。这两个函数使用了 `paramiko` 库来实现 SSH 连接和命令执行,比较方便和安全。
from winproxy import ProxySetting from mitmproxy import http from mitmproxy.tools.main import mitmdump class AddHeader: def request(self, flow: http.HTTPFlow) -> None: self.num += 1 if "https://cloud.keytop.cn/service/front/userCenter/lpn/list?_=" in flow.request.pretty_url: for name, value in flow.request.headers.items(): if "accesstoken:" == name: accesstoken = value addons = [ AddHeader() ] def set_proxy(): """设置系统代理""" pxy.enable = True pxy.server = '127.0.0.1:8081' pxy.registry_write() mitmdump(['-p', '8081', '-s', __file__]) def close_proxy(): """关闭系统代理""" pxy.enable = False pxy.registry_write() if __name__ == "__main__": pxy = ProxySetting() set_proxy() close_proxy() 我在set_proxy()中运行了mitmdump,那我应该如何在close_proxy()中停止mitmdump呢
您可以通过在set_proxy()中创建mitmdump进程对象,并在close_proxy()中调用mitmdump进程对象的stop()方法来停止mitmdump。具体代码示例如下:
```
from subprocess import Popen
class AddHeader:
def request(self, flow: http.HTTPFlow) -> None:
self.num += 1
if "https://cloud.keytop.cn/service/front/userCenter/lpn/list?_=" in flow.request.pretty_url:
for name, value in flow.request.headers.items():
if "accesstoken:" == name:
accesstoken = value
addons = [
AddHeader()
]
def set_proxy():
"""设置系统代理"""
global mitmdump_process
pxy.enable = True
pxy.server = '127.0.0.1:8081'
pxy.registry_write()
mitmdump_process = Popen(['mitmdump', '-p', '8081', '-s', __file__])
def close_proxy():
"""关闭系统代理"""
pxy.enable = False
pxy.registry_write()
mitmdump_process.stop()
if __name__ == "__main__":
pxy = ProxySetting()
set_proxy()
close_proxy()
```
在这个示例中,我们使用了subprocess模块中的Popen()函数来创建mitmdump进程对象,并将其赋值给全局变量mitmdump_process。在close_proxy()中,我们只需要调用mitmdump进程对象的stop()方法即可停止mitmdump进程。
阅读全文