問題タブ [pty]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - SSH パスワード入力を許可するシェルのようなプログラムを作成するには?
OSXターミナルでは、ターミナルがパスワード入力セッションを提供するため、SSHでサーバーに接続できます。
独自の端末実装を作りたかったので、
- 疑似端末を作成しました。
- フォーク
- pty スレーブを子プロセスの stdin にリダイレクトしました。
- 実行バッシュ。
ssh user@server.com
次に、文字列を親プロセスの pty master にプッシュします。しかし、プログラムによってこれを示しました。
パスワードセッションの代わりに。
私の問題は何ですか?どうすれば修正できますか?
PS私はexpect
ユーティリティを使用できることを知っています。これは、私自身の疑似シェル アプリケーションを実装するための単なる試行です。
後で参照するための更新
解決の鍵は、関数のforkpty()
代わりにposix_openpt()
関数を使用することでした。前者は大変面倒な作業をすべて処理し、双方向のマスターファイル番号を教えてくれます。ファイル番号から読み書きできます。そして、作成された pty デバイスは完全に機能します。SSH ログイン セッションは正常に機能します。対照的に、後者はまだ多くの作業が必要であり、その方法を理解することはできません。
forkpty
最後の 2 つのパラメーターを気にする必要がありました。アウトプットかと思ったらインプットだった。それがすべての問題の原因であり、それらを all に設定した後、NULL
現在はうまく機能しています。
ruby - PTY gem が見つかりません
WindowsにRuby 1.9.3がインストールされています。gem を要求しようとすると、gem が見つからないというコンソール出力が表示されます。
どの出力:
また、私は試しました:
そして、この出力を得ました:
これを修正するにはどうすればよいですか?
unix - OpenSSH RequestTTY によって stderr が stdout にリダイレクトされるのはなぜですか?
-T と -t を指定して同じ ssh コマンドを実行すると、stderr 出力はそれぞれ stderr と stdout に到着します。
pty が割り当てられていません:
ssh -T user@host "echo >&2 foo" 1>/tmp/out 2>/tmp/err
出力は に書き込まれ/tmp/err
ます。
pty 割り当てあり:ssh -t user@host "echo >&2 foo" 1>/tmp/out 2>/tmp/err
出力は に書き込まれ/tmp/out
ます。
pty を使用すると完全な疑似画面がシミュレートされ、出力が raw モードであることはある程度理解できます。画面に送信された出力は、stdout 経由で ssh に送信され、ssh の tty も raw モードに設定されます。誰かがそれをさらに説明してもらえますか?
python - Python 2.7 - mpg123 とのサブプロセス コントロールの相互作用
ここで数週間前にこれに関連する質問をしました: Python、mpg123、およびサブプロセスがstdin.writeまたはcommunicationを適切に使用していません
そこからの助けのおかげで、私はその時に必要なことをすることができました. (q は呼び出しませんでしたが、それを停止するためにサブプロセスを終了しました)。
以前と同じように、mpg123 の標準的なコントロールと同じように mpg123 を終了するには、これが必要です (「q」を押して終了するか、「-」を押して音量を下げるか、「+」を押して音量を上げるなど)。 )、今私は上記のコードを使用しています。これは理論的には機能するはずであり、同様のプログラムで機能します。サブプロセスを使用して、mpg123 に組み込まれているコントロール (「mpg123 -C what.mp3」を使用してアクセスできるコントロール) を使用する方法を知っている人はいますか? コントロールが必要になるので、terminate ではもう十分ではありません ^_^
編集: abarnert にすばらしい回答をありがとう =) わかりました。したがって、新しいコードは単に abarnert の回答をわずかに変更したバージョンですが、mpg123 はコマンドを受け入れていないようです。
linux - 投獄された Linux ユーザーの forkpty が失敗する
サーバーにUbuntu 12.04をセットアップしています。登録されたすべてのユーザーは、Linux ユーザーとしても登録され、 /etc/security/limits.conf を通じてシステム リソースへのアクセスが制限されます。
登録ユーザーの 1 人としてサーバーを実行してみました。アプリは nodejs アプリです - http://github.com/pocha/terminal-codelearn。https://github.com/chjj/pty.jsを使用して、nodejs アプリにアクセスするすべてのユーザーに対して疑似ターミナルを作成します。
https://github.com/chjj/pty.js/blob/65dd89fd8f87de914ff1814362918d7bd87c9cbf/src/unix/pty.ccの 184 行目に「forkpty(3) failed」エラーが表示されてアプリが失敗する
http://nitrous.ioにアプリを正常にデプロイできました。彼らはおそらく刑務所のユーザーと同様の方法を持っています。ulimits -a
保留中のシグナルを除くすべての値を実行して一致させてみました。私のサーバーではどういうわけか、Nitrous サーバーでは 584k ですが、保留中の信号の最大値は約 90k の値を超えません。
以下は、Nitrous サーバーからの ulimit -a 出力です。
アプリはherokuで失敗し、まったく同様のエラーが発生します。
nitros.ioで動作するように、サーバーでアプリを実行する方法について誰か助けてもらえますか
python - 子プロセスが入力を待っているときの検出
ユーザーがアップロードした任意の (したがって、最悪の場合、安全でなく、エラーが発生し、クラッシュする) コードを Linux サーバーで実行するための Python プログラムを作成しています。セキュリティの問題はさておき、私の目的は、コード(コンパイルまたは解釈された任意の言語である可能性があります)が正しいものを に書き込むかどうかstdout
、stderr
およびプログラムのstdin
. この後、結果をユーザーに表示する必要があります。
現在の解決策
現在、私の解決策は、 、およびsubprocess.Popen(...)
のファイルハンドルを使用して子プロセスを生成することです。ハンドルの後ろのファイルには、プログラムが操作中に読み取る入力が含まれており、プログラムが終了した後、ファイルとファイルが読み取られて正確性がチェックされます。stdout
stderr
stdin
stdin
stdout
stderr
問題
このアプローチはそれ以外の場合は完全に機能しますが、結果を表示するときに、指定された入力と出力を組み合わせて、端末からプログラムを実行したときと同じ場所に入力が表示されるようにすることはできません。つまり、次のようなプログラムの場合
stdout
実行後のプログラムの内容を含むファイルの内容は次のようになります。
を含むファイルの内容stdin
がAnonymous<LF>
. したがって、要するに、指定されたサンプルコード (および同等に、他のコード) に対して、次のような結果を達成したいと考えています。
したがって、問題は、プログラムがいつ入力を待っているかを検出することです。
試した方法
問題を解決するために、次の方法を試しました。
Popen.communicate(...)
これにより、親プロセスはパイプに沿って個別にデータを送信できますが、一度しか呼び出すことができないため、ドキュメントから推測できるように、複数の出力と入力を持つプログラムには適していません。
Popen.stdoutとPopen.stderrから直接読み取り、Popen.stdinに書き込む
ドキュメントはこれに対して警告しており、プログラムが入力を待機し始めると、Popen.stdout
s.read()
と.readline()
呼び出しが無限にブロックされるようです。
select.select(...)
ファイルハンドルが I/O の準備ができているかどうかを確認するために使用します
これでは何も改善されないようです。どうやら、パイプは常に読み取りまたは書き込みの準備ができているようです。そのため、select.select(...)
ここではあまり役に立ちません。
ノンブロッキング読み取りに別のスレッドを使用する
この回答で示唆されているように、からの読み取り結果を Queue() に格納する別のThread()を作成しようとしました。ユーザー入力を要求する行の前の出力行は適切に表示されますが、プログラムがユーザー入力の待機を開始する行 (上記の例) は読み取られません。stdout
"Type your name: "
子プロセスのファイル ハンドルとしてPTYスレーブを使用する
hereの指示に従ってpty.openpty()
、マスターとスレーブのファイル記述子を使用して疑似端末を作成しようとしました。その後、スレーブ ファイル記述子をsubprocess.Popen(...)
呼び出しのstdout
,stderr
およびstdin
パラメータの引数として指定しました。で開かれたマスター ファイル記述子を読み取るとos.fdopen(...)
、別のスレッドを使用した場合と同じ結果が得られます。入力を要求する行は読み取られません。
編集: @Antti Haapala のpty.fork()
子プロセス作成の例を代わりにsubprocess.Popen(...)
使用すると、 によって作成された出力も読み取ることができるようですraw_input(...)
。
pexpect の使用
また、pexpect で生成されたプロセスのメソッド (ドキュメントはこちら) も試しましたが、 で得た最良の結果はread()
以前と同じです:read_nonblocking()
ユーザーに何かを入力してもらう前の出力の行は読んでください。で作成された PTY と同じです。入力を要求する行は読み取られます。readline()
read_nonblocking()
pty.fork()
編集:子を作成するマスタープログラムでing の代わりにsys.stdout.write(...)
andを使用すると、プロンプト行が表示されない問題が修正されたように見えましたが、実際にはどちらの場合も読み取られました。sys.stdout.flush()
print
その他
も試しましselect.poll(...)
たが、パイプまたは PTY マスター ファイル記述子は常に書き込みの準備ができているようです。
ノート
その他のソリューション
- また、新しい出力が生成されずに時間が経過したときに入力をフィードしようとすることも頭に浮かびました。ただし、プログラムが重い計算を実行している最中かどうかを知る方法がないため、これは危険です。
- @Antti Haapala が回答で述べたように、
read()
glibc のシステム コール ラッパーを置き換えて、入力をマスター プログラムに伝えることができます。ただし、これは静的にリンクされたプログラムやアセンブリ プログラムでは機能しません。(ただし、今考えてみると、そのような呼び出しはソースコードから傍受され、パッチが適用されたバージョンのread()
- に置き換えられる可能性がありますが、それでも実装するのは骨の折れる可能性があります。) - システムコールをプログラムに伝えるためにLinuxカーネルコードを変更するの
read()
は、おそらく非常識です...
PTY
PTY は端末を偽装し、あらゆる場所の端末で対話型プログラムが実行されるため、PTY が適していると思います。問題は、どうやって?