Подтвердить что ты не робот

Ssh -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]

то это уже реально поможет.

Есть ли способ сделать это проще?

4b9b3361

Ответ 1

Используйте -L снова в той же команде. Каждый раз с разными портами.

Ответ 2

Именно в ответ на 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 или автоматизировать, если у вас есть много разных хостов/портов для пересылки и для определенных конкретных.

Надеюсь, что это поможет.

Ответ 3

Вы можете использовать следующую функцию 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}

Ответ 4

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

Ответ 5

Для людей, которые пересылают несколько портов через один и тот же хост, можно настроить что-то подобное в их ~/.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.

Ответ 6

Одним из преимуществ входа на сервер с переадресацией портов является облегчение использования 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 могут быть одинаковыми для упрощения процедуры.

Ответ 7

Одним из преимуществ входа на сервер с переадресацией портов является облегчение использования 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 могут быть одинаковыми для упрощения процедуры.

Ответ 8

Я разработал loco для помощи с пересылкой по ssh. Он может быть использован для совместного использования портов 5000 и 7000 на удаленном локально на тех же портах:

pip install loco

loco listen SSHINFO -r 5000 -r 7000

Ответ 9

Если вам нужно простое решение, которое работает в фоновом режиме и которое легко убить - используйте управляющий сокет

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST

Ответ 10

Вы можете использовать эту функцию 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.