Ich habe einen Ubuntu-Server, zu dem ich über SSH eine Verbindung herstelle.
Ich muss Dateien von meinem Computer /var/www/
auf den Server hochladen , deren /var/www/
Eigentümer die Dateien sind root
.
Wenn ich PuTTY benutze, muss ich nach dem Anmelden sudo su
zuerst mein Passwort eingeben, um Dateien ändern zu können /var/www/
.
Aber wenn ich Dateien mit WinSCP kopiere, kann ich keine Dateien in erstellen / ändern /var/www/
, da der Benutzer, mit dem ich mich verbinde, keine Berechtigungen für Dateien in hat /var/www/
und ich nicht sagen kann, sudo su
wie ich es bei einer SSH-Sitzung tue .
Weißt du, wie ich damit umgehen könnte?
Wenn ich an meinem lokalen Computer arbeiten würde, würde ich anrufen, gksudo nautilus
aber in diesem Fall habe ich nur Terminalzugriff auf den Computer.
Antworten:
Du hast recht, es gibt keine
sudo
bei der Arbeit mitscp
. Eine Problemumgehung besteht darinscp
, Dateien in ein Verzeichnis hochzuladen, in dem Ihr Benutzer Berechtigungen zum Erstellen von Dateien hat, sich dann über ssh anzumelden undsudo
Dateien an ihren endgültigen Speicherort zu verschieben / kopieren.Eine andere Lösung wäre, die Berechtigungen / den Besitz der Verzeichnisse zu ändern, in die Sie die Dateien hochladen, damit Ihr nicht privilegierter Benutzer in diese Verzeichnisse schreiben kann.
Im Allgemeinen sollte das Arbeiten im
root
Konto eine Ausnahme sein, keine Regel - die Art und Weise, wie Sie Ihre Frage formulieren, lässt mich denken, dass Sie sie ein wenig missbrauchen, was wiederum zu Problemen mit Berechtigungen führt - unter normalen Umständen, die Sie nicht benötigen Super-Administrator-Rechte, um auf Ihre eigenen Dateien zuzugreifen.Technisch gesehen können Sie Ubuntu so konfigurieren, dass eine direkte Remote-Anmeldung als
root
zulässig ist. Diese Funktion ist jedoch aus einem bestimmten Grund deaktiviert. Ich rate Ihnen daher dringend davon ab.quelle
scp -R mysite [email protected]:/home/dimitris/
2.ssh [email protected]
3.sudo mv ~/mysite /var/www
- es ist ein 2-Schritt-Prozess, zuerst Siescp
die Dateien zu Ihrem Heimatverzeichnis, dann melden Sie sich über ssh und kopieren / verschieben Sie die Dateien, wo sie sein solltenEine andere Methode ist das Kopieren mit tar + ssh anstelle von scp:
quelle
sudo: sorry, you must have a tty to run sudo
. Wenn ich "-t" hinzufüge, um ein TTY zuzuweisen, erhalte ichPseudo-terminal will not be allocated because stdin is not a terminal.
. Ohne passwortloses sudo kann ich das nicht sehen.ssh -t [email protected] "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, archivieren Sie sie, ändern Sie die Berechtigungen mitchmod
undchown
und kopieren Sie sie dann auf lokal. Besonders wenn es ein Verzeichnis ist.Schneller Weg
Vom Server zum lokalen Computer:
Vom lokalen Computer zum Server:
quelle
Sie können auch verwenden
ansible
, um dies zu erreichen.Kopieren Sie mit dem ansible-
copy
Modul auf den Remote-Host :Abrufen vom Remote-Host mithilfe des ansible-
fetch
Moduls :HINWEIS:
-i HOST,
Syntax ist kein Tippfehler. Dies ist die Möglichkeit, ansible zu verwenden, ohne eine Inventardatei zu benötigen.-b
bewirkt, dass die Aktionen auf dem Server als root ausgeführt werden.-b
erweitert sich zu--become
und der Standard--become-user
ist root, wobei der Standard--become-method
sudo ist.flat=yes
kopiert nur die Datei, kopiert nicht den gesamten Remote-Pfad, der zur Datei führtcopy
Modul unterstützt, nicht jedoch vomfetch
Modul.Spezifische Aufforderung für diese Frage
Hier ist ein Beispiel, das spezifisch und vollständig spezifiziert ist, vorausgesetzt, das Verzeichnis auf Ihrem lokalen Host, das die zu verteilenden Dateien enthält, ist
sourcedir
und der Hostname des Remote-Ziels lautethostname
:Mit dem prägnanten Aufruf:
PS, mir ist klar, dass das Sprichwort "nur dieses fantastische Werkzeug installieren" eine Art tonlose Antwort ist. Aber ich habe ansible gefunden sein Super nützlich für die Verwaltung von Remote - Servern, so dass es die Installation werden Sie sicherlich andere Vorteile mit sich bringen Dateien über den Einsatz.
quelle
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
eine gültige Syntax haben? Ich denke, es ist leicht, solche Satzzeichen zu verlieren, wenn man einen Befehl liest. (Für den Leser meine ich, wenn nicht die Shell.)-i 'host,'
und wie-i host,
oder-i "host,"
. Im Allgemeinen ziehe ich es vor, diese Aufrufe so kurz wie möglich zu halten, um sie nicht zu entmutigen, aber Sie sollten sich frei fühlen, sie so ausführlich und explizit zu gestalten, wie Sie es für die Klarheit für erforderlich halten.Wenn Sie das Programm ausführen
sudo su
, werden alle von Ihnen erstellten Dateien Eigentum von root, es ist jedoch standardmäßig nicht möglich, sich mit ssh oder scp direkt als root anzumelden. Es ist auch nicht möglich, sudo mit scp zu verwenden, daher können die Dateien nicht verwendet werden. Beheben Sie dieses Problem, indem Sie das Eigentum an Ihren Dateien geltend machen:Angenommen, Ihr Benutzername lautet dimitri, können Sie diesen Befehl verwenden.
Wie in anderen Antworten bereits erwähnt, werden von nun an "Ubuntu" -Logins mit sudo und nicht mehr mit root verwendet. Es ist ein nützliches Paradigma mit großen Sicherheitsvorteilen.
quelle
sudo chow ...
für jedes einzelne Verzeichnis-R
inchown
weist es an, den Besitz dieses Verzeichnisses und aller untergeordneten Dateien und Verzeichnisse rekursiv zu ändern ... damit Sie alles tun können, was Sie wollen.Möglicherweise ist die Verwendung von
rsync
( Cygwin / cwRsync in Windows) über SSH der beste Weg ?So laden Sie beispielsweise Dateien mit dem Eigentümer hoch
www-data
:Wenn Sie in Ihrem Fall Root-Rechte benötigen, sieht der Befehl folgendermaßen aus:
Siehe: scp zum Remote-Server mit sudo .
quelle
Wenn Sie die OpenSSH-Tools anstelle von PuTTY verwenden, können Sie dies erreichen, indem Sie die
scp
Dateiübertragung auf dem Server mit initiierensudo
. Stellen Sie sicher, dasssshd
auf Ihrem lokalen Computer ein Daemon ausgeführt wird. Mit könnenssh -R
Sie dem Server eine Möglichkeit geben, mit Ihrem Computer in Kontakt zu treten.Auf Ihrem Computer:
Dadurch werden Sie nicht nur beim Server angemeldet, sondern jede Verbindung, die über den Port 11111 des Servers hergestellt wird, an den Port 22 Ihres Computers weitergeleitet: den Port, den Sie abhören
sshd
.Starten Sie auf dem Server die Dateiübertragung folgendermaßen:
quelle
Sie können ein Skript verwenden, das ich geschrieben habe und von diesem Thema inspiriert wurde:
das erfordert aber ein paar verrückte sachen (was übrigens automatisch per script erledigt wird)
Hier geht das Skript:
quelle
Sie können ssh, sudo und zB tar kombinieren, um Dateien zwischen Servern zu übertragen, ohne sich als root anmelden zu können und ohne die Berechtigung, mit Ihrem Benutzer auf die Dateien zuzugreifen. Das ist etwas umständlich, deshalb habe ich ein Skript geschrieben, um dies zu unterstützen. Sie finden das Skript hier: https://github.com/sigmunau/sudoscp
oder hier:
quelle
Hier ist eine modifizierte Version von Willie Wheelers Antwort, die die Datei (en) über tar überträgt, aber auch die Übergabe eines Passworts an sudo auf dem Remote-Host unterstützt.
Das gewisse Extra an Magie ist hier die Option -S für sudo. Aus der sudo-Manpage:
Jetzt wollen wir eigentlich, dass die Ausgabe von tar in ssh umgeleitet wird. Dadurch wird die Standardeingabe von ssh in die Standardeingabe von tar umgeleitet, sodass keine Möglichkeit mehr besteht, das Kennwort vom interaktiven Terminal an sudo zu übergeben. (Wir könnten die ASKPASS-Funktion von sudo auf der Remote-Seite verwenden, aber das ist eine andere Geschichte.) Wir können das Passwort in sudo einbinden, indem wir es im Voraus erfassen und der tar-Ausgabe voranstellen, indem wir diese Operationen in einer Subshell ausführen und die Ausgabe von weiterleiten die Unterschale in ssh. Dies hat auch den zusätzlichen Vorteil, dass eine Umgebungsvariable, die unser Passwort enthält, nicht in unserer interaktiven Shell baumelt.
Sie werden feststellen, dass ich "read" nicht mit der Option -p ausgeführt habe, um eine Eingabeaufforderung zu drucken. Dies liegt daran, dass die Passwortabfrage von sudo bequem über ssh an den stderr unserer interaktiven Shell zurückgegeben wird. Sie fragen sich vielleicht, wie sudo ausgeführt wird, wenn es in ssh rechts von unserer Pipe ausgeführt wird. Wenn wir mehrere Befehle ausführen und die Ausgabe von einem in einen anderen umleiten, führt die übergeordnete Shell (in diesem Fall die interaktive Shell) jeden Befehl in der Reihenfolge unmittelbar nach der Ausführung des vorherigen aus. Wenn jeder Befehl hinter einer Pipe ausgeführt wird, fügt die übergeordnete Shell die Standardausgabe der linken Seite der Standardausgabe der rechten Seite hinzu (leitet sie um). Die Ausgabe wird dann zur Eingabe, wenn sie Prozesse durchläuft.
Unsere interaktive Shell ist PID 7168, unsere Subshell ist PID 7969 und unser SSH-Prozess ist PID 7970.
Der einzige Nachteil ist, dass beim Lesen Eingaben akzeptiert werden, bevor sudo Zeit hat, die Eingabeaufforderung zurückzusenden. Bei einer schnellen Verbindung und einem schnellen Remote-Host werden Sie dies nicht bemerken, aber möglicherweise, wenn eine der beiden langsam ist. Verzögerungen beeinträchtigen nicht die Möglichkeit, die Eingabeaufforderung einzugeben. Möglicherweise wird es erst angezeigt, nachdem Sie mit der Eingabe begonnen haben.
Hinweis Ich habe meinem lokalen Rechner für die Demo einfach einen Host-Dateieintrag für "remote_Host" hinzugefügt.
quelle