Chciałbym skopiować squid.conf
z jednego serwera na drugi.
- Serwery nie rozmawiają ze sobą. Chciałbym przejść przez moją stację roboczą.
- Oba serwery mają plik, więc zostanie on nadpisany na obiekcie docelowym.
- Pliki mają
600
uprawnienia i są własnością root. - logowanie użytkownika root przez ssh jest wyłączone (
PermitRootLogin no
). - Chciałbym to zrobić w jednym wierszu, jeśli to możliwe, ponieważ będzie to część przewodnika konfiguracji.
Wiem co zrobić
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
kopiować pliki między serwerami i zachować uprawnienia. Jednak w tym przypadku otrzymam komunikat „Odmowa zezwolenia”.
Wiem też, że mogę to zrobić:
ssh -t source 'sudo cat /etc/squid/squid.conf'
W ten sposób -t
sudo może poprosić o hasło administratora przed wysłaniem zawartości pliku.
Problem polega na tym, że nie wiem, jak połączyć te techniki w coś, co poprosi o hasło sudo na każdym serwerze i prześle plik do miejsca docelowego. czy to możliwe?
AKTUALIZACJA : Oto najlepsze, co mogłem wymyślić:
ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'
Nazywanie tego jednowarstwowym wydaje się odcinkiem. Myślę, że podzielę to na osobne kroki w przewodniku konfiguracji.
ssh
sudo
file-transfer
itsadok
źródło
źródło
Odpowiedzi:
Łatwiej jest połączyć łańcuch ssh z ssh niż łańcuch ssh z sudo. Tak więc zmiana konfiguracji serwera ssh jest w porządku, sugeruję otwarcie ssh dla katalogu głównego każdego serwera, ale tylko z lokalnego hosta. Możesz to zrobić z
Match
klauzulą wsshd_config
:Następnie możesz skonfigurować łańcuch uwierzytelniania oparty na kluczach od użytkownika zdalnego do użytkownika lokalnego i od użytkownika lokalnego do użytkownika root. Nadal masz ścieżkę uwierzytelniania, więc Twoje logi informują, kto zalogował się jako root, a kroki uwierzytelnienia są takie same, jakby w grę wchodziło sudo.
Aby połączyć się z serwerem jako root, zdefiniuj alias w
~/.ssh/config
następujący sposób:Jeśli nalegasz na użycie
sudo
, uważam, że będziesz potrzebować oddzielnych poleceń, ponieważsudo
nalega na czytanie z terminala (nawet jeśli ma bilet na twoje konto) ¹ i żadnej ze zwykłych metod kopiowania plików (scp, sftp, rsync) obsługa interakcji ze zdalnym terminalem.Trzymając się ssh i sudo, proponowane polecenia można uprościć. Z każdej strony, jeśli sudo zostało skonfigurowane tak, aby nie pytać o hasło ponownie, możesz je uruchomić raz, aby spełnić wymagania dotyczące hasła, a innym razem skopiować plik. (Nie można łatwo skopiować pliku bezpośrednio, ponieważ przeszkadza monit o podanie hasła).
¹, chyba że masz
NOPASSWD
, ale nie pytasz o to.źródło
Match host localhost
.Możesz ustawić,
sudo
aby nie pytać o hasło w następujący sposób:U źródła:
Na celu:
I wykonaj na komputerze:
Ale polecam użyć czegoś takiego jak marionetka . O wiele lepiej i łatwiej rozwiązuje problem z dystrybucją plików konfiguracyjnych.
PS. Nawiasem mówiąc, jeśli skonfigurujesz
sudo
żądanie hasła od użytkownika, ciąg z[sudo] password for user
pojawi się w pliku docelowym.źródło
Zamiast ssh możesz użyć scp do przesłania pliku między serwerami.
Zaloguj się do serwera docelowego:
Przejdź do katalogu docelowego, w którym chcesz skopiować plik.
r - rekurencyjny p - Zachowuje czasy modyfikacji, czasy dostępu i tryby z oryginalnego pliku
źródło
Bez zmiany konfiguracji ssh możesz utworzyć dwa tunele ssh host-> serwer1 i serwer2-> host poprzez połączenie ssh z serwerem2. Połącz te dwa tunele na maszynie hosta (ten sam port). I uruchom sudo na serwerze 2, aby pobrać dane z podłączonych tuneli na serwerze 1 i zapisać je na serwerze 2.
Pomysł jest następujący: 1 - utworzenie lokalnego tunelu z maszyny do maszyny źródłowej na porcie 60000
1b- Utwórz zdalny tunel, aby dotrzeć z powrotem do maszyny
2 - podłącz do maszyny docelowej
3 - uruchom wszystko jako root na maszynie docelowej do pisania
4- połącz się z maszyną źródłową przez tunel. whoami i na localhost oznacza localhost na maszynie $ {target}.
5- spakuj zdalne pliki i wyślij spakowane na standardowe wyjście
6 - otrzymaj pakiet przez stdout i odpowiednio wypakuj pliki z katalogu / path / to / target
Uwaga: Możesz otrzymać do 3 potwierdzeń sshkey i 3 żądań hasła. Ale pliki zostaną skopiowane.
źródło