Как я могу взаимодействовать с сессией SSH в CLISP? - PullRequest
2 голосов
/ 08 декабря 2011

Я хочу использовать общий lisp для создания сценариев, подключения к удаленному компьютеру через ssh и отправки некоторых команд. Кажется, что проще всего использовать команду clisp ext: run-shell-command, документация здесь , а затем читать и записывать в результирующий поток. Если есть лучший способ, дайте мне знать. Когда я пытаюсь это:

[5]> (setf shell-str (ext:run-shell-command "ssh remotecomp" :input :stream :output :stream)) 

#<IO TWO-WAY-STREAM #<INPUT BUFFERED PIPE-INPUT-STREAM CHARACTER 1204> #<OUTPUT BUFFERED PIPE-OUTPUT-STREAM CHARACTER 1204>>
[6]> Pseudo-terminal will not be allocated because stdin is not a terminal.

Процесс в inferior-lisp-buffer зависает и должен быть остановлен с помощью C-c c. Тем не менее, объект shell-str действительно создается, но когда я пытаюсь прочитать из него, там нет вывода.

[9]> (read-line shell-str)

*** - READ: input stream
       #<IO TWO-WAY-STREAM #<INPUT BUFFERED PIPE-INPUT-STREAM CHARACTER 1204>
         #<OUTPUT BUFFERED PIPE-OUTPUT-STREAM CHARACTER 1204>>
      has reached its end
The following restarts are available:
ABORT          :R1      Abort main loop

Запуск ext: команда run-shell с чем-то вроде «ls -l» работает как положено. Запуск ssh в cygwin или даже в командной строке Windows работает как надо. Я использую clisp 2.49 и openssh 5.9p1 на Windows 7.

Редактировать: все заработало без использования паролей и двойных аргументов для ssh.

(setf str (ext:run-program "ssh" :arguments '("-t" "-t" "host") :output :stream :input :stream))
(format str "ls -l~%")
(finish-output str)
(read-line str)

1 Ответ

1 голос
/ 08 декабря 2011

Snowape нашла решение для обрезки.Вот рабочая версия этого решения для CCL:

? (run-program "ssh" '("-t" "-t" "[user]@[ip]") :output :stream :input :stream :wait nil)
#<EXTERNAL-PROCESS (ssh -t -t ...)[65909] (RUNNING) #x302000A2335D>
? (setf *t* *)
#<EXTERNAL-PROCESS (ssh -t -t ...)[65909] (RUNNING) #x302000A2335D>
? (setf *in* (external-process-input-stream *t*))
#<BASIC-CHARACTER-OUTPUT-STREAM ISO-8859-1 (PIPE/17) #x302000A2304D>
? (setf *out* (external-process-output-stream *t*))
#<BASIC-CHARACTER-INPUT-STREAM ISO-8859-1 (PIPE/18) #x302000A22ABD>
? (read-line *out*)
"Last login: ...
NIL
? (read-line *out*)
"Have a lot of fun...
NIL
? (format *in* "ls -l~%")
NIL
? (finish-output *in*)
NIL
? (read-line *out*)
"user@ip:~> ls -l
NIL
? (read-line *out*)
"total 0
[etc.]

В качестве альтернативного подхода вы можете загрузить пакет Trivial Shell с помощью Quicklisp, а затем запустить процесс оболочки из сеанса lisp, который выполняет сценарии(будет иметь команду ssh внутри него).Я никогда не пробовал Trivial Shell в Windows, поэтому не уверен, как это будет себя вести.

...