Может ли vim редактировать удаленный файл как root?

10

Я нашел этот вопрос, который объясняет, как редактировать удаленный файл с помощью vim:

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

Можно ли сделать это как root (через sudo) на удаленном хосте?

Я попытался создать файл с правами суперпользователя на удаленном хосте и отредактировать его с помощью вышеуказанного. Vim может просматривать содержимое, редактировать его и сохранять, но ничего не меняется на удаленном хосте (возможно, потому, что vim просто сохраняет свой временный файл, а затем передает его scp для возврата?)

При выполнении этого с файлом, сохраненным моим пользователем, он ведет себя как ожидалось.

Мой SSH использует ключ для аутентификации, а на удаленном сервере есть NOPASSWD для моего доступа sudo

Этот вопрос похож, но единственный ответ с голосами использует марионетку, которая определенно не то, что я хочу использовать.


Изменить: В ответ на комментарий @ drewbenn ниже, вот мой полный процесс для редактирования:

vim scp://nagios//tmp/notouch

Где /tmp/notouchнаходится файл, принадлежащий root, я вижу, Vim быстро показать

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

Это автоматически уходит, чтобы получить пустой черный экран с текстом

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

Нажатие Enter позволяет мне редактировать файл

При сохранении появляется та же команда scp, что и в начале, которая быстро и автоматически исчезает (ее трудно прочитать вовремя, но файлы scp и / tmp / ... определенно есть)

Митч
источник
2
Просто sshна сервер и отредактируйте файл там (с visudoили как угодно). Все остальное имеет последствия для безопасности.
Satō Katsura
@SatoKatsura Я не вижу никаких реальных последствий для безопасности, кроме наличия копии удаленного файла на вашем локальном хосте. Я хочу использовать мою локальную версию vim из-за версии и для моего .vimrcфайла
Mitch
Почему бы вместо этого не использовать управление конфигурацией для передачи (или извлечения) файлов в производство? Тогда вы можете просто использовать свой местный редактор.
августа
@drewbenn Я обновил вопрос с правкой, показывающей весь процесс, который я использую
Mitch
Хммм ... разве это не работает? ssh -t host sudo vim file?
Кусалананда

Ответы:

9

Я собираюсь сказать, что это невозможно, потому что vimне выполняются удаленные команды. Он просто использует, scpчтобы скопировать файл, отредактировать его локально и scpвернуть обратно, когда закончите. Как указано в этом вопросе, использование sudo via scpневозможно, поэтому рекомендуется либо изменить разрешения, чтобы выполнить то, что вы хотите, либо просто использовать ssh на удаленной машине.

Захари Брейди
источник
Не тот ответ, на который я надеялся, но, похоже, правильный. Может быть, я напишу плагин, чтобы обойти это ..
Митч
Эй @ Митч, ты нашел какое-нибудь решение / плагин для решения твоей проблемы? У меня точно такая же ситуация! Спасибо!
Бруно Белотти
4

Как и принятый ответ, я не думаю, что это возможно напрямую.

Тем не менее, я вижу, по крайней мере, два пути для достижения вашей цели.

Запуск vim удаленно

ssh user@myserver sudo vim /some/file

Это имеет недостатки:

  • Ваше взаимодействие с vim идет по сети. Значительное отставание будет раздражать, и если ваше соединение умирает, то и vim (в конце концов).
  • Это не будет использовать ваш локальный конфиг vim, но конфиг vim удаленного рута.

Но у него есть преимущество работы.

Делать scp вне vim

Вы можете просто скопировать файл локально, отредактировать его и скопировать обратно. И вы можете автоматизировать это, чтобы сделать его почти таким же удобным, как поддержка scim в vim.

Может работать что-то вроде следующего сценария оболочки (обратите внимание, полностью не проверено!):

#! /bin/sh

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

Это позволит вам сделать что-то вроде rvim user@myserver /some/file. Он даже сохраняет локальную копию, если вторая передача не удалась, поэтому вы не потеряете свои изменения.

Скрипт может использовать множество улучшений (по крайней мере, проверку ошибок), но это отправная точка.

marcelm
источник
3

Вам потребуется пароль пользователя root или ваш открытый ключ ssh в ~ root / .ssh / authorized_keys. Как только вы это сделаете, вы можете

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

Итог: это фактически просто ярлык для

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

Если у вас есть необходимый доступ для этого, у вас есть необходимый доступ для использования плагина vim для доступа к сети. Если нет, то нет.

Как указывает Захари Брэйди, sudoне участвует. Вам понадобится SSH доступ к учетной записи root.

Ты пробовал это?

Эдвард Фальк
источник
1
У меня нет пароля root, и я не уверен, что чувствую себя комфортно, вставляя свой ключ туда без разрешения людей, которые владеют сервером. Настоящий ярлык, который он делает для меня, - это спасение меня от ssh-ов, sudo-cp-ов, scp-ing, редактирования, scp-ing, ssh-ing, sudo cp-ing (так как мой пользователь не может прочитать файл). Sshfs может быть путь сюда
Митч
Есть хороший шанс, что sshfs тоже не будет работать, если у вас нет доступа по ssh к root. Удаленная файловая система, вероятно, будет монтироваться только с вашими разрешениями. Я думаю на данный момент, ваш единственный вариантssh remotesystem sudo vim file
Эдвард Фальк
Вы правы - sshfs не работает (и вы указали мне, что я случайно наколол себе кучу файлов, которых не должно было быть ...), хотя я думал, что это работает
Mitch
1
@Mitch - люди, которым принадлежит сервер, дали вам учетную запись пользователя, и, я полагаю, вы несете ответственность за то, для чего вы используете эту учетную запись. Вы размещаете там открытый ключ, доступный любому, имеющему доступ к этой учетной записи. Вы привязываете разрешения этой учетной записи к владению секретным ключом настолько, насколько позволяет знание пароля. т.е. с точки зрения сервера, нет никакой разницы между наличием ключа или знанием пароля.
grochmal
Итог: я думаю, что вы правы, не решаясь поставить свой открытый ключ на этот сервер. Я думаю, что вы застряли с ssh / sudo vim
Эдвард Фальк