Реализовать перенаправление SSH на удаленном хосте

  1. Для каждой строки ввода $n<= десятичное значение перед запятой.
  2. хэш %h, ключами которого являются числа слева от = и значения справа.
  3. , затем численно отсортируйте ключи и напечатайте $n, key, coresp. ценность.
  4. $,= OFS<= $"= разделитель выходного списка, по умолчанию пробел.

perl -lne '$,=$";
   ($n, %h) = ( /^\((\d+),/, /(\d+)=([^,}]+)/g );
   print $n, $_, $h{$_} for sort { $a <=> $b } keys %h;
' yourfile

Результаты:

0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
0
20.03.2017, 12:18
3 ответа

Во-первых, вот лучшее решение, чем то, которое приведено в ссылке, указанной в вопросе, поскольку это новое решение не зависит от внешних инструментов, таких как netcat:

Host C
  ProxyCommand ssh -W %h:%p B

в .ssh/config хоста A. Пользователям не нужно обладать особыми компьютерными навыками, им просто нужно быть информированными. Любой может поместить в файл 2 строки.

Если это действительно проблема, можно добавить специальную команду в файл .ssh/authorized_keys на хосте B:

command="ssh C" ssh-rsa <key_of_the_user_of_host_A>

Таким образом, когда пользователь выполняет ssh B, вместо запуска интерактивной оболочки на хосте B, SSH-сервер на хосте B автоматически запустит ssh C (см. man-страницу sshd(8)). Однако это предотвратит любое прямое протоколирование на хосте B, и любая другая команда SSH, например /bin/bash -l в ssh -t B /bin/bash -l, будет проигнорирована. Как сказано на странице руководства:

Команда, первоначально предоставленная клиентом, доступна в переменной окружения SSH_ORIGINAL_COMMAND.

Таким образом, возможно, есть некоторые возможности для улучшения, либо для выполнения предоставленной команды на хосте C, либо для выполнения ее на хосте B при некоторых условиях (также будьте осторожны с цитированием, если вы учитываете эту переменную окружения). Одним из примеров является:

command="ssh ${TTY:+-t} C ${SSH_ORIGINAL_COMMAND-$SHELL}" ssh-rsa <key>

который запускает предоставленную команду на хосте C, если он есть (и запускает интерактивную оболочку, как обычно, если ее нет). С этим scp может работать, но на моей машине он не работает с ошибкой "Permission denied". Но rsync работает хорошо и может быть использован как замена scp, если у вас есть проблемы с ним.

Важно. Не выбирайте решение, которое заключается в открытии (обязательно непривилегированного) порта на хосте B. Либо это не будет работать, потому что соединения с такими портами блокируются брандмауэром университета, либо это создаст проблемы с безопасностью, так как это позволит пользователям обходить аутентификацию (с такими вещами, как трассировка) на хосте B через SSH-сервер на порту 22.

2
28.01.2020, 02:27

на хосте B:

B$ ssh localhost -L 2222:C:22 -g

Во время работы все могут подключиться к хосту C через B:2222 (tcp порт 2222)

Для постоянного решения вы можете запустить screen на хосте B, а команду ssh оставить в фоне.

(вы можете использовать более простую программу для перенаправления tcp, чем ssh на localhost: например, redir )

1
28.01.2020, 02:27

Решение для интерактивной переадресации, которое не требует открытия порта на B, но одного на A, следующее:

На A:

ssh -fNL 2222:C:22 B

ssh -p 2222 localhost

Это может быть полезно знать в дополнение к опции конфигурационного прокси (которая работает аналогичным образом), о которой упоминал @vinc17.

0
28.01.2020, 02:27

Теги

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