带有隐藏输入的python socket.socket.recv

时间:2010-05-14 02:39:22

标签: python sockets passwords recv

有没有办法让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的东西吗?

3 个答案:

答案 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) )