Question Comment copier des fichiers nécessitant un accès root avec scp?


J'ai un serveur Ubuntu auquel je me connecte en utilisant SSH.

J'ai besoin de télécharger des fichiers de ma machine dans /var/www/ sur le serveur, les fichiers dans /var/www/ sont la propriété de root.

En utilisant PuTTY, après ma connexion, je dois taper sudo su et mon mot de passe d'abord afin de pouvoir modifier les fichiers dans /var/www/.

Mais lorsque je copie des fichiers en utilisant WinSCP, je ne peux pas créer de fichiers de modification / modification /var/www/, car l'utilisateur avec lequel je me connecte n'a pas d'autorisations sur les fichiers dans /var/www/ et je ne peux pas dire sudo su comme je le fais en cas de 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.


134
2017-10-29 21:03


origine


Cela ressemble plus à une question pour votre fournisseur de serveur virtuel, ou pour les développeurs de mastics ou de winscp. - dobey
@Dobey you obviusly false, il s'agit de privilèges ubuntu! - Dimitris Sapikas
Pourquoi est-ce fermé? Ceci est une question parfaitement valable sur la copie de fichiers avec scp - chaque développeur Web est familier avec cette situation - Sergey
Copier des fichiers protégés entre des serveurs sur une seule ligne? devrait aider. - Gilles
J'ai le même problème. Je crée un fichier (HTML dans ce cas) sur un ordinateur Windows et essaie de le copier avec WinSCP dans le dossier / var / www / html / website. Et il dit qu'il y a un problème de permission. Comme je peux copier dans mon dossier / home, j'ai copié le fichier en deux étapes, mais ce n'est pas très pratique :-) J'ai essayé d'ajouter mon utilisateur à www-data group, mais cela n'a pas aidé. Toute idée de l'ajout à l'utilisateur à www-data n'autorise toujours pas l'utilisateur à copier un fichier dans un dossier appartenant à www-data group? - JanezKranjski


Réponses:


Tu as raison, il n'y a pas de sudo en travaillant avec scp. Une solution de contournement consiste à utiliser scp pour télécharger des fichiers dans un répertoire où votre utilisateur est autorisé à créer des fichiers, puis connectez-vous via ssh et utilisez sudo déplacer / copier des fichiers vers leur destination finale.

scp -r folder/ user@server.tld:/some/folder/you/dont/need/sudo
ssh user@server.tld
 $ sudo mv /some/folder /some/folder/requiring/perms 
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder

Une autre solution consisterait à modifier les autorisations / propriétés des répertoires dans lesquels vous téléchargez les fichiers afin que votre utilisateur non privilégié puisse écrire dans ces répertoires.

Généralement, travailler dans le root Le compte devrait être une exception, pas une règle - la façon dont vous rédigez votre question me fait penser que vous en abusez un peu, ce qui entraîne des problèmes avec les autorisations - dans des circonstances normales, vous n'avez pas besoin de privilèges super-admin pour accéder à vos propres fichiers.

Techniquement, vous pouvez configurer Ubuntu pour permettre la connexion à distance directement comme root, mais cette fonctionnalité est désactivée pour une raison, alors je vous déconseille fortement de le faire.


105
2017-10-29 22:22



Je n'ai pas eu la première solution, pourriez-vous s'il vous plaît être un peu plus précis? - Dimitris Sapikas
Whe je dis mes propres fichiers que je veux dire / var / www, j'utilise mon vps en tant que serveur web .... dans mon propre dossier j'ai un accès complet - Dimitris Sapikas
Ré. la première solution 1. scp -R mysite dimitris@myserver.com:/home/dimitris/ 2. ssh dimitris@myserver.com 3. sudo mv ~/mysite /var/www - c'est un processus en 2 étapes, d'abord vous scp les fichiers dans votre répertoire personnel, puis vous vous connectez via ssh et copiez / déplacez les fichiers là où ils devraient être - Sergey
hm .. ça marche bien! Je vous remercie :) - Dimitris Sapikas


Une autre méthode consiste à copier en utilisant tar + ssh au lieu de scp:

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"

29
2017-10-03 18:56



C'est la meilleure façon de le faire. - mttdbrd
Je n'arrive pas à faire fonctionner cette méthode avec succès. Comme écrit je reçois sudo: sorry, you must have a tty to run sudo. Si j'ajoute "-t" pour attribuer un ATS, j'obtiens Pseudo-terminal will not be allocated because stdin is not a terminal.. Je ne vois pas cela fonctionner sans sudo sans mot de passe. - IBBoard
@IBBoard: essayez la solution ici en utilisant ssh -t: ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www" - Alexander Bird
@AlexanderBird Bien que cela fonctionne dans de nombreux cas, je ne suis pas sûr que cela fonctionne ici parce que nous essayons de diriger une archive tar sur la connexion SSH. Voir serverfault.com/questions/14389/… - IBBoard
C'est ce qui a finalement fonctionné pour moi. Vous ne disposez pas des autorisations sur un fichier distant que vous souhaitez copier dans un fichier local, effectuez une sudo tar, archivez-le, modifiez les autorisations à l'aide de chmod et chownpuis copiez-le sur local. Surtout si c'est un répertoire. - forumulator


Vous pouvez aussi utiliser ansible pour y parvenir.

Copier sur l'hôte distant en utilisant ansible's copy module:

ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all

