我有一个程序需要输出三条不断变化的消息。连接数,已用时间和拒绝连接。
我尝试在字符串末尾用'\r'
编写它们并打印换行符,然后其他人开始自己的输出循环,认为返回的回车符回一行。但是他们都在第一线被覆盖了。
我已经看过类似的问题,人们建议使用curses
,但我似乎无法让它发挥作用。我尝试使用addstr()
代替print
或sys.stdout.write()
,但显然我做得不对,因为它最终看起来像this.我也尝试使用{{1}每个move(0,0)
之后因为我认为坐标是从光标的最后位置计算的,但是输出看起来和我没有做的时候相同
这是我使用addstr
-
curses
另外,除了没有正确写入我似乎无法正常关闭它,当我使用from scapy.all import *
from curses import wrapper
import argparse, random, socket, sys, time, os, threading, re, subprocess, curses
def main(target):
try:
stdscr.clear()
curses.noecho()
curses.cbreak()
stdscr.keypad(1)
#things regarding user agents and iptables
for conn in range(args.connections):
t = threading.Thread(target=sendPacket, args=(targetIP, args.port, targetHost,random.choice(userAgents)))
threads.append(t)
t.start()
numConn += 1
try:
lock.acquire()
stdscr.addstr(0, 0,'{0} Connections Established to {1} '.format(numConn,getIP(target)))
stdscr.refresh()
#sys.stdout.flush()
finally:
lock.release()
time.sleep(args.timer)
CloseWin()
sys.exit()
except KeyboardInterrupt, e:
lock.acquire()
stdscr.addstr (5,0,'Exiting {0}'.format(e))
CloseWin()
lock.release()
sys.exit()
#functions that deal with resolving host and IP
def sendPacket(targetIP,targetPort,targetHost,userAgent):
try:
#building and sending the packet
failPacket = 0
lock.acquire()
if synack is None:
stdscr.addstr(1, 0, '{0} Connections refused'.format(failPacket))
stdscr.refresh()
failPacket += 1
return
#send final packet
lock.release()
return
except Exception,e:
CloseWin()
#print e
lock.release()
return
def MeasureTime():
try:
lock.acquire()
while True:
stdscr.addstr(3, 0,'{0} Time elapsed'.format(time.time() - startTime))
stdscr.refresh()
finally:
lock.release()
def CloseWin():
try:
lock.acquire()
curses.nocbreak()
stdscr.keypad(0)
curses.echo()
curses.endwin()
finally:
lock.release()
if __name__ == '__main__':
#args
stdscr = curses.initscr()
if args.debug == True:
wrapper(OneConn(args.target)) #OneConn is the same as the main function except it only opens one connection, so the print is the same
else:
startTime = time.time()
wrapper(main(args.target))
尝试并退出时,看起来它停止更新有关数据包的打印输出但是时间仍在坚持下去。除了关闭终端之外,我无法找到阻止它的方法。
尝试根据@ martinaeu的建议添加锁定并编辑帖子以显示我的所作所为。结果是我只能看到ctrl+c
被打印出来并在第四行更新,根本看不到其他打印件,仍然无法关闭程序而不关闭终端
答案 0 :(得分:0)
您可以简单地发出原始代码,将光标移回三行,而不是使用curses
。这将是:
os.write(1, "\x1b[3F")
小心:线条不会被删除。如果您打印的新行与旧行的长度相同(例如,因为它们的格式为"foo: %10d"
),则应该不会出现问题。
参考:https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes(其中“CSI”代表“\ x1b [”,n是以十进制表示的可选数字。)