#emacs #org-mode #org-babel
#emacs #org-режим #org-babel
Вопрос:
У меня есть исходный код org-babel, который обращается к серверу через tramp и запускает там сценарий оболочки. Возможно ли преобразовать этот исходный блок в функцию Elisp?
# BEGIN_SRC sh :dir "/pscp:putty-connection-xy:/dir-yz"
expect -c '
spawn bash -c "scp file-to-copy user@server:/home1/dir-xy"
expect {
"(yes/no)?" {
send "yesr"
expect "*?assword:*"
send "secretPassWordr"
}
"*?assword:*" {
send "secretPassWordr"
}
}
expect eof
'
# END_SRC
Ответ №1:
Используйте Tramp’s multi-hop (непроверенный):
(copy-file "/plink:putty-connection-xy:/dir-yz/file-to-copy"
"/plink:putty-connection-xy|ssh:user@server:/home1/dir-xy/")
При этом используется plink
и ssh
, ‘tho . Если вы можете подключиться user@server
напрямую со своего локального компьютера, вы можете сократить это, используя pscp
:
(copy-file "/pscp:putty-connection-xy:/dir-yz/file-to-copy"
"/pscp:user@server:/home1/dir-xy/")
Комментарии:
1. Большое спасибо. Я искал решение для преобразования этого кода в функцию Elisp. Из-за разрешения я должен ввести пароль.
2. Пароли могут обрабатываться
auth-source
пакетом.
Ответ №2:
Решение простое. Я вызываю блок и передаю его через «sh», код и параметры блока. Это работает
(org-babel-execute-src-block nil
'("sh"
"cd /home1/
expect -c '
spawn bash -c "scp file-to-copy user@server:/home1/dir-xy ."
expect {
"*?assword:*" {
send "secretPassWord\r" } }
expect eof'
"
((:colname-names) (:rowname-names)
(:result-params "raw" "replace")
(:result-type . value) (:results . "silent")
(:exports . "code")
(:tangle . "no") (:hlines . "no") (:noweb . "no")
(:cache . "no") (:session . "none")) "" nil nil ))