Różnice w ścieżce Subversion dla svn i svn + ssh

10

[02:48] [root @ server: ~] ps ax | grep svn 23986? Ss 0:00 / usr / bin / svnserve -d -r / srv / svn Jak widać z argumentów, moim katalogiem głównym svn jest / srv / svn.

Teraz trochę magii ze zdalnej maszyny ...

To działa:

> svn co svn://[email protected]/test-repo

Ale to nie:

> svn co svn+ssh://svn-user@<putty-session-name>/test-repo
'No repository found in 'svn+ssh://svn-user@<putty-session-name>/test-repo'

Zabawy dla kilku godzinach znalazłem że appearantly jeśli mogę użyć ssh tunel, jestem w stanie uzyskać mojego repo przy użyciu następujących:

> svn co svn+ssh://svn-user@<putty-session-name>/srv/svn/test-repo

... co oznacza, że ​​powinienem podać pełną ścieżkę fizyczną do repozytorium. Co?

Andrejs Cainikovs
źródło

Odpowiedzi:

13

Jak powiedział womble, rzeczywiście jest to „cecha” svn nad ssh.

Svn + ssh działał bez określania pełnej ścieżki do repozytoriów, ponieważ serwer svn miał skrypt otoki svnserve zamiast oryginalnego pliku binarnego svnserve. Później, podczas aktualizacji subversion, skrypt ten został zastąpiony oryginalnym plikiem binarnym.

Rozwiązanie:

  1. Zmień nazwę svnserve na bin

    mv /usr/bin/svnserve /usr/bin/svnserve.bin
    
  2. Zapisz ten skrypt jako / usr / bin / svnserve:

    #!/bin/sh
    exec /usr/bin/svnserve.bin -r /srv/svn "$@"
    
  3. Zaktualizuj uprawnienia

    chmod 755 /usr/bin/svnserve
    
Andrejs Cainikovs
źródło
1
Miałem ten sam problem oprócz odwrotnej. Spędziłem godziny próbując dowiedzieć się, dlaczego nie mogłem zrobić svn + ssh: // host / path / to / repo, ponieważ miałem uruchomiony skrypt, który automatycznie przekierował mnie do katalogu głównego svn. Wszystko, co musiałem zrobić, to svn + ssh: // host / repo.
Bot
Czy root może być ustawiony jako zmienna, a następnie mieć logikę, która usuwa root z $ @, jeśli jest błędnie podany? Pozwoliłoby to uniknąć problemów takich jak @Bot.
MattPark
5

Wynika to z faktu, że svn over SSH ( svn+ssh://) po prostu uzyskuje dostęp do repozytorium subversion „lokalnie”, używając SSH jako transportu, a zatem masz dostęp do całego systemu plików. Svnserve, przeciwnie, mówi się: „Rozpocznij swoje ścieżki /srv/svn, więc nie musisz określać go ręcznie.

womble
źródło
Dziękuję za twoją opinię, ale nie jest. Wszystko działało pięknie, dopóki nie wszystko spieprzyłem, jak zwykle.
Andrejs Cainikovs
Więc napraw wszystko, co spieprzyłeś.
womble
Masz rację, womble. Wygląda na to, że znalazłem problem.
Andrejs Cainikovs
3

Możesz edytować polecenie logowania ssh dla użytkowników korzystających z svn + ssh, edytując ~ / .ssh / uprawnione_ klucze użytkownika subversion. Linia dla użytkownika będzie wyglądać następująco:

command="/usr/bin/svnserve -r /srv/svn [other svnserve options]" <key type> <user key> <key comment>

W książce svn jest więcej sztuczek svn + ssh

slubman
źródło
0

samo w sobie jest to bardziej pytanie, ale jest naprawdę związane z tym pytaniem.

po skonfigurowaniu svn + ssh z kluczami prywatnymi / publicznymi nie mogę uzyskać dostępu do mojego repozytorium przy użyciu ścieżek względnych w następujący sposób:

svn co svn+ssh://svn@SERVERIP/simple-webapp-svn simple-webapp-svn

ponieważ otrzymuję ten błąd:

svn: URL 'svn+ssh://svn@SERVERIP/simple-webapp-svn' doesn't exist

ale tylko tak:

svn co svn+ssh://svn@SERVERIP/home/svn/projects/simple-webapp-svn simple-webapp-svn

To jest plik Author_keys2, który mam w katalogu /home/svn/.ssh

$ sudo cat /home/svn/.ssh/authorized_keys2
command="/usr/bin/svnserve.bin -t --tunnel-user=USERNAME",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa [rsa-key] [user-note]

oraz plik svnserve.bin sugerowany przez Andrejsa w poprzedniej odpowiedzi

$ cat  /usr/bin/svnserve.bin 
#!/bin/sh
exec /usr/bin/svnserve -r /home/svn/projects "$@"

Myślałem nawet o problemach z uprawnieniami, które są wymienione tutaj:

-rwxr-xr-x 1 root root 63684 2009-12-12 06:45 /usr/bin/svnserve
-rwxr-xr-x 1 root root    61 2010-08-25 17:19 /usr/bin/svnserve.bin

Naprawdę nie mogę znaleźć rozwiązania ...

mox601
źródło
Nie przeczytałeś mojej odpowiedzi poprawnie. Powinieneś zmienić nazwę svnserve binary na svnserve.bin i zapisać skrypt otoki, który tam masz, jako svnserve. Lub po prostu zawartość obu plików powinna zostać zamieniona.
Andrejs Cainikovs,
Myślę, że wywołanie svnserve.bin z autoryzowanego_klucza2 i w tym pliku wykonującym svnserve powinno być dokładnie takie samo, prawda? Podobało mi się to, aby zapobiec zmianie nazwy svnserve binary, czy uważasz, że to źle?
mox601,