221 votes

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éverser des fichiers depuis mon ordinateur dans /var/www/ sur le serveur, les fichiers dans /var/www/ sont possédés par root.

En utilisant PuTTY, après m'être connecté, je dois taper sudo su et mon mot de passe d'abord pour pouvoir modifier les fichiers dans /var/www/.

Mais lorsque je copie des fichiers en utilisant WinSCP, je ne peux pas créer/modifier des fichiers dans /var/www/, car l'utilisateur avec lequel je me connecte n'a pas les permissions sur les fichiers dans /var/www/ et je ne peux pas taper sudo su comme je le fais en cas de session ssh.

Sais-tu comment je pourrais gérer cela ?

Si je travaillais sur mon ordinateur local, je lancerais gksudo nautilus mais dans ce cas, j'ai seulement accès au terminal de la machine.

149voto

John Points 9

Vous avez raison, il n'y a pas de sudo lorsqu'on travaille avec scp. Une solution de contournement est d'utiliser scp pour envoyer des fichiers vers un répertoire où votre utilisateur a des permissions pour créer des fichiers, puis de vous connecter via ssh et d'utiliser sudo pour déplacer/copier les fichiers vers leur destination finale.

scp -r dossier/ utilisateur@serveur.tld:/quelque/dossier/sans/sudo
ssh utilisateur@serveur.tld
 $ sudo mv /quelque/dossier /quelque/dossier/nécessitant/des/permissions 
# VOUS POUVEZ DEVOIR CHANGER LE PROPRIÉTAIRE comme:
# sudo chown -R utilisateur:utilisateur dossier

Une autre solution serait de changer les permissions/propriétés des répertoires où vous téléversez les fichiers, afin que votre utilisateur non privilégié puisse écrire dans ces répertoires.

En général, travailler dans le compte root devrait être une exception, pas une règle - la façon dont vous formulez votre question me fait penser que peut-être vous l'utilisez un peu trop, ce qui entraîne des problèmes de permissions - dans des circonstances normales, vous n'avez pas besoin de privilèges de super-admin pour accéder à vos propres fichiers.

Techniquement, vous pouvez configurer Ubuntu pour autoriser la connexion distante directement en tant que root, mais cette fonctionnalité est désactivée pour une raison, donc je vous conseille fortement de ne pas le faire.

103voto

Elliot Coad Points 315

Manière rapide

De serveur vers la machine locale :

ssh utilisateur@serveur "sudo cat /etc/dir/fichier" > /home/utilisateur/fichier

De la machine locale vers le serveur :

cat /home/utilisateur/fichier | ssh utilisateur@serveur "sudo tee -a /etc/dir/fichier"

44voto

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

tar -c -C ./mon/dossier/local \
  | ssh dimitris@monserveur.com "sudo tar -x --no-same-owner -C /var/www"

31voto

erik.weathers Points 413

Vous pouvez également utiliser ansible pour accomplir cela.

Copier vers l'hôte distant en utilisant le module copy d'ansible:

ansible -i Hôte, -b -m copy -a "src=SRC_FICHIER dest=DEST_FICHIER" all

Récupérer depuis l'hôte distant en utilisant le module fetch d'ansible:

ansible -i Hôte, -b -m fetch -a "src=SRC_FICHIER dest=DEST_FICHIER flat=yes" all

REMARQUE:

  • La virgule dans la syntaxe -i Hôte, n'est pas une faute de frappe. C'est la manière d'utiliser ansible sans avoir besoin d'un fichier d'inventaire.
  • -b fait que les actions sur le serveur sont exécutées en tant que root. -b se traduit par --become, et le --become-user par défaut est root, avec la méthode --become-method par défaut étant sudo.
  • flat=yes copie juste le fichier, ne copie pas tout le chemin distant menant au fichier
  • L'utilisation de jokers dans les chemins de fichiers n'est pas prise en charge par ces modules ansible.
  • Copier un répertoire est pris en charge par le module copy, mais pas par le module fetch.

Invocation spécifique pour cette question

Voici un exemple spécifique et entièrement spécifié, en supposant que le répertoire sur votre hôte local contenant les fichiers à distribuer est sourcedir, et 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 réalise que dire "il suffit d'installer cet outil fabuleux" est un peu maladroit comme réponse. Mais j'ai découvert qu'ansible est super utile pour administrer des serveurs distants, donc l'installer vous apportera sûrement d'autres avantages en plus du déploiement de fichiers.

20voto

Alexey Vazhnov Points 383

Peut-être que la meilleure façon est d'utiliser rsync (Cygwin/cwRsync sous Windows) via SSH ?

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

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

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

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

Voir : scp vers un serveur distant avec sudo.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X