Представим типичную конфигурацию сети, когда рабочие станции не имеют прямого доступа в Интернет. И нужно на одной из этих станций (далее - Host) получить доступ к репозиторию git, находящемся в Интернет, например, на GitHub (забудем на мгновенье, что доступ возможен и через транспорт http).
При попытке сделать clone на Solarized (мне эта подборка цветовых схем очень нравится), получим предсказуемый ответ:
host$ git clone git://github.com/altercation/solarized.git Initialized empty Git repository in /home/ole/bin/solarized/.git/ github.com[0: 207.97.227.239]: errno=Connection refused fatal: unable to connect a socket (Connection refused)
Но, к счастью, в сети есть сервер (назову его Gate), у которого есть доступ в Интернет.
На “ущемлённом” компьютере Host убеждаюсь, что установлен Netcat:
host$ nc -h OpenBSD netcat (Debian patchlevel 1.89-3ubuntu2)
Если нет, то ставлю его (netcat есть практически во всех Unix).
Ubuntu/Debian:
host$ sudo aptitude install netcat-openbsd
Mac OS X (Homebrew):
host$ brew install netcat
Создаю файл (192.168.1.1 - адрес Gate, подкорректируйте):
host$ mkdir -p ~/bin host$ vim ~/bin/git-proxy-wrapper.sh #!/bin/sh nc -x 192.168.1.1:1080 -X 5 $* host$ chmod +x ~/bin/git-proxy-wrapper.sh
Выставляю переменную окружения GIT_PROXY_COMMAND (сначала в текущей сессии, а потом можно добавить команду в .bash_profile):
host$ export GIT_PROXY_COMMAND=~/bin/git-proxy-wrapper.sh
Перехожу к Gate. Запускаю ssh в режиме SOCKS-прокси, прохожу аутентификацию (-N - чтобы не входить в shell, -f - перейти в фоновый режим):
gate$ ssh -D 192.168.1.1:1080 -Nf localhost ole@localhost's password: *******
На Host запускаю клонирование, всё работает:
host$ git clone git://github.com/altercation/solarized.git Initialized empty Git repository in /home/ole/tmp/solarized/.git/ remote: Counting objects: 1991, done. remote: Compressing objects: 100% (1288/1288), done. remote: Total 1991 (delta 656), reused 1909 (delta 583) Receiving objects: 100% (1991/1991), 33.03 MiB | 4.14 MiB/s, done. Resolving deltas: 100% (656/656), done.
Доступ получен. Приятно. Описанный метод работает как на Linux, так на Mac.