Ответ 1
Используйте -L
снова в той же команде. Каждый раз с разными портами.
В настоящее время я запускаю группу:
sudo ssh -L PORT:IP:PORT [email protected]
где IP является целью защищенной машины, а PORT представляет собой порты, которые я пересылаю.
Это потому, что я использую множество приложений, к которым я не могу получить доступ без этой пересылки. После выполнения этого я могу получить доступ через localhost:PORT
.
Основная проблема возникла сейчас, когда у меня на самом деле есть 4 из этих портов, которые мне нужно переслать.
Мое решение состоит в том, чтобы открыть 4 оболочки и постоянно искать мою историю назад, чтобы искать точно, какие порты необходимо переслать и т.д., а затем запустить эту команду - по одному в каждой оболочке (необходимо заполнить пароли и т.д.).
Если бы я мог сделать что-то вроде:
sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 [email protected]
то это уже реально поможет.
Есть ли способ сделать это проще?
Используйте -L
снова в той же команде. Каждый раз с разными портами.
Именно в ответ на NaN вы указываете несколько аргументов -L. Я все время это делаю. Вот пример переадресации нескольких портов:
ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22
Примечание: это то же самое, что и -L localhost:8822:REMOTE_IP_1:22
, если вы не укажете localhost
.
Теперь с этим вы можете теперь (с другого терминала):
ssh localhost -p 8822
для подключения к REMOTE_IP_1
на порту 22
и аналогично
ssh localhost -p 9922
для подключения к REMOTE_IP_2
на порту 22
Конечно, нет ничего, что помешало бы вам обернуть это в script или автоматизировать, если у вас есть много разных хостов/портов для пересылки и для определенных конкретных.
Надеюсь, что это поможет.
Вы можете использовать следующую функцию bash (просто добавьте ее в ~/.bashrc
):
function pfwd {
for i in ${@:2}
do
echo Forwarding port $i
ssh -N -L $i:localhost:$i $1 &
done
}
Пример использования:
pfwd hostname {6000..6009}
jbchichoko и yuval дали жизнеспособные решения. Но ответ jbchichoko не является гибким ответом как функцией, и открытые туннели с помощью yuval-ответа не могут быть закрыты ctrl+c
потому что он работает в фоновом режиме. Я даю свое решение ниже, решая оба этих недостатка:
Определение функции в ~/.bashrc
или ~/.zshrc
:
# fsshmap multiple ports
function fsshmap() {
echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
for ((i=($1+1);i<$2;i++))
do
echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
done
line=$(head -n 1 $HOME/sh/sshports.txt)
cline="ssh "$3" "$line
echo $cline
eval $cline
}
Пример запуска функции:
fsshmap 6000 6010 hostname
Результат этого примера:
Вы можете получить доступ к 127.0.0.1:16000~16009
же, как hostname:6000~6009
Для людей, которые пересылают несколько портов через один и тот же хост, можно настроить что-то подобное в их ~/.ssh/config
Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4
и он становится простым ssh all-port-forwards
.
Одним из преимуществ входа на сервер с переадресацией портов является облегчение использования Jupyter Notebook. Эта ссылка дает отличное описание того, как это сделать. Здесь я хотел бы сделать некоторые резюме и расширения для всех вас, ребята, чтобы ссылаться.
Ситуация 1. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный рабочий компьютер с именем Host-B.
ssh [email protected] -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-B, но увидеть его в Host-A.
Ситуация 2. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный компьютер с именем Host-B и оттуда войдите на удаленный рабочий компьютер с именем Host-C. Это обычно имеет место для большинства аналитических серверов в университетах и может быть достигнуто с помощью двух ssh -L
связанных с -t
.
ssh -L port_A:localhost:port_B [email protected] -t ssh -L port_B:localhost:port_C [email protected]
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-C, но увидеть его в Host-A.
Ситуация 3. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный компьютер с именем Host-B и оттуда войдите на удаленный рабочий компьютер с именем Host-C и, наконец, войдите в систему с удаленного рабочего компьютера Host- D. Обычно это не так, но может случиться когда-нибудь. Это расширение Ситуации 2 и та же логика может быть применена к большему количеству машин.
ssh -L port_A:localhost:port_B [email protected] -t ssh -L port_B:localhost:port_C [email protected] -t ssh -L port_C:localhost:port_D [email protected]
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-D, но увидеть его в Host-A.
Обратите внимание, что port_A, port_B, port_C, port_D могут быть случайными числами, кроме общих номеров портов, перечисленных здесь. В ситуации 1 port_A и port_B могут быть одинаковыми для упрощения процедуры.
Одним из преимуществ входа на сервер с переадресацией портов является облегчение использования Jupyter Notebook. Эта ссылка дает отличное описание того, как это сделать. Здесь я хотел бы сделать некоторые резюме и расширения для всех вас, ребята, чтобы ссылаться.
Ситуация 1. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный рабочий компьютер с именем Host-B.
ssh [email protected] -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-B, но увидеть его в Host-A.
Ситуация 2. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный компьютер с именем Host-B и оттуда войдите на удаленный рабочий компьютер с именем Host-C. Это обычно имеет место для большинства аналитических серверов в университетах и может быть достигнуто с помощью двух ssh -L
связанных с -t
.
ssh -L port_A:localhost:port_B [email protected] -t ssh -L port_B:localhost:port_C [email protected]
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-C, но увидеть его в Host-A.
Ситуация 3. Войдите в систему с локального компьютера с именем Host-A (например, с вашего собственного ноутбука) на удаленный компьютер с именем Host-B и оттуда войдите на удаленный рабочий компьютер с именем Host-C и, наконец, войдите в систему с удаленного рабочего компьютера Host- D. Обычно это не так, но может случиться когда-нибудь. Это расширение Ситуации 2 и та же логика может быть применена к большему количеству машин.
ssh -L port_A:localhost:port_B [email protected] -t ssh -L port_B:localhost:port_C [email protected] -t ssh -L port_C:localhost:port_D [email protected]
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D
Затем вы можете открыть браузер и ввести: http://localhost: port_A/, чтобы выполнить свою работу на Host-D, но увидеть его в Host-A.
Обратите внимание, что port_A, port_B, port_C, port_D могут быть случайными числами, кроме общих номеров портов, перечисленных здесь. В ситуации 1 port_A и port_B могут быть одинаковыми для упрощения процедуры.
Я разработал loco для помощи с пересылкой по ssh. Он может быть использован для совместного использования портов 5000 и 7000 на удаленном локально на тех же портах:
pip install loco
loco listen SSHINFO -r 5000 -r 7000
Если вам нужно простое решение, которое работает в фоновом режиме и которое легко убить - используйте управляющий сокет
# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST
Вы можете использовать эту функцию zsh (вероятно, работает и с bash) (поместите ее в ~/.zshrc
):
ashL () {
local a=() i
for i in "[email protected][2,-1]"
do
a+=(-L "${i}:localhost:${i}")
done
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}
Примеры:
ashL [email protected] 6480 7690 7477
ashL [email protected] {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.