Vim peut-il éditer un fichier distant en tant que root?

10

J'ai trouvé cette question qui explique comment modifier un fichier distant avec vim en utilisant:

vim scp://user@myserver[:port]//path/to/file.txt

Est-il possible de le faire en tant que root (via sudo) sur l'hôte distant?

J'ai essayé de créer un fichier avec des autorisations root sur l'hôte distant et de le modifier avec ce qui précède. Vim peut voir le contenu, le modifier et le sauvegarder, mais rien ne change sur l'hôte distant (probablement parce que vim enregistre simplement son fichier temporaire et le donne ensuite à scp pour le remettre?)

Lorsque vous faites cela avec un fichier enregistré par mon utilisateur, il se comporte comme prévu.

Mon SSH utilise une clé pour s'authentifier et le serveur distant a NOPASSWD pour mon accès sudo

Cette question est similaire, mais la seule réponse avec des votes utilise une marionnette qui n'est certainement pas ce que je veux utiliser.


Edit: En réponse au commentaire de @ drewbenn ci-dessous, voici mon processus complet d'édition:

vim scp://nagios//tmp/notouch

/tmp/notouchest le fichier appartenant à root, je vois vim rapidement montrer

:!scp -q 'nagios:/tmp/notouch' '/tmp/vaHhwTl/0'

Cela disparaît automatiquement pour donner un écran noir vide avec le texte

"/tmp/vaHhwTl/0" 1L, 12C
Press ENTER or type command to continue

Appuyer sur Entrée me permet de modifier le fichier

L'enregistrement fait apparaître le même type de commande scp que le début, qui disparaît rapidement et automatiquement (il est difficile de le lire à temps mais les fichiers scp et / tmp / ... sont définitivement là)

Mitch
la source
2
Juste sshsur le serveur et éditez-y le fichier (avec visudoou autre). Tout autre élément a des implications sur la sécurité.
Satō Katsura
@SatoKatsura Je ne vois aucune implication réelle en matière de sécurité autre que d'avoir une copie du fichier distant sur votre hôte local. Je veux utiliser ma version locale de vim en raison de la version et de mon .vimrcfichier
Mitch
Pourquoi ne pas plutôt utiliser la gestion de la configuration pour pousser (ou extraire) les fichiers en production? Ensuite, vous pouvez simplement utiliser votre éditeur local.
thrig
@drewbenn J'ai mis à jour la question avec une modification montrant le processus complet que j'utilise
Mitch
Hmmm ... ça ne marche pas? ssh -t host sudo vim file?
Kusalananda

Réponses:

9

Je vais dire que ce n'est pas possible car vimn'exécute pas de commandes à distance. Il utilise simplement scppour copier le fichier, le modifier localement et scple récupérer une fois terminé. Comme indiqué dans cette question, sudo via scpn'est pas possible et il est recommandé de modifier les autorisations pour accomplir ce que vous voulez ou simplement de passer par ssh sur la machine distante.

Zachary Brady
la source
Pas la réponse que j'espérais, mais semble être la bonne. Peut-être que j'écrirai un plugin pour contourner ce problème ..
Mitch
Hé @Mitch, avez-vous trouvé une solution / un plugin pour résoudre votre problème? Je vis exactement la même situation! Merci!
Bruno Belotti
4

Comme la réponse acceptée, je ne pense pas que ce soit possible directement.

Cependant, je vois au moins deux façons d'atteindre encore votre objectif.

Exécuter vim à distance

ssh user@myserver sudo vim /some/file

Cela présente des inconvénients:

  • Vos interactions avec vim passent par le réseau. Un retard important sera ennuyeux, et si votre connexion s'éteint, vim (éventuellement).
  • Cela n'utilisera pas votre configuration vim locale, mais la configuration vim de la racine distante.

Mais il a l'avantage de fonctionner.

Faire le scp en dehors de vim

Vous pouvez simplement copier le fichier localement, le modifier et le recopier. Et vous pouvez automatiser cela pour le rendre presque aussi transparent que le support scp de vim.

Quelque chose comme le script shell suivant pourrait fonctionner (notez, entièrement non testé!):

#! /bin/sh

TMPFILE=$(mktemp)
ssh -- "$1" sudo cat "'$2'" > ${TMPFILE}
vim ${TMPFILE}
ssh -- "$1" "sudo tee '$2' > /dev/null" < ${TMPFILE} && \
  rm -f ${TMPFILE}

Cela vous permettrait de faire quelque chose comme rvim user@myserver /some/file. Il conserve même la copie locale si le deuxième transfert échoue, vous ne perdez donc pas vos modifications.

Le script pourrait utiliser de nombreuses améliorations (à tout le moins la vérification des erreurs), mais c'est un point de départ.

marcelm
la source
3

Vous auriez besoin du mot de passe root ou de votre clé ssh publique dans ~ root / .ssh / authorized_keys. Une fois que vous avez eu ça, vous pourriez probablement faire

vim scp://root@nagios//tmp/notouch

Bottom line: ce n'est en fait qu'un raccourci pour

scp root@nagios:/tmp/notouch /tmp/notouch
vim /tmp/notouch
scp /tmp/notouch root@nagios:/tmp/notouch

Si vous avez l'accès nécessaire pour le faire, vous avez alors l'accès nécessaire pour utiliser le plugin d'accès réseau de vim. Sinon, vous ne le faites pas.

Comme le souligne Zachary Brady, il sudon'est pas impliqué. Vous aurez besoin d'un accès ssh au compte root.

L'as tu essayé?

Edward Falk
la source
1
Je n'ai pas le mot de passe root et je ne suis pas sûr de me sentir à l'aise d'y mettre ma clé sans l'autorisation des personnes propriétaires du serveur. Le vrai raccourci qu'il fait pour moi est de me sauver de ssh-ing, sudo cp-ing, scp-ing, édition, scp-ing, ssh-ing, sudo cp-ing (car mon utilisateur ne peut pas lire le fichier). sshfs peut être le chemin à parcourir ici
Mitch
Il y a de fortes chances que sshfs ne fonctionne pas non plus si vous n'avez pas accès ssh à root. Le système de fichiers distant serait probablement monté avec uniquement vos autorisations. Je pense qu'à ce stade, votre seule option estssh remotesystem sudo vim file
Edward Falk
Vous avez raison - sshfs ne fonctionne pas (et vous m'avez fait remarquer que je m'étais accidentellement empaillé un tas de fichiers qui n'auraient pas dû être ...) bien que je pensais que cela fonctionnait
Mitch
1
@Mitch - Les personnes qui possèdent le serveur vous ont donné un compte d'utilisateur et, je crois, vous êtes responsable de l'utilisation de ce compte. Vous placez là une clé publique que toute personne ayant accès à ce compte pourrait. Vous liez les autorisations de ce compte à la possession de la clé privée autant que la connaissance du mot de passe le permet. c'est-à-dire du point de vue du serveur, il n'y a pas de différence entre avoir une clé ou connaître le mot de passe.
grochmal
Bottom line: Je pense que vous avez raison d'hésiter à mettre votre clé publique sur ce serveur. Je pense que vous êtes coincé avec ssh / sudo vim
Edward Falk