提问人:milanHrabos 提问时间:5/15/2023 最后编辑:milanHrabos 更新时间:5/15/2023 访问量:107
在python中读取stdin后如何输入()?
How to input() after reading stdin in python?
问:
这个简单的代码:
#!/usr/bin/env python3
import argparse
import socket
import shlex
import subprocess
import sys
import textwrap
import threading
def execute(cmd):
cmd = cmd.strip()
if not cmd:
return
output = subprocess.check_output(shlex.split(cmd), stderr=subprocess.STDOUT)
return output.decode()
class NetCat:
def __init__(self, args, buffer=None):
self.args = args
self.buffer = buffer
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def run(self):
if self.args.listen:
self.listen()
else:
self.send()
def send(self):
self.socket.connect((self.args.target, self.args.port))
if self.buffer:
self.socket.send(self.buffer)
try:
while True:
recv_len = 1
response = ''
while recv_len:
data = self.socket.recv(4096)
recv_len = len(data)
response += data.decode()
if recv_len < 4096:
break
if response:
print(response)
buffer = input('> ') #input does not return after new line or even EOF (ctrl-d)
buffer += '\n'
self.socket.send(buffer.encode())
except KeyboardInterrupt:
print('User terminated.')
self.socket.close()
sys.exit()
def listen(self):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Net Tool',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=textwrap.dedent(
'''Examples:
netcat.py -t 192.168.1.108 -p 5555 -l -c # command shell
netcat.py -t 192.168.1.108 -p 5555 -l -u=mytest.txt # upload to file
netcat.py -t 192.168.1.108 -p 5555 -l -e=\"cat /etc/passwd\" # execute command
echo 'ABC' | ./netcat.py -t 192.168.1.108 -p 135 # echo text to server port 135
netcat.py -t 192.168.1.108 -p 5555 # connect to server
'''
)
)
parser.add_argument('-c', '--command', action='store_true', help='command shell')
parser.add_argument('-e', '--execute', help='execute specified command')
parser.add_argument('-l', '--listen', action='store_true', help='listen')
parser.add_argument('-p', '--port', type=int, default=5555, help='specified port')
parser.add_argument('-t', '--target', default='127.0.0.1', help='specified IP')
parser.add_argument('-u', '--upload', help='upload file')
args = parser.parse_args()
if args.listen:
buffer = ''
else:
buffer = sys.stdin.read() # stdin is used here, but should that change behaviour of subsequence reading - input() ?
nc = NetCat(args, buffer.encode())
nc.run()
之后,提示永远不会返回,换行符和 EOF 之后都不会返回。是因为以前的吗?这是怎么回事input('> ')
sys.stdin.read()
文件已触发
- 不输入:或 .然后在我输入消息后等待,它被发送到服务器并出现提示(对于另一条消息)。此时出现上述情况 - 键入新消息后,在换行或 EOF 之后,什么也没发生。不返回。
$ python3 test.py -p 9998
$ ./test.py -p 9998
'> '
input()
- 使用一些 stdin 重定向,例如,在这种情况下,消息被发送,但立即抛出 .所以根本没有提示。
$ echo 'ABC' | python3 test.py -p 9998
ABC
input()
EOFError: EOF when reading a line
答: 暂无答案
评论
input
stdin.read()
input()
'ABC'
input()
... stdin will carry on consuming until it receives a termination
input()
input()