scp do zdalnego serwera za pomocą sudo


55

Mam plik na serwerze A (który jest za NATem, który nie jest bezpośrednio adresowalny). Plik musi zostać skopiowany na serwer B w katalogu ograniczonym do roota. Mam konto na serwerze B z uprawnieniami sudo. Jaka jest składnia polecenia scp?



zamknąłem starsze pytanie jako duplikat tego pytania, ponieważ pytanie pytającego nigdy nie odzyskało własności tego pytania.
— quack quixote

Odpowiedziałem dalej inny wpis jak możesz dostosować scp do sudo bezpośrednio dla Ciebie. Jest to podobne do tego, co robi WinSCP.
— YoYo

Odpowiedzi:


50

Najpierw musisz skopiować plik do miejsca, w którym masz dostęp do zapisu bez sudo,

scp yourfile serverb:

Następnie przenieś plik za pomocą sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Jeśli nie masz miejsca do zapisu, utwórz tymczasowy katalog z uprawnieniami do zapisu dla swojego użytkownika.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

5
/ tmp jest dobrym miejscem do pisania plików tymczasowych, do których (zazwyczaj) wszyscy użytkownicy mają dostęp.
— Doug Harris

3
@Doug: Zauważ, że / tmp może znajdować się w pamięci RAM lub w punkcie montażu / i nie musi być wystarczająco duży, aby obsługiwać duże pliki.
— Ravachol

1
Cokolwiek próbujesz osiągnąć, chmod 777 zazwyczaj jest to zły sposób. Zastanów się, co mogłoby się stać, gdyby ktoś inny był zalogowany i wiedział, że zamierzasz uruchomić ten kod.
— tripleee

ssh sudo nie działa dla mnie - narzeka „brak tty i nie określono programu askpass”?
— Ross Presser

38

Z SCP musisz zrobić w dwóch krokach, jednak możesz to zrobić w jednym z rsync w następujący sposób:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Uwaga: to wymaga NOPASSWD konfiguracja sudo. Jeśli musisz wprowadzić hasło do sudo, potrzebny jest dwuetapowy sposób.

Aby skopiować katalog, musisz dodać -r parametr. I -v dla pełnego wydruku.


Aby użyć powyższej metody z poświadczeniami, musisz dodać je do swojego ~/.ssh/config plik, np.

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

4
Jest to zdecydowanie najprostszy sposób, aby to zrobić.
— Matt White

Błąd sudo: sorry, you must have a tty to run sudo naprawione przez -e "ssh -tt".
— mj41

@ mj41 Z -e "ssh -tt", Dostaję protocol version mismatch -- is your shell clean?. Jakieś wskazówki, jak to naprawić?
— ax.

18

Możesz użyć ssh i tar do obejścia tego problemu:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Najpierw aktualizuje datownik sudo (w razie potrzeby pytając o hasło, które wymaga tty ( ssh -t )), a następnie używa sudo do zdalnego tworzenia tarballa i lokalnego wyodrębniania.

„tar” w RedHat 5 wymaga opcji „--preserve” po komendzie „xpsf -”.


Tylko uwaga: jeśli dostaniesz tar: Invalid replacement string, usuwanie -s wydaje się, że to naprawia (nie wiesz, czego potrzebujesz s w każdym razie). Wielkie dzięki; to jest niesamowite.
— RecursivelyIronic

To wymagałoby tty_tickets być wyłączonym, prawda?
— Jacob Budin

@JacobBudin tak.
— blueyed

4

Możesz użyć sftp za pomocą polecenia sudo, na przykład:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Ta i rsync metody są prawdopodobnie najbardziej bezpośrednim sposobem zrobienia tego w jednym kroku. Szkoda, że ​​zadanie scp w mrówce go nie obsługuje. Możesz ustawić, aby używał sftp, ale nie możesz modyfikować zdalnego podprogramu. Należy zauważyć, że podprogram będzie różny w zależności od typu serwera (solaris może być inny).
— YoYo

0

Jeśli za każdym razem musisz wpisać hasło do sudo, możesz zapisać je w pliku:

echo "Enter password: "; read -s password; echo $password > password_file

a następnie wyślij go wraz z plikiem źródłowym.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Możesz użyć tee zamiast sponge jeśli nie masz dodatkowych przedmiotów.


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Skopiuje określony plik ze źródła do / tmp / na bieżącym serwerze


Uruchomi sudo lokalnie, nie dając zdalnie żadnych podwyższonych uprawnień.
— YoYo

To po prostu nie zadziała, jak mówi @Yoyo.
— Mani

scp prawdopodobnie nie połączy się, ponieważ odczyta klucz roota
— Pierre-Olivier Vares
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.