Mam serwer Ubuntu, z którym łączę się za pomocą SSH.
Muszę przesłać pliki z mojego komputera /var/www/
na serwer, pliki /var/www/
są własnością root
.
Korzystając z PuTTY, po zalogowaniu muszę sudo su
najpierw wpisać hasło i hasło, aby móc modyfikować pliki /var/www/
.
Ale kiedy kopiuję pliki za pomocą WinSCP, nie mogę tworzyć plików do tworzenia / modyfikowania /var/www/
, ponieważ użytkownik, z którym się łączę, nie ma uprawnień do plików /var/www/
i nie mogę powiedzieć, sudo su
co mam w przypadku sesji ssh .
Czy wiesz jak sobie z tym poradzić?
Gdybym pracował na moim komputerze lokalnym, zadzwoniłbym, gksudo nautilus
ale w tym przypadku mam tylko dostęp do terminalu.
Odpowiedzi:
Masz rację, nie ma,
sudo
kiedy pracujeszscp
. Obejściem tego problemu jestscp
przesłanie plików do katalogu, w którym użytkownik ma uprawnienia do tworzenia plików, a następnie zalogowanie się za pomocą ssh isudo
przeniesienie / skopiowanie plików do miejsca docelowego.Innym rozwiązaniem może być zmiana uprawnień / własności katalogów, do których przesyłasz pliki, aby Twój nieuprzywilejowany użytkownik mógł pisać do tych katalogów.
Ogólnie rzecz biorąc, praca na
root
koncie powinna być wyjątkiem, a nie regułą - sposób, w jaki piszesz swoje pytanie, sprawia, że myślę, że możesz go trochę nadużywać, co z kolei prowadzi do problemów z uprawnieniami - w normalnych okolicznościach nie potrzebujesz uprawnienia superadministratora do uzyskiwania dostępu do własnych plików.Technicznie rzecz biorąc, możesz skonfigurować Ubuntu, aby zezwalał na zdalne logowanie bezpośrednio jako
root
, ale ta funkcja jest wyłączona z jakiegoś powodu, więc zdecydowanie odradzam to robić.źródło
scp -R mysite [email protected]:/home/dimitris/
2.ssh [email protected]
3.sudo mv ~/mysite /var/www
- jest to proces dwuetapowy, najpierwscp
pliki do katalogu domowego, następnie logujesz się przez ssh i kopiujesz / przenosisz pliki tam, gdzie powinny byćInną metodą jest kopiowanie przy użyciu tar + ssh zamiast scp:
źródło
sudo: sorry, you must have a tty to run sudo
. Jeśli dodam „-t”, aby przydzielić TTY, to dostanęPseudo-terminal will not be allocated because stdin is not a terminal.
. Nie widzę tego działającego bez sudo bez hasła.ssh -t [email protected] "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, zarchiwizuj go, zmień uprawnienia za pomocąchmod
ichown
, a następnie skopiuj go do lokalnego. Zwłaszcza jeśli jest to katalog.Szybki sposób
Z serwera na komputer lokalny:
Z komputera lokalnego na serwer:
źródło
Możesz również użyć
ansible
do tego celu.Skopiuj na zdalny host za pomocą modułu ansible
copy
:Pobierz ze zdalnego hosta za pomocą modułu ansible
fetch
:UWAGA:
-i HOST,
składni nie jest literówką. Jest to sposób na użycie ansible bez potrzeby posiadania pliku inwentarza.-b
powoduje, że akcje na serwerze są wykonywane jako root.-b
rozwija się do--become
, a domyślnie--become-user
jest to root, przy czym domyślnie--become-method
jest to sudo.flat=yes
kopiuje tylko plik, nie kopiuje całej zdalnej ścieżki prowadzącej do plikucopy
moduł, ale nie przezfetch
moduł.Konkretne wywołanie tego pytania
Oto przykład, który jest konkretny i w pełni określony, przy założeniu, że katalog na twoim hoście lokalnym zawierający pliki do dystrybucji to
sourcedir
i że nazwa hosta zdalnego celu tohostname
:Zwięzłe wywołanie jest następujące:
PS, zdaję sobie sprawę z tego, że powiedzenie „po prostu zainstaluj to wspaniałe narzędzie” jest jakby głuchą odpowiedzią. Ale uważam, że jest bardzo przydatny do administrowania zdalnymi serwerami, więc zainstalowanie go z pewnością przyniesie inne korzyści poza wdrażaniem plików.
źródło
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
poprawnej składni? Myślę, że łatwo jest stracić taką interpunkcję podczas czytania polecenia. (Dla czytelnika mam na myśli, jeśli nie skorupę).-i 'host,'
samo co-i host,
lub-i "host,"
. Zasadniczo wolę, aby te inwokacje były jak najkrótsze, aby nie zniechęcały, ale powinieneś swobodnie wypowiadać się tak wyraźnie, jak uważasz, że jest to konieczne dla jasności.Po uruchomieniu
sudo su
wszelkie utworzone pliki będą własnością root, ale domyślnie nie można zalogować się bezpośrednio jako root za pomocą ssh lub scp. Nie można również używać sudo z scp, więc pliki nie są użyteczne. Napraw to, zgłaszając własność do swoich plików:Zakładając, że twoja nazwa użytkownika to dimitri, możesz użyć tego polecenia.
Odtąd, jak wspomniano w innych odpowiedziach, sposobem „Ubuntu” jest używanie sudo, a nie rootowanie. Jest to użyteczny paradygmat z dużymi zaletami bezpieczeństwa.
źródło
sudo chow ...
dla każdego pojedynczego katalogu: S-R
inchown
mówi mu, aby zmieniła własność tego katalogu, a wszystkie pliki i katalogi podrzędne rekurencyjnie ... abyś mógł robić, co chcesz.Czy najlepszym sposobem może być użycie
rsync
( Cygwin / cwRsync w Windows) przez SSH?Na przykład, aby przesłać pliki z właścicielem
www-data
:W twoim przypadku, jeśli potrzebujesz uprawnień roota, polecenie będzie wyglądać tak:
Zobacz: scp do zdalnego serwera za pomocą sudo .
źródło
Jeśli używasz narzędzi OpenSSH zamiast PuTTY, możesz to zrobić, inicjując
scp
transfer plików na serwerze za pomocąsudo
. Upewnij się, żesshd
na komputerze lokalnym działa demon. Dzięki temussh -R
możesz dać serwerowi sposób na skontaktowanie się z twoim komputerem.Na twoim komputerze:
Oprócz zalogowania się na serwerze, przekieruje ono każde połączenie wykonane na porcie 11111 serwera do portu 22 komputera: portu, na którym
sshd
nasłuchujesz.Na serwerze rozpocznij przesyłanie plików w następujący sposób:
źródło
Możesz użyć skryptu, który napisałem, inspirowanego tym tematem:
ale wymaga to trochę szalonych rzeczy (które są przy okazji automatycznie wykonywane przez skrypt)
Oto skrypt:
źródło
Możesz łączyć ssh, sudo i np. Tar, aby przenosić pliki między serwerami bez możliwości logowania się jako root i bez uprawnień dostępu do plików z użytkownikiem. Jest to trochę dziwne, więc napisałem skrypt, aby to pomóc. Skrypt można znaleźć tutaj: https://github.com/sigmunau/sudoscp
lub tu:
źródło
Oto zmodyfikowana wersja odpowiedzi Willie Wheeler, która przesyła pliki przez tar, ale obsługuje także przekazywanie hasła do sudo na zdalnym hoście.
Odrobina dodatkowej magii tutaj to opcja -S sudo. Ze strony podręcznika sudo:
Teraz tak naprawdę chcemy, aby wyjście tar zostało przesłane do ssh, co przekieruje standardowe wejście ssh na standardowe wyjście tar, usuwając wszelkie sposoby przekazywania hasła do sudo z interaktywnego terminalu. (Możemy użyć funkcji sudo ASKPASS na odległym końcu, ale to inna historia.) Możemy dostać hasło do sudo, przechwytując je z wyprzedzeniem i przygotowując je do wyjścia tar, wykonując te operacje w podpowłoce i przesyłając dane wyjściowe podpowłoka w ssh. Ma to tę dodatkową zaletę, że nie pozostawia zmiennej środowiskowej zawierającej nasze hasło wiszące w interaktywnej powłoce.
Zauważysz, że nie wykonałem polecenia „czytaj” z opcją -p, aby wydrukować monit. Wynika to z faktu, że zapytanie o hasło z sudo jest wygodnie przekazywane z powrotem do stderr naszej interaktywnej powłoki przez ssh. Możesz się zastanawiać "jak działa sudo, biorąc pod uwagę, że działa ono w ssh po prawej stronie naszej rury?" Kiedy wykonujemy wiele poleceń i przesyłamy dane wyjściowe jednego do drugiego, powłoka nadrzędna (w tym przypadku powłoka interaktywna) wykonuje każde polecenie w sekwencji natychmiast po wykonaniu poprzedniego. Gdy każde polecenie za potokiem jest wykonywane, powłoka nadrzędna dołącza (przekierowuje) wyjście standardowej strony lewej do standardowej strony prawej. Dane wyjściowe stają się następnie danymi wejściowymi, gdy przechodzą przez procesy.
Nasza interaktywna powłoka to PID 7168, nasza podpowłoka to PID 7969, a nasz proces ssh to PID 7970.
Jedyną wadą jest to, że read zaakceptuje dane wejściowe, zanim sudo zdąży odesłać swój monit. W przypadku szybkiego połączenia i szybkiego zdalnego hosta nie zauważysz tego, ale możesz to zrobić, jeśli jedno z nich jest wolne. Każde opóźnienie nie wpłynie na możliwość wprowadzenia monitu; może pojawić się po rozpoczęciu pisania.
Uwaga Po prostu dodałem wpis pliku hosta dla „remote_Host” do mojego komputera lokalnego w celu pokazu.
źródło