スクリプトを作成し、ssh を介してリモート コンピューターに接続し、いくつかのコマンドを送信するために Common Lisp を使用したいと考えています。最も簡単な方法は、clisp の ext:run-shell-command, documentation hereを使用して、結果のストリームを読み書きすることです。より良い方法があれば教えてください。これを試すと:
[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のプロセスがハングし、Cc 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
「ls -l」のようなものを指定して ext:run-shell-command を実行すると、期待どおりに動作します。cygwin または Windows コマンド プロンプトで ssh を実行すると、正常に動作します。Windows 7でclisp 2.49とopenssh 5.9p1を実行しています。
編集:パスワードを使用せず、sshに二重の-t引数を使用することで機能しました。
(setf str (ext:run-program "ssh" :arguments '("-t" "-t" "host") :output :stream :input :stream))
(format str "ls -l~%")
(finish-output str)
(read-line str)