Как сделать удаленный CVS через несколько соединений SSH

1769
Posco Grubb

Я знаю, как использовать удаленный репозиторий CVS, где доступ к удаленному серверу осуществляется через SSH.

Вот моя проблема: удаленный сервер CVS, назовите его «A», доступен по SSH только с компьютеров в той же подсети. В подсети есть один компьютер "B" с открытым SSH для всего мира. (Не спрашивайте почему; я не администратор.) Я могу использовать SSH в «B», а затем оттуда SSH в «A», где находится CVS-репозиторий.

Мой домашний компьютер не находится в одной подсети с «A» и «B». Можно ли получить доступ к хранилищу CVS на «A» через мои SSH-соединения между моим домашним ПК и «B» и между «B» и «A»?

  • Без размещения другого хранилища CVS на «B».
  • И без проверки на «B» и синхронизации моего домашнего ПК с этим проверкой.
1

2 ответа на вопрос

2
innaM

Ответ Кряка - хорошее начало, но у него есть две проблемы. Таким образом, я тоже попробую:

Сначала вы должны создать туннель от вашей локальной рабочей станции до порта SSH машины A. Это легко сделать из командной строки:

ssh -L 127.0.0.1:2200:A:22 B 

(SSH к B и создать туннель от локального порта 127.0.0.1:2200 до удаленного порта A: 22)

Поскольку CVS не позволяет вам указывать порты при использовании :extпротокола, эта простая командная строка не будет достаточно хороша. Вместо этого вам нужно создать или изменить ~/.ssh/configфайл:

Host B LocalForward 127.0.0.1:2200 A:22  Host tunnel2a Port 2200 HostName 127.0.0.1 

Это две записи. Первый говорит ssh создать туннель всякий раз, когда вы переходите по ssh к B. Второй определяет новое имя хоста, tunnel2aкоторое вы можете использовать для cvs.

Сначала откройте туннель с помощью ssh'ing для B:

ssh B 

CVS теперь должен работать так:

cvs -d :ext:username@tunnel2a:/cvsroot/ checkout someModule 
Потрясающе, Манни, спасибо за исправления. лично я не включил бы эту запись хозяина для "B"; я бы назвал его "Btunnel", может быть, и указал бы на "HostName B". таким образом, я получаю туннель только на `ssh Btunnel`, а не на каждом` ssh B`. в противном случае +1. quack quixote 14 лет назад 1
Здорово. Я не знал об автоматической настройке туннелей через файл конфигурации. Благодарю. Posco Grubb 14 лет назад 0
1
quack quixote

Вы должны быть в состоянии сделать это через туннелирование SSH. У меня нет 3 машин для тестирования, но если я правильно понимаю процесс, вам нужны 2 оконных окна.

В первом, SSH к «B» с помощью этой опции: -L 1234:A:22. Это добавит туннель между локальным узлом, через порт 1234, через компьютер "B", к компьютеру "A", через порт 22 (порт SSH).

Команда CVS, которую я изначально написал, не работает, поскольку CVS не поддерживает порты в формате: ext:, как я написал. Если вы используете GUI IDE или клиент CVS, это может позволить вам напрямую ввести альтернативный порт. Если вы делаете это с клиентом командной строки, вам понадобится другой маршрут - добавление псевдонима хоста в ваш ~/.ssh/configфайл с правильным портом. Ответ Манни дает отличный пример того, как это делается, поэтому я не буду здесь это воспроизводить.

Ориентируясь на порт 1234 на локальном хосте, вы попадете в туннель SSH и попадете на порт SSH на A.

Возможно, вы захотите проверить ответы на некоторые связанные вопросы о SSH туннелировании. Спасибо, Манни, за помощь в разработке этих инструкций.

Во втором терминале выполните команду проверки CVS, но замените localhost: 1234 на A:

cvs -d :ext:username@localhost:1234:/cvs checkout test # instead of # cvs -d :ext:username@A:/cvs checkout test 

Потрясающие! Спасибо. У меня была догадка, что туннелирование было частью ответа. Я не знаю, правильна ли ваша команда cvs, но я настроил туннелирование, а затем указал клиенту CVS в Eclipse IDE на использование extssh-соединения с портом localhost 1234, и обнаружились репозитории на «A». Гладкая как масло! Posco Grubb 14 лет назад 0
Это почти правильно, но не совсем. Вы не хотите новый порт на B, где он был бы доступен для всего слова. Вы хотите порт на локальном хосте вашей локальной рабочей станции. `ssh -L` сделает именно это, и поэтому вам нужно изменить командную строку cvs, потому что cvs должен подключаться к localhost, а не к B. innaM 14 лет назад 1
Ой. Кроме того, CVS не позволяет указывать порты при использовании SSH. Duh. innaM 14 лет назад 1
справедливые точки. я бы предположил, что B-> туннель не будет обходить стандартные меры безопасности SSH, так что это не * ужасно *. но я сказал это неправильно; мои инструкции создают порт на локальном хосте, поэтому `B: 1234` действительно должен быть` localhost: 1234`. упс. (Я должен поверить на слово для CVS-not-allow-ports, так как я им не пользуюсь.) quack quixote 14 лет назад 0
Тем не менее я нашел в сети множество сообщений, в которых упоминается та же проблема и одно и то же решение (cvs-over-ssh через альтернативный порт): см., например, http://lists.freebsd.org/pipermail/freebsd-questions/2006- Апрель / 117845.html quack quixote 14 лет назад 0
Я работаю в такой среде, как это. Слава богу, мы недавно отошли от cvs, но я все еще смог попробовать: cvs говорит, что `` спецификация порта CVSROOT действительна только для методов соединения gserver, kserver и pserver` ". CVS может быть настоящей болью. innaM 14 лет назад 0

Похожие вопросы