2010-05-14 28 views
1

有什麼辦法讓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的東西?帶隱藏輸入的python socket.socket.recv

回答

1

socket.recv()從套接字返回數據,你對這些數據做什麼取決於你。

我猜你正在做的事情是這樣的:

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

在這種情況下,你的問題是遠程到底哪裏有人推測打字輸入。

你能澄清你的問題嗎? recv()從不顯示數據。

+0

我的意思是''socket.socket.recv''在客戶端輸入時顯示數據,因爲無論您鍵入的是什麼(在客戶端)。現在,當您使用'sudo'命令時,無論您輸入什麼密碼,都不會顯示。這是一個隱藏輸入的例子。我想知道是否有某種recv輸入(在客戶端)被隱藏(輸入時未顯示)。 – None 2010-05-16 00:54:09

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)發送此網絡,則遠程端將收到此數據。在這一點上它是由接收腳本來決定如何對數據進行修改......

+0

這會要求服務器端的隱藏輸入。我想要這樣的東西,要求在REMOTE端隱藏輸入。一些會像「client.recv」一樣行事,但輸入將被隱藏起來。 – None 2010-05-16 20:52:17

+1

您誤解了套接字 - 它們只是將數據從主機發送到主機的一種機制。您關心的是收集和顯示*人*的輸入。您的服務器和客戶端應該處理如何捕獲和顯示數據:它與套接字沒有任何關係。 – RobM 2010-05-17 09:58:05

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))在另一端。