python socket.socket.recv 隐藏输入

1 投票
3 回答
2064 浏览
提问于 2025-04-15 22:41

有没有办法让 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 个回答

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

如果你在使用套接字(sockets),你需要在一端使用 s.sendall( capture() ) 来发送数据,而在另一端则用 display( s.recv4096 ) 来接收和显示数据。

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) 将这个内容发送到网络上,接收方就会收到这些数据。接下来就得看接收方的程序怎么处理这些数据了……

1

socket.recv() 是用来从一个网络连接中接收数据的,接收到的数据你可以根据自己的需要去处理。

我猜你可能在做类似这样的事情:

s.connect(...)
while True:
  print s.recv(4096)

在这种情况下,你的问题可能出在远程那一端,也就是有人在那边输入内容。

你能不能再详细说明一下你的问题?recv() 本身是不会显示数据的。

撰写回答