Быстрый вопрос - я запускаю два linux-компьютера, один - мой собственный рабочий стол, а другой - мой VPS. В целях безопасности на VPS я выбрал сокетные соединения с MySQL (/var/run/mysqld/mysql.sock
). Я знаю, что могу установить туннель следующим образом: ssh -L 3307:127.0.0.1:3306 user@site.com
, если я настрою удаленный sql-сервер на прослушивание какого-то порта, но я хочу знать, могу ли я сделать что-то вроде: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
, тем самым туннелируя два сокета, а не два порта?
Вполне приемлемым решением было бы также перенаправить локальный порт в файл удаленного сокета, но по возможности я стараюсь не иметь запущенных tcp-серверов на удаленном компьютере.
(и да, я знаю, что tcp было бы проще).
В то время, когда был задан вопрос, это было действительно невозможно, но в наши дни это возможно.
Ты можешь и то, и другое: UNIX=>TCP и UNIX=>UNIX forwarding.
Например:
ssh \
-R/var/run/mysql.sock:/var/run/mysql.sock \
-R127.0.0.1:3306:/var/run/mysql.sock \
somehost
Это возможно, так как OpenSSH 6.7.
Начиная с ssh 6.7, socat больше не нужен. Вы можете пересылать сокеты домена unix напрямую, например:
ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote
Подробнее: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
Еще одна модификация ответа @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'
Cleaner
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
'
-f
не используется, вы можете либо использовать открытый ключ и работать в фоновом режиме через и
, либо вы можете войти в систему в интерактивном режиме и использовать Ctrl + Z и использовать тот же $!
для сохранения pid. -f
ssh, так как в этом случае вы потеряете pid ssh. Этот метод основан на запуске на переднем плане и Ctrl + C для уничтожения. socat ... &
- запустить socat в фоновом режиме на удаленном сервере pid = $ !
- сохранить pid trap kill \ $ pid 0
- запустить kill $ pid
при завершении bash while:; спать ...
- сесть в бесконечный цикл echo -ne \ \ b
- Эхо-пробел, за которым следует возврат. Это не удается, как только отключается ssh. В режиме сна 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
)