Я хочу использовать общий 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)