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?

Neil
źródło
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
Johan
źródło
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
MasterCheffinator
źródło
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 -”.

blueyed
źródło
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
DaniloNC
źródło
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.

Jan Tojnar
źródło
-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

Kumar
źródło
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