J'ai un serveur Ubuntu auquel je me connecte via SSH.
J'ai besoin de télécharger des fichiers de ma machine /var/www/
sur le serveur, ceux /var/www/
-ci appartenant à root
.
À l’aide de PuTTY, une fois connecté (e), je dois d'abord taper sudo su
mon mot de passe pour pouvoir modifier les fichiers /var/www/
.
Mais lorsque je copie des fichiers à l'aide de WinSCP, je ne peux pas créer / modifier de fichiers /var/www/
, car l'utilisateur avec lequel je me connecte n'a pas d'autorisations sur les fichiers /var/www/
et je ne peux pas dire ce sudo su
que je fais dans le cas d'une session SSH. .
Savez-vous comment je pourrais gérer cela?
Si je travaillais sur ma machine locale, j'appellerais, gksudo nautilus
mais dans ce cas, je n'ai qu'un accès terminal à la machine.
Réponses:
Vous avez raison, il n'y a pas de
sudo
travail avecscp
. Une solution de contournement consiste àscp
télécharger des fichiers dans un répertoire dans lequel votre utilisateur dispose des autorisations nécessaires pour créer des fichiers, puis vous connecter via ssh et à utilisersudo
pour déplacer / copier des fichiers vers leur destination finale.Une autre solution serait de modifier les autorisations / la propriété des répertoires dans lesquels vous téléchargez les fichiers, afin que votre utilisateur non privilégié puisse écrire dans ces répertoires.
En règle générale, travailler dans le
root
compte doit être une exception et non une règle. La formulation de votre question me fait penser que vous en abusez peut-être un peu, ce qui entraîne des problèmes d'autorisations. Dans des circonstances normales, vous n'avez pas besoin de cela. privilèges de super-administrateur pour accéder à vos propres fichiers.Techniquement, vous pouvez configurer Ubuntu pour autoriser la connexion à distance directement en tant que
root
, mais cette fonctionnalité est désactivée pour une raison, je vous déconseille donc fortement de le faire.la source
scp -R mysite [email protected]:/home/dimitris/
2.ssh [email protected]
3.sudo mv ~/mysite /var/www
- c'est un processus en 2 étapes, vous devez d'abordscp
enregistrer les fichiers dans votre répertoire personnel, puis vous connecter via ssh et copier / déplacer les fichiers là où ils devraient êtreUne autre méthode consiste à copier en utilisant tar + ssh au lieu de scp:
la source
sudo: sorry, you must have a tty to run sudo
. Si j'ajoute "-t" pour allouer un ATS, je reçoisPseudo-terminal will not be allocated because stdin is not a terminal.
. Je ne peux pas voir cela fonctionner sans sudo sans mot de passe.ssh -t [email protected] "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, archiver, modifier les autorisations à l' aidechmod
etchown
, puis copiez - le au niveau local. Surtout si c'est un répertoire.Façon rapide
Du serveur à la machine locale:
De la machine locale au serveur:
la source
Vous pouvez également utiliser
ansible
pour accomplir cela.Copier vers un hôte distant en utilisant le
copy
module ansible :Récupérer depuis un hôte distant en utilisant le
fetch
module ansible :REMARQUE:
-i HOST,
syntaxe n'est pas une faute de frappe. C'est la façon d'utiliser ansible sans avoir besoin d'un fichier d'inventaire.-b
provoque les actions sur le serveur en tant que root.-b
se développe en--become
, et la valeur par défaut--become-user
est root, la valeur par défaut--become-method
étant sudo.flat=yes
copie uniquement le fichier, ne copie pas le chemin d'accès complet menant au fichiercopy
module, mais pas par lefetch
module.Invocation spécifique pour cette question
Voici un exemple spécifique et entièrement spécifié, en supposant que le répertoire de votre hôte local contenant les fichiers à distribuer est le même
sourcedir
que le nom d'hôte de la cible distantehostname
:Avec l'invocation concise étant:
PS, je me rends compte que dire "viens d'installer ce fabuleux outil" est une sorte de réponse insensée. Mais j’ai trouvé ansible très utile pour l’administration de serveurs distants. Son installation vous apportera donc d’autres avantages que le déploiement de fichiers.
la source
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
être une syntaxe valide? Je pense qu'il est facile de perdre une ponctuation comme celle-ci lors de la lecture d'une commande. (Pour le lecteur, je veux dire, sinon la coquille.)-i 'host,'
et pareil que-i host,
ou-i "host,"
. En général, je préfère garder ces invocations aussi courtes que possible pour ne pas les décourager, mais vous devez vous sentir libre de les rendre aussi verbeuses et explicites que nécessaire, à des fins de clarté.Lorsque vous exécutez
sudo su
, tous les fichiers que vous créez seront la propriété de root, mais il n’est pas possible par défaut de vous connecter directement en tant que root avec ssh ou scp. Il n'est également pas possible d'utiliser sudo avec scp, les fichiers ne sont donc pas utilisables. Corrigez cela en revendiquant la propriété de vos fichiers:En supposant que votre nom d’utilisateur soit dimitri, vous pouvez utiliser cette commande.
À partir de là, comme mentionné dans d'autres réponses, la méthode "Ubuntu" consiste à utiliser sudo et non les connexions à la racine. C'est un paradigme utile, avec de grands avantages en termes de sécurité.
la source
sudo chow ...
pour chaque répertoire: S-R
in en luichown
dit de changer la propriété de ce répertoire, ainsi que tous les fichiers et répertoires enfants de manière récursive ... afin que vous puissiez faire tout ce que vous voulez.Peut-être le meilleur moyen est d'utiliser
rsync
( Cygwin / cwRsync dans Windows) sur SSH?Par exemple, pour télécharger des fichiers avec le propriétaire
www-data
:Dans votre cas, si vous avez besoin de privilèges root, la commande sera comme ceci:
Voir: scp au serveur distant avec sudo .
la source
Si vous utilisez les outils OpenSSH au lieu de PuTTY, vous pouvez le faire en lançant le
scp
transfert de fichier sur le serveursudo
. Assurez-vous qu'unsshd
démon est en cours d'exécution sur votre ordinateur local. Avec,ssh -R
vous pouvez donner au serveur un moyen de contacter votre machine.Sur votre machine:
En plus de vous connecter au serveur, cela transférera chaque connexion établie sur le port 11111 du serveur vers le port 22 de votre ordinateur: le port sur lequel vous êtes en
sshd
train d'écouter.Sur le serveur, démarrez le transfert de fichier comme ceci:
la source
Vous pouvez utiliser le script que j'ai écrit en s'inspirant de ce sujet:
mais cela nécessite des trucs déjantés (ce qui est d'ailleurs fait automatiquement par script)
Voici le script:
la source
Vous pouvez combiner ssh, sudo et, par exemple, tar pour transférer des fichiers entre serveurs sans pouvoir se connecter en tant que root et ne pas avoir l'autorisation d'accéder aux fichiers avec votre utilisateur. C'est un peu délicat, alors j'ai écrit un script pour aider ceci. Vous pouvez trouver le script ici: https://github.com/sigmunau/sudoscp
ou ici:
la source
Voici une version modifiée de la réponse de Willie Wheeler qui transfère le (s) fichier (s) via tar, mais permet également de transmettre un mot de passe à sudo sur l'hôte distant.
Le petit plus de magie ici est l’option -S de sudo. De la page de manuel sudo:
Nous voulons maintenant que la sortie de tar soit acheminée vers ssh, ce qui redirige le stdin de ssh vers la sortie standard de tar, supprimant ainsi tout moyen de transmettre le mot de passe à sudo à partir du terminal interactif. (Nous pourrions utiliser la fonction ASKPASS de sudo sur le côté distant, mais ceci est une autre histoire.) Nous pouvons obtenir le mot de passe dans sudo en le capturant à l'avance et en l'ajoutant à la sortie du fichier tar en effectuant ces opérations dans un sous-shell et en redirigeant la sortie du fichier. le sous-shell dans SSH. Cela présente également l’avantage supplémentaire de ne pas laisser une variable d’environnement contenant notre mot de passe suspendu dans notre shell interactif.
Vous remarquerez que je n'ai pas exécuté 'read' avec l'option -p pour imprimer une invite. En effet, l'invite de mot de passe de sudo est renvoyée de manière pratique à stderr de notre shell interactif via ssh. Vous vous demandez peut-être "comment sudo s’exécute-t-il dans la mesure où il s’exécute dans ssh, à droite de notre pipe?" Lorsque nous exécutons plusieurs commandes et que nous transmettons la sortie de l'une à l'autre, le shell parent (le shell interactif dans ce cas) exécute chaque commande dans la séquence immédiatement après l'exécution de la précédente. Au fur et à mesure que chaque commande située derrière un tube est exécutée, le shell parent attache (redirige) la sortie standard du côté gauche au standard stdin. La sortie devient alors une entrée à mesure qu'elle passe par des processus.
Notre shell interactif est le PID 7168, notre sous-shell est le PID 7969 et notre processus SSH est le PID 7970.
Le seul inconvénient est que read acceptera les entrées avant que sudo ait le temps de renvoyer son invite. Sur une connexion rapide et un hôte distant rapide, vous ne le remarquerez pas, mais vous pourriez le faire si l'un ou l'autre est lent. Tout retard n'affectera pas la possibilité d'entrer l'invite; il pourrait juste apparaître après que vous ayez commencé à taper.
Remarque J'ai simplement ajouté une entrée de fichier hôte pour "remote_Host" à ma machine locale pour la démo.
la source