Еще одна модификация ответа @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
'
ПРОФИ
- Работает на openssh ранее 6.7 (например, CentOS 7)
- Убивает socat при ssh-завершении, вместо того, чтобы заново подключаться к удаленному серверу
- Разрешает непубличный вход по ssh (в отличие от решения ijk)
Характерная черта
- Поскольку эта
-f
опция не используется, вы можете либо использовать открытый ключ и запускать его в фоновом режиме, &
либо войти в систему в интерактивном режиме и использовать Ctrl + Z и использовать то же самое $!
для хранения pid.
МИНУСЫ
- Не легко использовать
-f
опцию ssh, так как вы потеряете pid ssh таким образом. Этот метод основан на запуске на переднем плане и Ctrl + C, чтобы убить.
- Гораздо сложнее
объяснение
socat ...&
запустить socat в фоновом режиме на удаленном сервере
pid=$!
- хранить пид
trap kill\ $pid 0
- запустить kill $pid
по окончании bash
while :; sleep...
- сидеть в бесконечной петле
echo -ne \ \b
- Эхо-пробел с последующим возвратом. Это терпит неудачу, как только ssh отключен. С sleep 5
, это означает, что socat
может работать до 5 секунд после SSH
Примечание: На самом деле протестированы с использованием докер, порт 2375
, /var/run/docker.sock
и переменную окружения DOCKER_HOST='tcp://localhost:2375'
, но должны работать для всех MySQL то же самое
Обновить
Используя SSH Controls , вы можете использовать -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
)