Как эта команда nc работает в качестве HTTP-сервера?

Не каждый процесс оболочки, только вход в систему оболочка создает новый сеанс (подробнее ниже ). Очевидно, что вначале сеанс имеет только одного члена — саму оболочку. Каждый новый разветвленный процесс автоматически принадлежит одному и тому же сеансу. Процесс может удалить себя из своего сеанса, создав новый с помощью setsid(). У процесса нет другого способа изменить свою сессию.

Резюме:

session members = login shell
    AND all child processes (and their child processes, etc.)
    EXCEPT child processes that have created its own sessions

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


ОБНОВЛЕНИЕ

Этот вопрос касался bash, но то же самое можно сказать и о других подобных оболочках, ориентированных на командную строку, с управлением заданиями.

Как указал @StéphaneChazelas, сеанс создается программой, которая управляет входом в систему на терминале или псевдотерминальном устройстве. Сессия строго привязана к своему терминалу.

Сначала пользователь должен войти в систему, и только после этого его или ее программа-оболочка может быть определена по соответствующей записи в файле passwd.Эта программа оболочки получает execed -PID остается прежним. Таким образом, сеанс создается внутри процесса, который становится оболочкой входа пользователя.

0
04.12.2019, 15:10
2 ответа

Chrome продолжает работать с первой версией команды, потому что он не знает, насколько велик отправляемый файл, поэтому он не знал, когда он получил его весь, пульсация означает, что он все еще ждет, чтобы увидеть, есть ли больше нет.

Вторая версия добавляет HTTP-заголовок с размером полезной нагрузки перед содержимым файлов, поэтому Chrome теперь знает, сколько еще данных он ожидает, и помечает транзакцию как завершенную, когда достигается конец файла.

ncв сочетании с HTTP/1.0 200 OK\r\nреализует АБСОЛЮТНЫЙ минимальный минимум (на самом деле это не так, но приходит очень щедро в том, что он принимает )протокола HTTP требует что-то отправить, добавляя Content-Lengthходы чуть ближе к спец. Протокол HTTP хорошо документирован, я предлагаю вам прочитать rfc

.

РЕДАКТИРОВАТЬ:

  1. Пульсация означает, что браузер не считает, что загрузка страницы завершена. Поэтому, пока хром не будет уверен, что у него есть весь файл, он будет продолжать пульсировать.
  2. Вам нужно прочитать о том, что составляет URL, но часть после номера порта указывает на ресурс, который вы хотите предоставить серверу. В этом случае серверу все равно, что вы запрашиваете, он всегда будет возвращатьsome.file
  3. Я не могу на это ответить, полагаю, это опечатка и должно быть noteвместоnot
1
28.01.2020, 02:29

В HTTP/1.0, если заголовок Content -Length отсутствует в ответе, вместо этого конец ответа указывается закрытием сокета. ncне делает этого по умолчанию, поэтому хром (или любой другой браузер )ждет ("пульсирует" )"вечно", чтобы это произошло.

Добавьте параметр -Nв ncв первой команде, и все должно работать нормально:

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -N -l -p 8080

Обратите внимание, что заголовок Content -Length не требуется в HTTP/1.0(rfc1945, раздел 7.2.2 ), за исключением случаев, когда ожидается тело и оно пусто (, раздел 7.2).

URL-адрес http://IP:8080/заставляет браузер отправлять что-либо после IP-адреса и порта на сервер, в данном случае только последний /как указание на то, что он хочет от сервера. В примере команд nc/(или что-то еще ), отправленное браузером, полностью игнорируется, и ответ всегда один и тот же. Таким образом, вы можете использовать http://IP:8080/hello/world.pngс тем же результатом.

1
28.01.2020, 02:29

Теги

Похожие вопросы