6

У нас есть сервер для подключения. Затем мы используем сервер A для подключения к базе данных B. Настройте так в Putty (windows):

сессии1:
1. подключиться к admin @ serverA
2. настроить локальный туннельный порт 10022 для базы данных B:22
3. запустить 'vi'

сессии2:
1. подключиться к admin @ localhost:10022
2. настроить туннельный локальный порт 1521 для базы данных 1521
3. запустить 'vi'

(vi используется для удержания сессии)

Затем программа использует localhost:1521 для подключения к базе данных.

Интересно, смогу ли я сделать это с помощью одной команды или командного файла в Cygwin? Обратите внимание, что я не могу открыть порт на сервере А

5 ответов5

6
ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB

или используя plink (Putty link) из командного окна:

plink -ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB
3

Что касается выполнения одной команды, предыдущий ответ верен, но если второй ssh требует пароль, он, вероятно, не будет работать (в зависимости от конфигурации ssh по умолчанию). Вы должны будете принудительно назначить псевдо-tty, используя опцию -t, например:

ssh -t -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB

(это работает с помощью команды cygwin ssh)

2

Для этого вы можете использовать опцию ProxyCommand. Поместите следующее в ваш конфигурационный файл ssh (который обычно находится в ~/.ssh/config):

Host direct-serverB
ProxyCommand ssh admin@serverA ssh admin@serverB sshd -i

Затем вы можете подключиться к серверу B, как если бы он был непосредственно доступен:

% ssh -L 1521:localhost:1521 admin@direct-serverB

Эта команда не открывает никаких портов на промежуточном сервере A. Однако у него есть недостаток, заключающийся в том, что вам необходимо проходить аутентификацию на сервере В как на сервере А, так и на локальном компьютере.

Если на сервере А установлен netcat , вы можете записать это в конфигурацию ssh:

Host direct-serverB
ProxyCommand ssh admin@serverA nc -q0 serverB 22

и пропустите этап аутентификации serverA → serverB.

1

Я бы попробовал запустить:

ssh admin@serverA -L 10022:databaseB:22
ssh admin@localhost -p 10022 -L 1521:database2:1521

Но человек, я съеживаюсь, даже предлагая это. У людей, которые взорвались от базы данных, вероятно, были веские причины для этого. Поговори с ними.

0

Вот что сработало для меня.
- Моя цель состояла в том, чтобы указать клиентскому приложению localhost:1115 и подключить его к target_db_server:1433.
- target_db_server доступен только с jumpserver2.
- jumpserver2 доступен только с jumpserver1.
- Поэтому команда подключается к jumpserver1, запрашивает токен (в моем случае), затем подключается к jumpserver2 и запрашивает пароль для этого сервера, после чего локальный клиент может установить соединение.

ssh -L 1115:127.0.0.1:1115 username@jumpserver1 -tt ssh -L 1115:target_db_server:1433  username@jumpserver2

Я обнаружил, что время соединения истекло, что не было идеальным. Следующее исправило это:

echo "Host *" >> ~/.ssh/config
echo "ServerAliveInterval 60" >> ~/.ssh/config

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .