2

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

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

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

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

3 ответа3

3

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

Сначала вам нужно создать туннель от вашей локальной рабочей станции до порта 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
1

Вы должны быть в состоянии сделать это через туннелирование 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

0

Если у вас возникли проблемы с ответом innaM , даже если он точный и не повторяется здесь, возможно, некоторая дополнительная информация может помочь нечетному пользователю, имеющему проблемы с реализацией ответа.

  • В случае затруднений обязательно поэкспериментируйте с командами ssh и cvs в командной строке, прежде чем переходить к точке добавления конфигурации для LocalForward в файле конфигурации . Раннее редактирование файла конфигурации может быть обескураживающим, если что-то в конкретной настройке немного отличается от среды ответчика.

  • Одна из первых проблем, с которой можно столкнуться, редкая, но решающая. Крайне важно знать правильное расположение файла конфигурации . В большинстве случаев правильное расположение - ~/ .ssh/ config / $ {HOME} /. Ssh / config, но иногда это не так. Правильное расположение файла конфигурации требуется для решения этой проблемы даже при экспериментах из командной строки. Смотрите также: ssh больше не использует ~/ .ssh/ config

  • Существует также возможность столкнуться с проблемами разрешений. Во время устранения неполадок обычно безопасно установить для пользователя и папку .ssh, и файл конфигурации только для чтения (т. Е. Chmod 600), хотя необязательно, чтобы разрешения были такими жесткими. В любом случае папка и файл не должны быть доступны для записи другим пользователям.

  • Существует также вопрос правильной установки CVS_RSH . Даже если среда ssh настроена правильно, последняя команда cvs завершится неудачно с очень бесполезным сообщением, если CVS_RSH не подготовлен должным образом.

    CVS_RSH=ssh; export CVS_RSH
    

    Без CVS_RSH команда cvs, скорее всего, вернет:

    -l: bad option(s)
    cvs [... aborted]: end of file from server (consult above messages if any)
    
  • Для работы с туннелем необязательно иметь две открытые оболочки. В ответе innaM говорится, что нужно настроить туннель с помощью:

    ssh B
    

    Это оставляет вас открытой оболочкой на B, а не на локальной рабочей станции. Нет необходимости открывать оболочку на B. Можно работать полностью внутри одной оболочки, настроив туннель с помощью:

    ssh -fN B
    

    Эта команда оставляет вас в приглашении локальной системы, а не в приглашении B. Предостережение заключается в том, что в случае ssh B можно прервать пересылку, просто выйдя из системы B, тогда как в случае ssh -fN B процесс ssh находится в фоновом режиме и должен быть остановлен другими средствами, чтобы разорвать вниз экспедитор.

  • Когда нескольким системам требуются альтернативные номера портов, добавление параметра « Порт» в соответствующий раздел « Конфигурирование хоста » является целесообразным.

  • Имейте в виду, что файл конфигурации может указывать пользователя в разделах хоста, когда имена пользователей различаются в разных системах.

    Другая потенциальная ловушка может возникнуть в случаях, когда имена пользователей указаны неправильно. Несмотря на то, что часто правильно и правильно указывать системные имена пользователей как user @ hostname, НЕ используйте эту запись в файле конфигурации или в параметре ssh -L . Например, это будет ужасно неправильно и может быть очень трудно распознать:

    ssh -L 2200:Auser@A:22 Buser@B
    

    (Это никогда не является обязательным использованием CVS, поскольку Auser @ указывается с помощью cvs -d: ext: Auser @ A: / path / to / repository .)

    Хотя вполне допустимо указывать Buser @ B, Auser @ нельзя указывать таким образом ни в командной строке, ни в файле конфигурации . Ошибка команды cvs с неправильной командой, подобной этой, может возвращать что-то вроде:

    ssh_exchange_identification: read: Connection reset by peer
    cvs [checkout aborted]: end of file from server (consult above messages if any)
    

    Отладка может быть сложной и может привести к другим необъяснимым сообщениям, таким как:

    SSH Tunnel: channel 3: open failed: administratively prohibited
    

    Проблема заключается в том, что при использовании с -L или LocalForward Auser @ становится частью имени хоста (или IP-адреса), поэтому он не преобразуется в ожидаемый IP-адрес.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .