Remote-CVS über mehrere SSH-Verbindungen

1961
Posco Grubb

Ich kann ein Remote-CVS-Repository verwenden, bei dem der Zugriff auf den Remote-Server über SSH erfolgt.

Hier ist mein Problem: Der Remote-CVS-Server, der als "A" bezeichnet wird, ist für SSH nur von Computern innerhalb des gleichen Subnetzes zugänglich. Es gibt einen Computer "B" im Subnetz, für den SSH für die Welt offen ist. (Fragen Sie nicht nach dem Grund, ich bin nicht der Administrator.) Ich kann SSH in "B" und von dort SSH in "A", wo sich das CVS-Repository befindet.

Mein Heim-PC befindet sich nicht im selben Subnetz wie "A" und "B". Kann ich über meine SSH-Verbindungen zwischen meinem Heim-PC und "B" sowie zwischen "B" und "A" auf das CVS-Repository auf "A" zugreifen?

  • Ohne ein anderes CVS-Repository auf "B" zu hosten.
  • Und ohne auf "B" ausgecheckt zu sein und meinen Heim-PC mit diesem Auschecken zu synchronisieren.
1

2 Antworten auf die Frage

2
innaM

Quacks Antwort ist ein guter Anfang, hat aber zwei Probleme. Also werde ich es auch versuchen:

Sie müssen zuerst einen Tunnel von Ihrer lokalen Workstation zum SSH-Port von Maschine A erstellen. Dies kann einfach über die Befehlszeile erfolgen:

ssh -L 127.0.0.1:2200:A:22 B 

(ssh nach B und erstellen Sie einen Tunnel vom localport 127.0.0.1:2200 zum Remote-Port A: 22)

Da CVS bei der Verwendung des :extProtokolls keine Ports angeben darf, ist diese einfache Befehlszeile nicht gut genug. Stattdessen müssen Sie Ihre ~/.ssh/configDatei erstellen oder ändern :

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

Dies sind zwei Einträge. Der erste weist ssh an, immer einen Tunnel zu erstellen, wenn Sie von ssh auf B tunnel2awechseln. Der zweite definiert den neuen 'Hostnamen', den Sie für cvs verwenden können.

Öffnen Sie zunächst den Tunnel, indem Sie nach B wechseln:

ssh B 

CVS sollte jetzt so funktionieren:

cvs -d :ext:username@tunnel2a:/cvsroot/ checkout someModule 
grandios, manni, danke für die Korrekturen. Ich würde diesen Host-Eintrag für "B" nicht hinzufügen. Ich würde es vielleicht "Btunnel" nennen und auf "HostName B" verweisen. Auf diese Weise würde ich nur den Tunnel auf "ssh Btunnel" und nicht auf jedes "ssh B" bekommen. sonst +1. quack quixote vor 14 Jahren 1
Cool. Ich wusste nicht, wie Tunnel automatisch über die Konfigurationsdatei eingerichtet werden. Vielen Dank. Posco Grubb vor 14 Jahren 0
1
quack quixote

Sie sollten dazu in der Lage sein, SSH-Tunneling durchzuführen. Ich habe keine 3 Maschinen zum Testen, aber wenn ich den Vorgang richtig verstehe, will man 2 Terminalfenster.

In dem ersten, SSH auf "B" mit dieser Option: -L 1234:A:22. Dadurch wird ein Tunnel zwischen dem localhost an Port 1234 durch Maschine "B" zu Maschine "A" an Port 22 (der SSH-Port) hinzugefügt.

Der CVS-Befehl, den ich ursprünglich geschrieben habe, funktioniert nicht, da CVS keine Ports im Format: ext: unterstützt, wie ich es geschrieben hatte. Wenn Sie einen GUI-IDE- oder CVS-Client verwenden, können Sie möglicherweise einen alternativen Port direkt eingeben. Wenn Sie dies mit dem Befehlszeilenclient tun, benötigen Sie eine andere Route - Sie fügen der ~/.ssh/configDatei einen Host-Aliasnamen mit dem richtigen Port hinzu. Die Antwort von Manni gibt ein gutes Beispiel dafür, wie das gemacht wird, daher werde ich das hier nicht reproduzieren.

Wenn Sie auf localhost auf Port 1234 zielen, stoßen Sie auf den SSH-Tunnel und werden an den SSH-Port auf A geleitet.

Vielleicht möchten Sie die Antworten auf einige verwandte Fragen zum SSH-Tunneling prüfen . Danke Manni, dass Sie mir geholfen haben, diese Anweisungen in Form zu bringen.

Führen Sie im zweiten Terminal Ihren CVS-Überprüfungsbefehl aus, ersetzen Sie jedoch localhost: 1234 für A:

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

Genial! Vielen Dank. Ich hatte eine Ahnung, dass das Tunneln Teil der Antwort war. Ich weiß nicht, ob Ihr Befehl cvs richtig ist, aber ich habe das Tunneln eingerichtet und dann den CVS-Client in der Eclipse-IDE angewiesen, die extssh-Verbindung zum localhost-Port 1234 zu verwenden, und die Repositorys auf "A" wurden angezeigt. Glatt wie Butter! Posco Grubb vor 14 Jahren 0
Das ist fast richtig, aber nicht ganz. Sie möchten nicht, dass der neue Port auf B steht, wo er für das ganze Wort zugänglich wäre. Sie möchten, dass der Port auf dem lokalen Host Ihrer lokalen Workstation liegt. `ssh -L` tut genau das. Daher müssen Sie die cvs-Befehlszeile ändern, da cvs eine Verbindung zu localhost und nicht zu b herstellen muss. innaM vor 14 Jahren 1
Oh. Darüber hinaus erlaubt CVS nicht die Angabe von Ports bei Verwendung von SSH. Duh. innaM vor 14 Jahren 1
faire Punkte. Ich würde davon ausgehen, dass der B-> A-Tunnel die üblichen SSH-Sicherheitsmaßnahmen nicht umgehen würde, also nicht * schrecklich *. aber ich sagte es falsch; Meine Anweisungen erstellen den Port auf dem localhost, also sollte "B: 1234" wirklich "localhost: 1234" sein. Hoppla. (Ich muss Ihr Wort für CVS-nicht erlaubende Ports nehmen, da ich es nicht benutze.) quack quixote vor 14 Jahren 0
Ich fand viele Nachrichten im Netz, die dasselbe Problem und dieselbe Lösung erwähnen (cvs-over-ssh über alternativen Port): siehe zum Beispiel http://lists.freebsd.org/pipermail/freebsd-questions/2006- April / 117845.html quack quixote vor 14 Jahren 0
Ich arbeite in einer Umgebung genau so. Gott sei Dank haben wir uns in letzter Zeit von cvs entfernt, aber ich konnte es trotzdem versuchen: cvs sagt: "Die CVSROOT-Portspezifikation gilt nur für die Verbindungsmethoden gserver, kserver und pserver". CVS kann ein echter Schmerz sein. innaM vor 14 Jahren 0