3

OSXターミナルでは、ターミナルがパスワード入力セッションを提供するため、SSHでサーバーに接続できます。

$ ssh user@server.com
user@server.com's password: 

独自の端末実装を作りたかったので、

  1. 疑似端末を作成しました。
  2. フォーク
  3. pty スレーブを子プロセスの stdin にリダイレクトしました。
  4. 実行バッシュ。

ssh user@server.com次に、文字列を親プロセスの pty master にプッシュします。しかし、プログラムによってこれを示しました。

$ ssh user@server.com
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).

パスワードセッションの代わりに。

私の問題は何ですか?どうすれば修正できますか?

PS私はexpectユーティリティを使用できることを知っています。これは、私自身の疑似シェル アプリケーションを実装するための単なる試行です。

後で参照するための更新

解決の鍵は、関数のforkpty()代わりにposix_openpt()関数を使用することでした。前者は大変面倒な作業をすべて処理し、双方向のマスターファイル番号を教えてくれます。ファイル番号から読み書きできます。そして、作成された pty デバイスは完全に機能します。SSH ログイン セッションは正常に機能します。対照的に、後者はまだ多くの作業が必要であり、その方法を理解することはできません。

forkpty最後の 2 つのパラメーターを気にする必要がありました。アウトプットかと思ったらインプットだった。それがすべての問題の原因であり、それらを all に設定した後、NULL現在はうまく機能しています。

4

2 に答える 2

4

あなたが望むことをするプログラムがすでにあります:sshpass

http://sshpass.sourceforge.net/

オープンソースなので、ソースを調べてその仕組みを知ることができます。

于 2013-04-02T13:32:20.437 に答える
1

私は最終的にptyデバイスを書きました: https://github.com/eonil/PseudoTeletypewriter.Swift

私の古い Q/A には、もう少し説明があります: NSTask で起動されたプロセスの新しい子プロセスにターミナルを切り替えるには?

于 2015-01-12T14:10:45.847 に答える