2

スクリプトを作成し、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)
4

1 に答える 1

1

Snowape は clisp の解決策を見つけました。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.]

別の方法として、Quicklisp を使用して Trivial Shell パッケージをロードし、スクリプトを実行する Lisp セッション内からシェル プロセスを起動することができます (その中に ssh コマンドが含まれます)。ただし、Windows 内で Trivial Shell を試したことがないので、それがどのように動作するかはわかりません。

于 2011-12-08T19:01:20.197 に答える