Ще одна модифікація відповіді @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.
КОНС
- Неможливо легко скористатися параметром
-f
ssh, оскільки таким чином ти втратиш приріст 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
)