$n
<= десятичное значение перед запятой.%h
, ключами которого являются числа слева от =
и значения справа. $n
, key, coresp. ценность.$,
= 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
Во-первых, вот лучшее решение, чем то, которое приведено в ссылке, указанной в вопросе, поскольку это новое решение не зависит от внешних инструментов, таких как 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.
на хосте B:
B$ ssh localhost -L 2222:C:22 -g
Во время работы все могут подключиться к хосту C через B:2222 (tcp порт 2222)
Для постоянного решения вы можете запустить screen
на хосте B, а команду ssh оставить в фоне.
(вы можете использовать более простую программу для перенаправления tcp, чем ssh на localhost: например, redir )
Решение для интерактивной переадресации, которое не требует открытия порта на B, но одного на A, следующее:
На A:
ssh -fNL 2222:C:22 B
ssh -p 2222 localhost
Это может быть полезно знать в дополнение к опции конфигурационного прокси (которая работает аналогичным образом), о которой упоминал @vinc17.