Closed spigell closed 7 years ago
Это бага sparrow, я с подобным поведением уже сталкивался. Не могу сказать в точности в чем дело. Нужно дебажить, разбираться.
Впринципе место в коде, где это происходит мне известно, попробую вечером сегодня посмотреть.
Попробуйте вот этот плагин запустить - https://sparrowhub.org/info/ssh-test1 он реализует второй случай ( зайти по ssh на 127.0.0.1 и запусить команду ls ) - у меня он при запуске не виснет, а у вас?
Я думаю что как в случае с sshuttle так с просто ssh проблема одна и та же , но для простоты давайте попробуем воспроизвести баг на обычной ssh сессии.
Нет, не виснет. Зависает только если, запускать например bash - ssh 127.0.0.1 'bash'
, т.е. прыгнуть в другой процесс на хосте, но это не страшно, так в принципе и должно быть. Второй пример просто показывает то, что sparrow делает ssh с очень куцым шелом. Решается, если запустить bash c ключом -l
.
Sshuttle скорее всего делает ssh соединение и держит его, но у него есть опция, чтобы он уходил в фон. Sparrow продолжает действительно дальше делать скприпт, но вот в конце консоль не отдает. Вот это немного непонятно. Вот пример
[spigell@puppet_sparrow-test sshuttle]$ strun --param host=193.124.178.59 --param subnet=192.168.23.0 --param netmask=24 --param check_ip=192.168.23.1 --debug 2
make cache dir: /home/spigell/.outthentic/tmp/2633/story-0
configuration populated and saved to /home/spigell/.outthentic/tmp/2633/story-0/config.json
project: /home/spigell/sshuttle
story: /home/spigell/sshuttle
story_type: upstream
debug: 2
ignore story errors: 0
[s] at 2017-02-23 17:44:07
execute scenario: bash -c 'source /home/spigell/.outthentic/tmp/2633/story-0/glue.bash && source /usr/local/share/perl5/auto/share/dist/Outthentic/outthentic.bash && source /home/spigell/sshuttle/story.bash'
+++ config host
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/2633/story-0/config.json host
++ host=193.124.178.59
+++ config subnet
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/2633/story-0/config.json subnet
++ subnet=192.168.23.0
+++ config netmask
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/2633/story-0/config.json netmask
++ netmask=24
+++ config user
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/2633/story-0/config.json user
++ user=spigell
+++ config check_ip
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/2633/story-0/config.json check_ip
++ check_host=192.168.23.1
++ sshuttle -v -D -r spigell@193.124.178.59 192.168.23.0/24
Starting sshuttle proxy.
Listening on ('127.0.0.1', 12300).
c : connecting to server...
spigell@193.124.178.59's password:
c : connected.
Connected.
++ sleep 5
++ printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks'
++ nc 192.168.23.1 -v
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.23.1:31337.
Ncat: 31 bytes sent, 0 bytes received in 0.07 seconds.
++ echo 'Connection established'
Connection established
++ exit 0 # это последняя строка. Он должен выйти из скрипта и сделать check.
No way!!!
^CSTATUS FAILED (2)
Не очень понятно, на чьей стороне неполадка.
Второй пример просто показывает то, что sparrow делает ssh с очень куцым шелом
Вот здесь не очень понимаю. Ведь sparrow сам по себе ничего не знает про настройки ssh/bash , они все определяются в вашем конкретном плагине. Так?
Sshuttle скорее всего делает ssh соединение и держит его, но у него есть опция, чтобы он уходил в фон. Sparrow продолжает действительно дальше делать скприпт, но вот в конце консоль не отдает. Вот это немного непонятно.
Mне бы это дело как-нибудь у себя воспроизвести, не объясните как? Я просто с sshuttle дело не имел, у вас же есть код плагина или сьюта?
Поставьте sshuttle и netcat Да, можете попробовать - https://github.com/Spigell/sparrow-sshuttle Можете запускать strun без параметров. Самое главное, чтобы во время проверки не было запущен sshuttle. Иначе он скажет, что уже запущен и все будет в порядке.
удалось воспроизвести у себя на машине баг, буду смотреть.
Попробуйте обновить Outthentic из git , баг должен пропасть:
cpanm https://github.com/melezhik/outthentic.git
По крайней мере у меня sparrow-sshuttle теперь не зависает
Да, действительно, сейчас не зависает, если запустить strun без параметов (я подразумеваю, что 192.168.0.0 cеть у вас доступна). Но если запустить вот так strun --param check_ip=192.168.23.1 --param subnet=192.168.23.0
( в моем случае хост до сети 192.168.23.0 никак не доребется), то он все равно зависает.
[spigell@puppet_sparrow-test sshuttle]$ time strun --param check_ip=192.168.23.1 --param subnet=192.168.23.0 --debug 2
make cache dir: /home/spigell/.outthentic/tmp/4762/story-0
configuration populated and saved to /home/spigell/.outthentic/tmp/4762/story-0/config.json
project: /home/spigell/sshuttle
story: /home/spigell/sshuttle
story_type: upstream
debug: 2
ignore story errors: 0
[s] at 2017-02-25 02:07:50
execute scenario: bash -c 'source /home/spigell/.outthentic/tmp/4762/story-0/glue.bash && source /usr/local/share/perl5/auto/share/dist/Outthentic/outthentic.bash && source /home/spigell/sshuttle/story.bash'
spigell@127.0.0.1's password:
1
2
3
4
5
6
7
8
0
10
seconds
^C
Connected.
+++ config host
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/4762/story-0/config.json host
++ host=127.0.0.1
+++ config subnet
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/4762/story-0/config.json subnet
++ subnet=192.168.23.0
+++ config netmask
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/4762/story-0/config.json netmask
++ netmask=24
+++ config user
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/4762/story-0/config.json user
++ user=spigell
+++ config check_ip
+++ perl -MOutthentic::Glue::Bash -e json_var /home/spigell/.outthentic/tmp/4762/story-0/config.json check_ip
++ check_host=192.168.23.1
++ sshuttle -v -D -r spigell@127.0.0.1 192.168.23.0/24
Starting sshuttle proxy.
Listening on ('127.0.0.1', 12300).
c : connecting to server...
c : connected.
++ sleep 3
++ nc 192.168.23.1 -v
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.23.1:31337.
++ printf '\r\n\r\ncool, thanks'
++ [[ '' == 0 ]]
++ exit 1
not ok scenario succeeded
end of story: /home/spigell/sshuttle
STATUS FAILED (256)
real 0m24.009s
user 0m0.339s
sys 0m0.053s
outthentic ставил из гита. Заметил новую зависимость tiny.
Приветствую. Capture::Tiny - это модуль который я использую для вызова внешних программ и парсинга ответа от них. Он вроде как решает проблемы с "зависающими" процессами
Но если запустить вот так strun --param check_ip=192.168.23.1 --param subnet=192.168.23.0 ( в моем случае хост до сети 192.168.23.0 никак не доберется), то он все равно зависает.
А если запустить все тоже самое руками, не через strun
? Sshutle может достучаться до хоста? Запустите, пож-та руками и отпишите вывод
А еще было бы здорово знать с какими параметрами мне запустить что бы потестировать ? У вас то хост 92.168.23.1 и subnet 92.168.23.0 я насколько понимаю реальные? Я например мог бы потестировать все для хоста sparrowhub.org , какие в этом случае должные быть параметры check_ip, subnet?
Из вывода последнего запуска strun (см выше) видно команду:
[spigell@puppet_sparrow-test sshuttle]$ sshuttle -v -D -r spigell@127.0.0.1 192.168.23.0/24
Starting sshuttle proxy.
Listening on ('127.0.0.1', 12300).
c : connecting to server...
spigell@127.0.0.1's password:
spigell@127.0.0.1's password:
c : connected.
Connected.
[spigell@puppet_sparrow-test sshuttle]$
sshuttle сделал соединение с локалхостом, а то что сеть 192.168.0.23/24 недоступна не важно должно быть. Тут дело в netcat теперь, я сразу не увидел.
Давайте до завтра подождем. Скорее всего, я просто netcat не то скормил.
нет, сети не реальные. Просто любая сеть, куда не может попасть хост. Check_ip = это хост, который вы проверяете netcat, когда сделали соединение (icmp часто не прокидывается sshuttle).
Похоже, да, это в плагине проблема. Я его написал для проверки вчера и не особо разбирался как закрыть nc правильно. Давайте закроем вопрос насчет sshutle. Сейчас не залипает - это главное. Спасибо.
Хорошо, вас понял. Здорово , что получилось на вашем кейсе баг закрыть этот неприятный. Я давно ломал голову насчёт этого. Сейчас я использую сторонний модуль captures::tiny , он более корректно реализует работу с IPC, чем старый код. Спасибо что помогли.
Через какое то время выкачу новую версию Outthentic в релиз на CPAN
выложил на CPAN, в версии 0.2.27 - https://metacpan.org/changes/distribution/Outthentic
Я тут сделал небольшое исследование насчет sshutle и выглядет так что у него некорректная демонизация, возможно поэтому он вызывал зависание в sparrow. Я пока ничего не утверждаю, но я запостил тикет разработчикам sshutle - https://github.com/sshuttle/sshuttle/issues/139 и жду от них ответа, если выяснится, что баг на их стороне, я планирую поменять реализацию запуска внешних комманд в outthentic.
Та, которая сейчас не позволяет выводить stdout/stderr от внешней команды в режиме реального времени. На это пришлось пойти что бы решить проблему с зависание при работе со sshutle.
Так что как выяснится что проблема была не в Sparrow, я планирую отревертить изменения сделанные в Outthentic р рамках данного тикета и попрошу вас обновить sshutle ( версия в которой я надеюсь его разработчики решат проблему с демонизацией ), и сам Sparrow и убедится что sparrow-sshutle плагин работает без зависаний.
Тоже наблюдаю. А можете пояснить, как добавление capture::tiny повляло на вывод stoout/stderr в реальном времени? Чисто для справки. Если честно, мне вывод в реальном времени в одном своем плагине критичен. Хотелось бы его вернуть.
Когда обнаружилось зависание с sshutle я стал искать решения. До этого я использовал стандартную для perl конструкцию с открытие внешней программы через функцию open и с течение всего вывода через линукс pipe. Capture::Tiny впринципе делает тоже самое , только с вариациями . Этот модуль экспортирует несколько функций для конечного прльзователя. Та, которую мы сейчас используем это Capture::Tiny::capture , по каким-то причинам ( я не стал разбираться почему, там нужно копаться в реализации, а она непростая ) она не виснет при работе с sshutle , на не умеет отдавать данные из stdout, stderr внешней программы в режиме реального времени, я это уже понял позже , после релиза.
Так как скорее всего судя по тому что недавно написали разработчики sshutle в тикете - бага на стороне sshutle , я отреверчу изменения ( или буду использовать функцию Capture::Tiny::tee, котораяотдает данные в realtime ) .
К вам тогда вопрос - вы готовы подождать с использованием sshutle в плагине Sparrow , пока разработчики не пофиксят баг ?
Да, готов подождать.
Ок. Вернул realtime режим:
$ cpanm https://github.com/melezhik/outthentic.git
Или как обычно
$ sparrowdo sparrowdo --host=127.0.0.1 --module_run=Sparrow::Update
Работает.
Это скорее вопрос. Я подметил, что при работе, если в плагинах использовать команду ssh, то получаются странные ситуации. У меня есть скрипт, который с помощью sshuttle создает кучу vpn с серверами. У этой утилиты есть ключ -D, который говорит о том, что приложение уйдет в фон после запуска. При запуске в консольке и скриптах bash он отдает консольку. Но в плагинах sparrow он чего-то ожидает. Пример:
Можете подсказать, в чем дело может быть? Тоже самое, если зайти по ssh через sparrow скрипт: