Я управляю этимидве командывсе время подключаюсь к своему экземпляру rds на aws, который защищен брандмауэром (поэтому я туннелирую через экземпляр ec2) следующим образом:
команда 1: открыть туннель (запустить в фоновом режиме)
ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
команда 2: подключение к базе данных через туннельный порт:
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
что потрясающе, но я бы хотел поместить оба этих в одну функцию. Но у меня ничего не получилось:
попытка 1: запуск без фоновых действий:
function db()
{
ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
}
просто говорит мне следующее:
$proddb
[1] 62924
psql: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 6666?
хотя исходная команда выполняется в фоновом режиме:
ps aux | grep host
(standard input):435:abdullah 62924 0.0 0.0 4315660 5828 s006 S 3:06PM 0:00.03 ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
и если я сразу же запускаю следующую команду после нее... я подключаюсь к базе данных просто отлично!
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>
как мне это сделать?
решение1
Первая команда не успела установить туннель, когда была запущена вторая команда, поэтому выдавалась ошибка «Соединение отклонено».
Просто не используйте &
, а вместо этого используйте опцию-f
:
-f
Запрашивает переход ssh в фоновый режим непосредственно перед выполнением команды. Это полезно, если ssh собирается запросить пароли или парольные фразы, но пользователь хочет, чтобы это было в фоновом режиме. Это подразумевает -n. Рекомендуемый способ запуска программ X11 на удаленном сайте — это что-то вроде ssh -f host xterm.
Если параметр конфигурации ExitOnForwardFailure установлен на «yes», то клиент, запущенный с -f, будет ждать, пока все удаленные переадресации портов не будут успешно установлены, прежде чем перейти в фоновый режим.
Собрав все это вместе, замените строку ssh в функции на:
ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
Таким образом, запуск функции несколько раз не оставит (multiple-1) бесполезно запущенным ssh.
Также можно заменить -N
короткой удаленной командой sleep. Таким образом, не будет долгоживущей бездействующей команды ssh, которую нужно искать, если ее нужно убить. Ssh все равно будет ждать окончания использования туннеля перед завершением, поэтому короткая задержка не является проблемой:
ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15
решение2
Это решение от @AB также можно использовать для создания «переходного сервера» между dmz (интернет- или пограничные конечные точки) и mz (бэкенд) с туннелем переадресации порта ssh к бэкенд-хостам, например:
(все соответствующие порты должны быть открыты с помощью firewall-cmd)
desthost_ip — это целевой IP-адрес для службы, к которой осуществляется доступ, с ней должен быть связан отвечающий процесс, например, tomcat, webapp и т. д.
На границе ДМЗ:
ssh -o ExitOnForwardFailure=yes -f -L localhost_ip:port:desthost_ip:port user@dest_ip -i xyz.key sleep 15
Итак, если у localhost также есть публичный IP-адрес; при условии, что на desthost запущена служба на основе https, то может сработать что-то вроде этого:
https://public_ip_of_localhost:port
Это должно открыть веб-страницу службы desthost_ip:port.
ssh -o ExitOnForwardFailure=yes -f -L 192.168.1.199:8001:192.168.2.10:8081 [email protected] -i xyz.key sleep 15
И
https://192.168.1.199:8001
или
https://public_ip_for_192.168.1.199:8001
откроется страница обслуживания 192.168.2.10:8081
.