начатое соединение SSH от сервера до клиента

Для Вашей перекрывающейся проблемы, на Linux (и с bash или zsh но не с ksh93), Вы могли сделать это как:

somefunction()
(
  if [ "$1" -eq 1 ]
  then
    echo "Hello world!"
  else
    exec 3> auxfile
    rm -f auxfile
    somefunction "$(($1 - 1))" >&3 auxfile 3>&-
    exec cat <(command1 < /dev/fd/3) \
             <(command2 < /dev/fd/3) \
             <(command3 < /dev/fd/3)
  fi
)

Отметьте использование (...) вместо {...} получить новый процесс при каждом повторении, таким образом, у нас может быть новый fd 3, указывающий на новое auxfile. < /dev/fd/3 прием должен получить доступ к этому теперь удаленный файл. Это не будет работать над системами кроме Linux где < /dev/fd/3 похож dup2(3, 0) и так fd 0 было бы открыто в режиме только для записи с курсором в конце файла.

Для предотвращения ветвления для вложенного somefunction Вы могли записать это как:

somefunction()
{
  if [ "$1" -eq 1 ]
  then
    echo "Hello world!"
  else
    {
      rm -f auxfile
      somefunction "$(($1 - 1))" >&3 auxfile 3>&-
      exec cat <(command1 < /dev/fd/3) \
               <(command2 < /dev/fd/3) \
               <(command3 < /dev/fd/3)
    } 3> auxfile
  fi
}

Оболочка заботилась бы о резервном копировании fd 3 при каждом повторении. Вы закончили бы тем, что закончились дескрипторы файлов раньше все же.

Хотя Вы найдете, что это - более эффективное, чтобы сделать это как:

somefunction() {
  if [ "$1" -eq 1 ]; then
    echo "Hello world!" > auxfile
  else
    somefunction "$(($1 - 1))"
    { rm -f auxfile
      cat <(command1 < /dev/fd/3) \
          <(command2 < /dev/fd/3) \
          <(command3 < /dev/fd/3) > auxfile
    } 3< auxfile
  fi
}
somefunction 12; cat auxfile

Таким образом, не вкладывайте перенаправления.

10
05.12.2016, 21:43
1 ответ
[1184302] По определению, именно клиент инициирует соединение.[12124] Для вашей проблемы, я думаю, простым решением было бы строительство обратного туннеля. [12125]На компьютере без публичного IP:[12126]Соединение соединяется с сервером по SSH и строит туннель от сервера с публичным IP на порту 2222 к компьютеру без публичного IP на порту 22 (SSH).[12127]А затем на сервере:[12128]Соединение перенаправляется с порта 2222 сервера на порт 22 компьютера по первому туннелю. Вы можете использовать инструмент типа [1184714]autossh[1184715], чтобы сделать туннель более устойчивым (т.е. перезапускать его автоматически при выключении).[1184313].
12
27.01.2020, 20:02

Теги

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