Как передавать файлы с помощью Tramp с помощью scp или rsync

Я прочитал руководство по TRAMP и десятки форумов в Интернете, но я не смог найти ответа на этот вопрос. Я пытаюсь настроить ссылку в организационном режиме, которая передает файл с удаленного сервера на мой локальный компьютер (или наоборот). По мануалу надо написать что-то вроде /scp:user@host:filepathonremotemachine и все. Нет указания, куда следует переместить файл, что странно. Я пытался сделать это таким образом, и он просто открыл файл (как если бы я использовал ssh); пробовали и другие комбинации, но безуспешно. Есть конкретная причина, по которой я пытаюсь сделать это с помощью tramp, а не ссылки shell:command. Любая помощь очень приветствуется

ОБНОВЛЕНИЕ По-видимому, TRAMP менее полезен, чем обещает. Это оставляет мне вариант ссылки shell:command. Затем проблема заключается в том, чтобы избежать всплывающего окна openssh. Ближайшее решение, которое я нашел, было здесь, и оно продолжается до настройки ssh- агент. Я не очень знаком с этой процедурой и предпочел бы использовать метод аутентификации authinfo.gpg. У меня есть такая возможность? Спасибо.


person Ajned    schedule 25.02.2018    source источник
comment
Хотя это и не касается непосредственно, я ранее написал пример того, как синхронизировать папки / файлы с Emacs с помощью rsync, используя преимущества встроенного пакета auth-source, так что пользователю не нужно каждый раз вводить идентификатор пользователя или пароль; и есть также локальный пример, когда аутентификация не требуется (например, доверенная домашняя сеть): emacs.stackexchange.com/ a / 5844/2287 Возможно, в этом есть что-то, что может вдохновить вас на создание собственного решения. Насколько я помню, в Emacs 24 была ошибка, препятствующая правильной работе примера, поэтому используйте Emacs 25+.   -  person lawlist    schedule 25.02.2018
comment
Спасибо за вклад. Меня не особо беспокоит необходимость каждый раз вводить пароль. Моя основная проблема заключается в том, что бродяга, похоже, не может копировать или синхронизировать файлы с удаленным сервером, что абсурдно, потому что это такая стандартная операция. Я посмотрю на ваш пример и опубликую здесь, если найду решение.   -  person Ajned    schedule 26.02.2018
comment
Ссылка shell:command - это именно то, что вам нужно. Какова конкретная причина, по которой вы не хотите этого делать? Tramp - это механизм удаленного доступа: он просто открывает (удаленный) файл, как если бы он был локальным, или сохраняет буфер удаленно, как если бы файл, в который вы сохраняете, был локальным: не более того.   -  person NickD    schedule 26.02.2018
comment
Я понимаю. Думаю, я слишком доверял Бродяге. Тогда я буду использовать подход shell: command. Причина, по которой я не хотел использовать ссылку оболочки, заключается в том, что я хочу использовать аутентификацию authinfo.gpg, и я не мог заставить ее работать с этим типом ссылки. В частности, emacs открывал внешнее окно openssh вместо того, чтобы обращаться к файлу authinfo.gpg за соответствующей записью.   -  person Ajned    schedule 26.02.2018
comment
Не для того, чтобы начинать драку, но бродяга очень полезен и не обещает ничего, кроме того, что дает. Вы могли предположить, что это обещает нечто большее, но это ваша ошибка, а не ошибка бродяги.   -  person NickD    schedule 27.02.2018


Ответы (2)


Сам Tramp предлагает только альтернативные реализации собственных функций Emeacs. В этом смысле он тупой, как и любая библиотека, потому что не знает, чего хочет вызывающий.

Я не специалист по организационному режиму, но не могли бы вы показать, какую ссылку вы имеете в виду? Без удаленности, просто ссылка, по которой файл копируется локально. Тогда будет легко заменить локальные имена файлов удаленными.

Я предполагаю, что вам нужно что-то вроде внешней ссылки, оценивающей код Lisp. Нравится

 elisp:(copy-file "/path/src" "/path/target")
person Michael Albinus    schedule 26.02.2018
comment
Добавление здесь кода для копирования на сервер и с сервера только для полноты elisp:(copy-file "/path/src" "/scp:user@host#port:/path/target") и elisp:(copy-file "/scp:user@host#port:/path/src" "/path/target") - person Ajned; 28.02.2018
comment
Я бы также добавил, что необязательное поле функции copy-file: OK-IF-ALREADY-EXISTS должно быть установлено в non nil, поскольку в противном случае скопированный файл не будет передан. - person Ajned; 06.05.2018
comment
Еще одна деталь заключается в том, что, как упоминалось в этом сообщении Github scp, не работает для некоторых версии emacs / tramp. Поэтому предпочтительнее использовать ssh. - person Ajned; 22.01.2019

Следующие работы (для некоторого определения «произведений»):

* link to copy a file

[[shell:scp remote.host.com:/path/to/file /tmp][scp]]

Но вы должны заранее договориться о беспарольном входе на удаленный хост (например, ssh-copy-id ваш открытый ключ для удаленного): при этом нет вывода в организационном буфере, нет всплывающего окна openssh, только стандартное вопрос из org-mode, спрашивающий, действительно хотите ли вы выполнить команду оболочки, и файл будет тихо скопирован в место назначения.

person NickD    schedule 27.02.2018
comment
Значит, на самом деле нет способа получить запрос пароля на панели терминала emacs? :-( - person Ajned; 27.02.2018
comment
Попробуйте ответить Майкла Альбинуса: [[elisp:(copy-file "/scp:user@remote:/path/to/file" "/tmp")][scp]] - person NickD; 28.02.2018
comment
Я бы не увидел этого, если бы ты мне не сказал. Большое спасибо. На мой вопрос был очевиден ответ: это emacs. Всегда есть выход :-). С уважением. - person Ajned; 28.02.2018