在python中读取stdin后如何输入()?

How to input() after reading stdin in python?

提问人:milanHrabos 提问时间:5/15/2023 最后编辑:milanHrabos 更新时间:5/15/2023 访问量:107

问:

这个简单的代码:

#!/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()

文件已触发

  1. 不输入:或 .然后在我输入消息后等待,它被发送到服务器并出现提示(对于另一条消息)。此时出现上述情况 - 键入新消息后,在换行或 EOF 之后,什么也没发生。不返回。$ python3 test.py -p 9998$ ./test.py -p 9998'> 'input()
  2. 使用一些 stdin 重定向,例如,在这种情况下,消息被发送,但立即抛出 .所以根本没有提示。$ echo 'ABC' | python3 test.py -p 9998ABCinput()EOFError: EOF when reading a line
python 输入 io stdin

评论

1赞 khelwood 5/15/2023
你是如何执行这个脚本的?您是否将某些内容传递给 stdin 以供其阅读?如果是这样,你所传递的东西是否包括你想做的任何事情?input
0赞 milanHrabos 5/15/2023
@khelwood查看编辑内容
1赞 khelwood 5/15/2023
据我了解,在情况 1 中,您将继续消耗输入,直到它收到终止。如果您不发送该邮件,则无法联系到。在情况 2 中,您将作为输入传递给 stdin,因此,如果您尝试从中读取更多内容(例如),您将获得一个 EOF。从本质上讲,不要尝试将 stdin 用于两个不同的输入。stdin.read()input()'ABC'input()
0赞 milanHrabos 5/15/2023
@khelwood ,但它确实在第一条消息 (ctrl-d) 中收到了 EOF - 在此之前,它是在那之后,即不接受另一个 EOF... stdin will carry on consuming until it receives a terminationinput()input()

答: 暂无答案