Ще одна модифікація відповіді @mpontes / @ javier на це
ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Очисник
ssh user@remoteserver -L 9999:localhost:9999 '
socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
pid=$!
trap "kill $pid" 0
while echo -ne " \b"; do
sleep 5
done
'
ПРОС
- Працює з opensh раніше, ніж 6,7 (як CentOS 7)
- Вбиває socat під час припинення ssh замість того, щоб повторно виконувати ssh на віддалений сервер
- Дозволяє непублічний ssh логін (на відміну від ijk рішення)
Особливість
- Оскільки
-fпараметр не використовується, ви можете або використовувати відкритий ключ, і запускати у фоновому режимі через, &або ви можете ввійти в систему інтерактивно, використовувати Ctrl + Z і використовувати те саме, $!щоб зберігати pid.
КОНС
- Неможливо легко скористатися параметром
-fssh, оскільки таким чином ти втратиш приріст ssh. Цей метод залежить від запуску на передньому плані та Ctrl + C для вбивства.
- Набагато складніше
Пояснення
socat ...& - запустити socat у фоновому режимі на віддаленому сервері
pid=$! - зберігати під
trap kill\ $pid 0- запустити kill $pidна припинення bash
while :; sleep... - сидіти в нескінченній петлі
echo -ne \ \b- Ехо-простір з подальшим зворотним простором. Це не вдається, як тільки SSH відключено. З sleep 5, це означає, що socatпісля ssh може працювати до 5 секунд
Примітка: На насправді протестовані з використанням докер, порт 2375, /var/run/docker.sockі змінну оточення DOCKER_HOST='tcp://localhost:2375', але повинні працювати для всіх MySQL те ж саме
Оновлення
Використовуючи управління SSH , ви можете використовувати -fпрапор, використовуючи мій спосіб, просто додайте наступні прапори
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
І отримаєш
ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Тепер ви можете скасувати всі контрольовані сеанси за допомогою
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Ці -oпараметри можуть бути збережені в вашому .ssh/configфайлі, або ви можете використовувати замість -S (але все одно потрібно -o ControlMaster)