2009-09-26 2 views
0

Я хотел бы написать простую прокси-серверную строку в Python, чтобы сидеть между соединением Telnet/SSH и локальным последовательным интерфейсом. Приложение должно просто переводить ввод-вывод между этими двумя, но отфильтровывать определенные недопустимые строки (соответствующие регулярным выражениям). (Это для лаборатории маршрутизатора/коммутатора, в которой пользователю предоставляется удаленный последовательный доступ к коробкам.)Лучший подход к прокси-серверу командной строки?

В принципе, клиент установил соединение с Telnet или SSH с демоном. Демон пропускает вход клиента (например)/dev/ttyS0 и передает вход от ttyS0 обратно клиенту. Тем не менее, я хочу иметь возможность занести в черный список определенные строки, поступающие от клиента. Например, команда 'delete foo' не должна быть разрешена.

Я не уверен, как лучше подойти к этому. Связь должна быть асинхронной; Я не могу просто дождаться возврата каретки, чтобы позволить буферам получать последовательный интерфейс. Соответствующие регулярные выражения против потока кажется сложным тоже, как все следующие должны быть перехвачены:

delete foo(enter) 
del foo(enter) 
el foo(ctrl+a)d(enter) 
dl(left)e(right) foo(enter) 

... и так далее. Единственным твердым разделителем является CR/LF.

Я надеюсь, что кто-то может указать мне в правильном направлении. Я просматривал модули Python, но до сих пор ничего не придумал.

ответ

6

Python не является моим основным языком, поэтому я оставлю эту часть ответа для других. Тем не менее, я много работаю над безопасностью, и я хотел бы предложить подход «белого списка», а не «черный список». Другими словами, выберите набор безопасных команд и запретите все остальные. Это намного проще, чем пытаться думать обо всех злонамеренных возможностях и защищать их от всех.

+0

Отличная точка зрения, и я должен был отметить это в вопросе, но, к сожалению, пользователь может использовать практически бесконечное количество отклонений команды. Представьте, что вы хотите, чтобы белый список всех возможных команд Bash, когда все, что вы хотите сделать, это блокировать вариации «rm». – 2009-09-26 23:34:40

+0

Существует почти бесконечный список команд bash, которые могли бы, а не удалить файл, но перезаписать его. Это может быть так же вредно, как удаление. Звучит как сложная проблема. –

0

Как и все примеры вы показать закончить с (enter), почему это, что ...:

Коммуникация должна быть асинхронными; Я просто не могу ждать перевозки возвращения, чтобы буфер кормить из последовательного интерфейса

, если вы не можете получить входящие данные до тех пор, «ввести», и применять «редактировать» запросы (например, ctrl-a, left, right в ваших примерах) к данным, которые вы собираете, тогда вы остаетесь с «завершенной командой, которая должна быть отправлена» в памяти, где она может быть сопоставлена, отклонена или отправлена.

Если вы должны сделать это посимвольно, .read(1) на (небуферизованном) вход позволит вам, но становится потенциально Проверка: более проблематичным; снова вы можете сохранить в памяти образ отредактированной команды, которую вы отправили до сих пор (когда вы применяете запросы на редактирование даже при их отправке), но что происходит, когда «enter» прибывает, и ваша проверка показывает вам, что команда таким образом, НЕ ДОЛЖЕН быть разрешен - можете ли вы, например отправить несколько «удалений» на устройство, чтобы стереть указанную команду? Или есть один запрос на «перебросить полную строку», который будет служить?

Если вы должны отправить каждый символ, как вы его получили (не разрешено накапливать их до точки принятия решения) И нет способа удалить/стереть уже отправленные символы, тогда задача окажется невозможной (хотя я не понять «не могу дождаться вступления» условие ВСЕ, так что, может быть, есть надежда).

+0

Я имею в виду, что я не могу буферизировать все это до CRLF; он должен быть пропущенным, хотя для таких вещей, как выполнение табуляции, необходимо правильно работать. – 2009-09-27 01:20:32

+0

ОК, но, можете ли вы «отменить» или «стереть», как я сказал, прежде чем перейти на соединение? В этом суть проблемы. Кроме того, если последовательное устройство настолько сложное, что вы не можете эмулировать его команды, например. вы можете создать текущее состояние строки не путем эмуляции, а захватить байты ответа устройства, когда вы передаете их обратно своему клиенту, - трудно сказать больше без дальнейших подробностей. –

0

Подумав об этом какое-то время, кажется, что нет никакого практичного и надежного метода фильтрации на входе клиента.Я попытаюсь сделать это под другим углом: если я смогу идентифицировать постоянные шаблоны в предупреждающих сообщениях, поступающих с последовательных устройств (например, в подсказках подтверждения), я могу надежно отменить. Спасибо в любом случае за вход!

Смежные вопросы