有没有办法让socket.socket.recv
运行隐藏输入。例如,如果我要求输入密码,我希望隐藏输入,就好像我正在运行“sudo”bash命令一样。
修改
socket.socket.recv
要求远程端的数据。当您连接到服务器时,它会询问您的文本,当您输入文本时,它将显示在您的控制台中。现在,当您使用sudo命令时,它会要求输入密码,您无法看到您键入的文本。我希望这样的内容适用于socket.sock.recv
,因此您不会看到您输入的密码
编辑2:
当我说socket.socket.recv
时,我实际上意味着socket._socketobject.recv
这样的内容在我的程序中会是这样的:client.recv(BUF_SIZE)
。
编辑3:
我正在制作一个telnet服务器。 client.recv(BUF_SIZE)
就像在客户端计算机上运行raw_input
一样。那么有什么类似于在客户端计算机上运行getpass.getpass
的东西吗?
答案 0 :(得分:1)
socket.recv()
从套接字返回数据,您对该数据的处理取决于您。
我猜你正在做这样的事情:
s.connect(...)
while True:
print s.recv(4096)
在这种情况下,您的问题是远程结束,其中某人可能正在键入输入。
你可以澄清一下你的问题吗?recv()
永远不会自己显示数据。
答案 1 :(得分:1)
(回答提问者的澄清)
如果您希望能够在控制台(文本模式)提示下从用户那里获取输入而不显示它,您可能想要使用getpass
。
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from getpass import getpass
>>> p = getpass("Enter some text now: ")
Enter some text now:
>>> print p
secret
>>>
然而,这与套接字和网络完全无关。上面的变量p
包含用户输入的文本(即他们的密码)。如果您使用socket.sendall(p)
向下发送此网络,则远程端将接收此数据。此时,由接收脚本决定如何处理数据...
答案 2 :(得分:1)
(回应编辑2)
这是一个简单的例子,说明如何编码某些数据是否保密,并在函数之间传递数据:
Python 2.6.2 (r262:71600, Sep 22 2009, 18:29:26)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def capture(secret=False):
... if secret:
... from getpass import getpass
... return chr(0) + getpass("Enter some secret text now: ")
... else:
... return raw_input("Enter some text now: ")
...
>>> def display(data):
... if data[0] == chr(0):
... print "(Secret text hidden)"
... else:
... print data
...
>>> display( capture() )
Enter some text now: Hello
Hello
>>> display( capture(secret=True) )
Enter some secret text now:
(Secret text hidden)
>>>
如果您使用套接字,则需要在一端使用s.sendall( capture() )
,在另一端使用display( s.recv4096) )
。