python socket.socket.recv со скрытым вводом - PullRequest
1 голос
/ 14 мая 2010

Есть ли способ запустить socket.socket.recv со скрытым вводом. Например, если бы я запрашивал пароль, я бы хотел, чтобы ввод был скрыт, как если бы я выполнял команду sudo bash.
Edit:
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 голос
/ 16 мая 2010

(в ответ на разъяснения спрашивающего)

Если вы хотите иметь возможность получать ввод от пользователя в командной строке (текстовый режим) без его отображения, вы, вероятно, хотите использовать 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 голос
/ 17 мая 2010

(в ответ на редактирование 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) ) на другом.

1 голос
/ 15 мая 2010

socket.recv() возвращает данные из сокета, что вы делаете с этими данными, зависит только от вас.

Полагаю, вы делаете что-то вроде этого:

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

В этом случае ваша проблема - это удаленный конец, где кто-то предположительно печатает ввод.

Не могли бы вы уточнить свой вопрос, пожалуйста? recv() никогда не отображает данные самостоятельно.

...