Clojure сервер swank открывает открытый порт?

(Этот вопрос был опущен, что я нахожу странным. Как я обидел?)

Правильно ли я думаю, что запуск swank-сервера обычно открывает порт 4005 миру, не привязанный к соединениям только с локальным хостом?

Таким образом, любой, кто взломал в кафе, не только позволяет прохожим выполнять произвольный код на своем компьютере, но и дает им приятный интерфейс, чтобы сделать это с помощью.

Похоже, что когда я запускаю swank-сервер с "mvn clojure: swank" или "lein swank" или (swank.swank/start-server "/tmp/yo)

тогда я получаю что-то вроде (спасибо Майку!):

$lsof -i -P
java      11693 john   13r  IPv6 6701891      0t0  TCP *:34983 (LISTEN)

и действительно, я могу подключиться к emacs, работающему на другой машине в той же сети.

(swank.swank/start-server "/tmp/yo")

Если я запускаю сервер вручную, он выдает следующий вывод

Connection opened on local port  34983
#<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=34983]>

В то время как:

(swank.swank/start-server "/tmp/yo" :host "localhost")

дает:

Connection opened on local port  40368
#<ServerSocket ServerSocket[addr=localhost/127.0.0.1,port=0,localport=40368]>

Это похоже на то, что я ожидал.

Есть ли веская причина для этого?

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

Ответ 1

Полностью действующий вопрос.

После открытия слизнящего сервера вы заметите:

eames:~:% lsof -i -P | grep 4005
java      41477  mjd   33u  IPv6 0x0b8956d0      0t0  TCP [::127.0.0.1]:4005 (LISTEN)

Соединение прослушивает локальный адрес на порту 4005. Этот интерфейс не подключен к сети, поэтому другие устройства в сети не могут подключиться к вашему серверу slime.

изменить:

Это был мой результат запуска swank с использованием leiningen, который предоставляет "localhost" в качестве аргумента для swank.swank/start-server. Вы можете дважды проверить, что плагин leiningen открывает нелокальные порты.

Вы правы, что swank открывает соединение по каждому адресу, если хост явно не указан. Соответствующий код swank.util.net.sockets/make-server-socket, и это поведение документировано. Я согласен, это похоже на неправильный вариант.

Ответ 2

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

Ответ 3

Если вы используете clojure -maven-plugin, недавно была выпущена версия 1.3.4, которая теперь запускает swank-сервер против локального хоста, чтобы предотвратить эту проблему.

Это поведение можно настроить в файле pom.xml с помощью

<configuration>
  <swankHost>someotherhostname</swankHost>
</configuration>

или из командной строки с помощью:

mvn clojure:swank -Dclojure.swank.host=someotherhostname