私はスクリプトに共通の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)
私は上記のあなたの提案と同じだと思うが、(run-program "ssh":arguments '( "remote" "ls -l"):output:terminal) '私はまったく同じだった問題。また、Trivial-Shellを試してみましたが、 'trivial-shell:shell-command'を使っても、' * bourne-compatible-shell * 'と '* shell-search-パス* '変数。 – snowape
公開鍵/秘密鍵のペアが設定されているので、リモートにssh接続するときにパスワードを入力する必要はありませんか?また、リモートはホスト名ですか? –