python socket.socket.recv 隐藏输入
有没有办法让 socket.socket.recv
在输入时隐藏内容?比如说,如果我在输入密码,我希望这个输入是隐藏的,就像运行 "sudo" 命令时那样。
编辑:
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
的效果?
3 个回答
(针对编辑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)
>>>
如果你在使用套接字(sockets),你需要在一端使用 s.sendall( capture() )
来发送数据,而在另一端则用 display( s.recv4096 )
来接收和显示数据。
(针对提问者的进一步说明)
如果你想在控制台(文本模式)中获取用户输入,但又不想让输入的内容显示出来,你可以使用 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)
将这个内容发送到网络上,接收方就会收到这些数据。接下来就得看接收方的程序怎么处理这些数据了……
socket.recv()
是用来从一个网络连接中接收数据的,接收到的数据你可以根据自己的需要去处理。
我猜你可能在做类似这样的事情:
s.connect(...)
while True:
print s.recv(4096)
在这种情况下,你的问题可能出在远程那一端,也就是有人在那边输入内容。
你能不能再详细说明一下你的问题?recv()
本身是不会显示数据的。