Який найкращий спосіб відкрити віддалені файли за допомогою emacs та ssh


80

Я підключаюся до віддаленої машини за допомогою ssh user@192.168.1.5. Коли мені потрібно відкрити файл на віддаленій машині, я це роблю, наприклад,

emacs /usr/share/nginx/html/index.html

і це відкриває index.htmlфайл у оболонці. Я помітив, що деякі команди emacs працюють, але інші не працюють. Наприклад, C-wне працює; M-<не працює. Як я можу це виправити, і який найкращий спосіб працювати з emacs та ssh?

Я знайшов це запитання, але це мене ще більше розгубило.


1
Які приклади команд працюють? (Іноді на віддаленій машині існують різні прив'язки клавіш - перевірте файл .emacs на віддаленій машині - а іноді ціла клавіша працює по-різному - наприклад, екран GNU за замовчуванням поглинає частину команди Ctrl-A, перш ніж вона зможе потрапити до emacs.)
kbshimmyo

1
C-space, CF, Cg робота
Zeynel

Зараз я не зміг знайти файл .emacs у віддаленій машині, але знаю, що не зробив жодної нової прив'язки клавіш на іншій машині
Zeynel

так, я не впевнений, що призводить до того, що цей набір клавіатур не працює. Чи відкриває файл emacs файл у тому ж режимі на віддаленому сервері, що і локально (де працюють усі команди)? Можливо, це може дати підказку - M-x describe-mode.
kbshimmyo

Ви також запускаєте emacs на своїй локальній машині? Чи є причина, за якою ви хочете використовувати віддалений emacs проти локального?
Carl Groner

Відповіді:


157

Я зазвичай вважаю за краще відкривати віддалені файли з локального екземпляра Emacs.

Під час запуску Emacs на локальній машині відкриття віддаленого файлу через ssh мало чим відрізняється від відкриття будь-якого іншого файлу, крім дещо іншого синтаксису .

Для ssh ви можете ввести C-x C-f. Тепер у мінбуфері, який ви хочете ввести /ssh:user@host:/path/to/file(Зверніть увагу, що заповнення вкладки запрацює, як тільки ви почнете вводити шлях. Також зверніть увагу на провідний /символ). Повні документи дивіться тут .

У вашому прикладі це буде:

C-x C-f /ssh:user@192.168.1.5:/usr/share/nginx/html/index.html

Тепер ви можете редагувати віддалені файли через ssh в Emacs, використовуючи локальну конфігурацію та будь-які встановлені пакети тощо ...


24
OP може зацікавити, що ця функція називається: trampі це одна з найкорисніших речей, які ви коли-небудь будете використовувати. Він навіть компілюється віддалено!
pmr

Це чудово працює, і всі команди, здається, працюють, але я бачу, що це не дозволить мені редагувати, index.htmlоскільки в ньому сказано, що буфер доступний лише для читання. Але я можу редагувати той самий файл, якщо відкриваю його на віддаленому комп’ютері. До речі, коли я відкрив файл із C-x C-f /ssh:user@host filenameним, запитав мене пароль.
Зейнел

Я спробував інший файл із каталогу Документи, і я міг редагувати його без проблем.
Зейнел

Чи знаєте ви, як вказати порт за допомогою цього?
Філіп Кіркбрайд,

5
@PhilipKirkbride Повний задокументований синтаксис/method:user@host#port:filename
Carl Groner

28

Щоб додати до відповіді вище, ви можете написати ярлики для машин, які ви часто використовуєте:

(defun connect-remote ()
  (interactive)
  (dired "/user@192.168.1.5:/"))

Це відкриє a dired буфер на віддаленій машині. Ви можете орієнтуватися в цьому буфері, як і в локальному.

Якщо ви налаштували ssh-клавіші для віддаленої машини, вам навіть не потрібно вводити пароль.

Якщо у вас купа віддалених машин, ви можете дати кожному впізнаваному імені кожну функцію, наприклад connect-cupcake, connect-kitkatі використовувати smexпакет для завершення.


Це чудово. Я спробую. У вас також є відповідь на запитання, яке я задав у коментарі вище: я можу редагувати цей файл, /usr/share/nginx/html/index.htmlякщо відкрию його на віддаленій машині; але коли я відкриваю його за допомогою ssh, index.htmlлише для читання. Чому це?
Зейнел

Я припускаю, що ви не маєте зв'язку з кореневим користувачем, і зазвичай лише він може писати /usr/share/.
abo-abo

але як мені підключитися як кореневий користувач? Я спробував кілька речей, C-x C-f /sudo ssh:user@host filenameале це не працює.
Зейнел

1
Це проблема, яку я намагався вирішити деякий час тому безрезультатно. Я можу використовувати tramp для підключення до віддаленого або для підключення до локальної системи як sudo, але не обох. Вихідне рішення - зробити себе власником /usr/share/nginx/html/папки з chown.
abo-abo

Я відкрив файл /etc/nginx/sites-available/example.com.confі відредагував його, зберіг і закрив. Тепер я відкрив його знову, і цього разу я не можу редагувати? Я припускаю, що це має щось робити з дозволами. Чи можете ви допомогти мені зрозуміти, чому це відбувається?
Зейнел

18

І додати до допису @ abo-abo про "ярлики" -

Використовуйте закладки Emacs. Просто створюйте закладки зазвичай, коли ви відвідуєте віддалений файл або каталог. Тоді просто використовуйтеC-x r b для переходу до віддаленої закладки, ім’я якої ви надаєте (із заповненням).

Якщо ви використовуєте Bookmark +, тоді віддалені закладки виділяються спеціально в *Bookmark List*, щоб ви могли їх легше розпізнати. А віддалені закладки, до яких повинен отримати доступ suабо sudo( root), виділяються по-різному.

Якщо ви використовуєте Dired +, ви також можете швидко додати до закладок декілька віддалених файлів або каталогів, відвідавши їх віддалений каталог у Dired, позначивши їх та натиснувши C-x b. Не потрібно давати імена закладок; вони названі на честь файлів. Навіть якщо ви ніколи не використовуєте ці закладки для переходу до віддалених файлів, ви можете використовувати їх із тегами Bookmark + для організації файлів і, таким чином, оперувати їх підмножинами.

Якщо ви використовуєте бурульки, тоді, коли ви використовуєте команду, щоб перейти до закладки, ви можете звузити кандидатів на завершення до тих, які віддалені, натиснувши C-M-@під час завершення.


10

Оригінальний плакат висловив зацікавленість у відкритті віддалених файлів як кореневий користувач. Це можна зробити за допомогою команди:

C-x C-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Більше документації можна знайти тут: https://www.emacswiki.org/emacs/TrampMode#toc14


3

Проста відповідь, яка зосереджена на віддаленій машині:

Якщо я планую виконувати всі свої emacs на віддаленій машині, я використовую

ssh -X username@hostname

а потім запустіть emacs у віддаленому сеансі, відображаючи назад на моєму локальному комп'ютері. Це давнє запитання, але я хотів додати це для повноти. Звичайно, є деякі проблеми з конфігурацією xhost / X, але у багатьох мережах це буде працювати прямо зараз!


2

Режим SSH для emacs - це те, що ви шукаєте.

Після того, як ви його налаштували, ви просто запускаєтеся

M-x ssh RET hostname RET

Потім він запитує ваш пароль двічі (один раз для командного рядка, один раз для завантаження файлів).

Здебільшого ви можете ставитися до нього як до будь-якої іншої оболонки (неінтерактивна і кілька незначних відмінностей, але це все).

Він відстежує, в якому каталозі ви знаходитесь, тому, коли ви хочете відкрити файл із каталогу, який ви переглядаєте, він автоматично запускається у потрібному каталозі, і вам просто потрібно ввести ім’я файлу.

Emacs Wiki також має більше інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.