2011-12-07 8 views
2

私はスクリプトに共通のlispを使用し、sshを介してリモートコンピュータに接続していくつかのコマンドを送信したいと考えています。最も簡単な方法は、clispのext:run-shell-command、documentation hereを使用して、結果のストリームを読み書きすることです。より良い方法があれば教えてください。私はこれしようとすると:劣る-lispのバッファハングでclispのsshセッションと対話するにはどうすればいいですか?

[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. 

プロセスをし、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-commandを "ls -l"のように実行すると、正常に動作します。 cygwinやWindowsのコマンドプロンプトでsshを実行すると、うまく動作します。私はウィンドウズ7でclisp 2.49とopenssh 5.9p1を実行しています。

編集:パスワードとダブル-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) 

答えて

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*) 
"[email protected]:~> ls -l 
NIL 
? (read-line *out*) 
"total 0 
[etc.] 

別のアプローチとしては、あなたが(うQuicklispを使用して簡易シェルパッケージをロードした後、スクリプトを実行しlispのセッション内からシェルプロセスを起動することができその中にsshコマンドがあります)。私はWindowsの中でTrivial Shellを試したことは一度もありませんでしたので、その動作がどうなるかはわかりません。

+0

私は上記のあなたの提案と同じだと思うが、(run-program "ssh":arguments '( "remote" "ls -l"):output:terminal) '私はまったく同じだった問題。また、Trivial-Shellを試してみましたが、 'trivial-shell:shell-command'を使っても、' * bourne-compatible-shell * 'と '* shell-search-パス* '変数。 – snowape

+0

公開鍵/秘密鍵のペアが設定されているので、リモートにssh接続するときにパスワードを入力する必要はありませんか?また、リモートはホスト名ですか? –

関連する問題