Можно ли преобразовать Org-Babel-код в Elisp?

#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 ))