Récupère depuis l'hôte distant en utilisant ansible's fetch module:

ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all

REMARQUE:

  • La virgule dans le -i HOST, la syntaxe n'est pas une faute de frappe. C'est la manière 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 à --becomeet le défaut --become-user est root, avec la valeur par défaut --become-method être sudo.
  • flat=yes copies juste le fichier, ne copie pas tout le chemin distant menant au fichier
  • L'utilisation de caractères génériques dans les chemins de fichiers n'est pas prise en charge par ces modules Ansible.
  • Copier un répertoire est soutenu par le copy module, mais ne pas par le fetch 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 sourcediret que le nom d'hôte de la cible distante est hostname:

cd sourcedir && \
ansible \
   --inventory-file hostname, \ 
   --become \
   --become-method sudo \
   --become-user root \
   --module-name copy \
   --args "src=. dest=/var/www/" \
   all

Avec l'invocation concise étant:

cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all

P.S., je me rends compte que dire "juste installer cet outil fabuleux" est une sorte de réponse ton-sourde. Mais j'ai trouvé ansible d'être super utile pour administrer des serveurs distants, l’installation vous apportera sûrement d’autres avantages que le déploiement de fichiers.


21
2018-02-15 07:03



J'aime cette réponse, mais je vous recommande de la diriger vers la question posée plutôt que vers un commentaire plus général avant de voter. quelque chose comme ansible -i "hostname," all -u user --become -m copy -a ... - Mike D
@MikeD: comment les changements ci-dessus ont-ils l'air? - erik.weathers
mieux mais ça échoue, --module-name est le nom correct du commutateur. et depuis hostname est le seul hôte dans votre inventaire, vous pouvez simplement dire all - Mike D
Quelque chose comme -i 'host,' être une syntaxe valide? Je pense qu'il est facile de perdre la ponctuation comme cela lors de la lecture d'une commande. (Pour le lecteur, je veux dire, sinon la coquille.) - mwfearnley
@ mwfearnley: bien sûr, le shell va traiter -i 'host,' et même comme -i host, ou -i "host,". En général, je préfère garder ces invocations aussi courtes que possible pour les empêcher d’être décourageantes, mais vous devriez vous sentir aussi libre et explicite que vous le jugez nécessaire pour plus de clarté. - erik.weathers


Quand tu cours sudo su, tous les fichiers que vous créez appartiendront à root, mais il n'est pas possible, par défaut, de se connecter directement en tant que root avec ssh ou scp. Il est également impossible 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 était dimitri, vous pouvez utiliser cette commande.

sudo chown -R dimitri:dimitri /home/dimitri

À partir de là, comme mentionné dans d'autres réponses, la méthode "Ubuntu" consiste à utiliser sudo, et non les connexions root. C'est un paradigme utile, avec de grands avantages en matière de sécurité.


12
2017-10-29 23:07



J'utilise cette solution de toute façon, mais si je pouvais avoir un accès complet à mon propre système de fichiers, je ne veux pas taper sudo chow ... pour chaque répertoire unique: S - Dimitris Sapikas
Le transfert de propriété de tous les fichiers système à l'utilisateur pour des raisons de commodité est fortement déconseillé. Il permet de détecter tout bogue d’espace utilisateur susceptible de compromettre gravement la sécurité de votre système. Il est préférable de changer la propriété des fichiers que vous devez modifier ou mettre à jour par SCP, mais de laisser tout ce qui appartient à root (comme il est supposé l'être). Cela dit, le -R dans chown lui dit de changer la propriété de ce répertoire, et tous les fichiers et répertoires enfants récursivement ... afin que vous puissiez faire ce que vous voulez. - Bailey S
hmm .... ça semble bien marcher, merci! désolé je ne peux pas voter (le système ne me permet pas de faire ...) - Dimitris Sapikas


Peut être le meilleur moyen est d'utiliser rsync (Cygwin/cwRsync sous Windows) sur SSH?

Par exemple, pour télécharger des fichiers avec le propriétaire www-data:

rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www

Dans votre cas, si vous avez besoin des privilèges root, la commande sera comme ceci:

rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www

Voir: scp sur le serveur distant avec sudo.


8
2017-11-15 10:14





Si vous utilisez les outils OpenSSH au lieu de PuTTY, vous pouvez le faire en lançant le scp transfert de fichier sur le serveur avec sudo. Assurez-vous d'avoir un sshd démon s'exécutant sur votre ordinateur local. Avec ssh -R vous pouvez donner au serveur un moyen de contacter votre machine.

Sur votre machine:

ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME

En plus de vous connecter sur le serveur, ceci transfèrera chaque connexion faite sur le port 11111 du serveur au port 22 de votre machine: le port votre sshd écoute sur.

Sur le serveur, lancez le transfert de fichiers comme suit:

cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .

5
2017-11-21 16:52





Rapidement:

ssh user@server "sudo cat /etc/dir/file" > /home/user/file

5
2018-01-16 13:01



Cette réponse est sous-estimée. C'est simple, propre, lit ou écrit un fichier racine avec une seule opération atomique, et ne nécessite rien qui ne soit déjà garanti si vous utilisez scp. Le principal inconvénient est qu'il ne copie pas les autorisations. Si vous le voulez, la solution tar est meilleure. C'est une technique puissante, en particulier si elle est combinée avec xargs / bash magic pour parcourir les chemins. - markgo2k