問題タブ [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.
linux - プロセスとターミナル間の通信をスパイするにはどうすればよいですか?
ターミナルと通信するサードパーティによって開発された Linux プロセスがあります。デバッグのために、通信が行き来するのを見たいです。
cat
(一方向を見るために)トリックを行うと思うかもしれません:
...しかし、そうではありません。むしろ、cat
アプリケーション向けのデータの半分を盗みますが、これはほとんど価値がありません。
third-party-app は、想定するようにハードコーディングされて/dev/tty
います。
通信をスパイするために私が見つけた 1 つの方法は、/dev/tty
デバイスの名前を変更し、その場所で/dev/real_tty
呼び出される名前付きパイプを作成することです。/dev/tty
次に実行します:
... から名前付きパイプにデータ/dev/real_tty
をコピーすることで、少なくとも の出力を確認できます。/dev/real_tty
/dev/tty
stdout
この種の機能は機能しますが、非常に危険な感じがし、デバイスを交換するという巧妙な方法に依存しています。また、名前付きパイプは一方向にしかデータを伝送しないため、双方向には機能しません。
これを行う正しい方法は何ですか?
不思議に思っている方のために説明すると、TTY デバイスはマイクロコントローラーへの RS-232 リンクです。情報は機密でも安全でもありません。すべてのプロセス (アプリケーションとスパイ) は root として実行できます。
linux - Linux で誰かが pty (疑似端末) のスレーブ側を開いたことを検出するにはどうすればよいですか?
シリアル デバイス (/dev/ttyXX) から複数のプロセスを読み取ると、両方のプロセスがすべてのデータを取得できなくなります。データは何らかの方法でプロセス間で分割されます。シリアル デバイスから読み取り、いくつかのマスター/スレーブ pty ペアを作成し、シリアル デバイスから読み取るように作成されたプログラムが代わりに pty から読み取れるようにして、すべての読み取りプロセスがデータを受信できるようにするプログラムを作成したいと考えています。 pty から読み取りを開始すると、最新のデータのみを取得するという意味で、pty はシリアル デバイスのように動作します。つまり、読み取りを開始する前に書き込まれたデータは取得されません (これが /dev/ttyXX デバイス、または少なくとも私が読み取っている RS-232 風速計の動作方法であるというのが私の経験です)。名前付きパイプは、SIGPIPE をトラップしてリーダーがないと判断することで、これらのセマンティクスを模倣できるため、その特定の名前付きパイプに書き込みを行わないように選択できます。ただし、ターミナルを使用するように作成された一部のバイナリは、名前付きパイプと通信するときに失敗する可能性があります。ここで重要なのは、端末用に作成された既存のバイナリを使用できるようにすることです。
したがって、pty のスレーブ側が読み取り用に開かれていることを検出できれば、名前付きパイプの場合に SIGPIPE がない場合とほぼ同じセマンティクスが得られるはずです。HP-UX には ioctl() コマンドとして TIOCTRAP があり、これはまさに私が望んでいることを実行しているように見えますが、残念ながら Linux では利用できません。
私は何日も参考文献を読んできましたが、この種のオプションの数は驚異的です。答えは、端末の設定、ブロック/非ブロック動作、どこかにバッファ サイズを設定すること、poll()/select() から報告される条件、またはいくつかの組み合わせにある可能性があります。しかし、私は何も見つけられないようです。独自のデバイスドライバーを作成する必要がある可能性があるかどうか疑問に思っていますが、そこまで行かなくてもこれを行うことができるはずです。
明確にするために:
- 質問: Linux で誰かが pty (疑似端末) のスレーブ側を開いたとき、どのように検出できますか?
- pty のスレーブ側を開いているリーダーに、リーダーが pty を開いた後に厳密に書き込まれたデータを受信させたい (リーダーがスレーブ側を開く前に、マルチ書き込みプロセスがしばらくの間データを書き込むだけの場合、データはバッファリングされ、最終的に、ライターはブロックされ、スレーブ リーダーは、開くとすぐにすべてのバッファリングされたデータを取得します。これは、時間的にすぐ近くで生成されたデータのみを取得する
必要
があるため、望ましく
ありません)。 isatty() や tcsetattr() などの名前付きパイプ、ソケットなどは、既存のバイナリが機能するように OK である必要があります。
ruby - シェルにサブプロセスがある場合、Ruby の PTY ライブラリが入力をキャプチャできないのはなぜですか?
PTY ライブラリを使用して Ruby でターミナル エミュレータを作成しています。/dev/tty0
キーボードに接続されたデバイスファイルです。私はこのようにシェルを生成しています:
ほとんどの場合は機能しますが、サブプロセスがシェルで開始されると、shell[0]
そのサブプロセスにキーボード入力が出力されません。例: を"cat\nasdf"
介して送信するshell[1]
と、を介し"cat"
て戻ってきますshell[0]
が、そうで"asdf"
はありません。なぜこれが起こっているのですか? どうすれば修正できますか?
編集:
これが私のコードです。ChumbyScreen
私がこれを書いている組み込みデバイスの画面を制御する外部モジュールです(「Chumby」と呼ばれます)。このwrite
メソッドは、文字を画面に配置します。
shodanexの答えを読んだ後、私はこれを試しました:
動作しますが、Enter キーを押すまで入力した文字が表示されません。何らかの形で行バッファリングする必要があります - どうすればこれを乗り越えられますか? また、Control-C と Control-D は何もしません。eof を送信してプロセスを終了する必要があります。
linux - rlwrap: マスター pty を開けませんでした: そのようなファイルまたはディレクトリはありません
実行しようとするとrlwrap tclsh
、次のエラー メッセージが表示されます。
これは何が原因ですか?この問題を解決するにはどうすればよいですか?
PS 私は 64 ビットの CentOS を実行しています。
python - マスターからスレーブ疑似端末にならない文字
現在、pexpect を介してバイナリ データを送信しようとしています。何らかの理由で、スキップされた 0x04 を除いて、データは単に検索を通過します。私は pexpect 呼び出しを追跡して、起こっているのは pty.fork() コマンドから開かれたファイル記述子への os.write() 呼び出しだけであることを確認しました。
何か案は?
(問題を例示するコード例)
結果:
c - C/Linux プログラミング: 疑似端末: 現在の stdio から pty にリダイレクトし、使用後に元に戻す方法
ユーザーが私の小さなデバイスに接続して、システムの現在の標準入出力を「引き継ぐ」ことができる単純なリモート管理プログラムを作成しようとしています。例えば:
システムは console=serial port で起動します --> クライアントが接続し、入力/出力をソケットにリダイレクトします
Linuxのpty機能を使用して、ネットワーク部分へのリダイレクトをすでに完了しています(多くのmanページを読むことで。男、今までこれらのmanページを高く評価したことはありません!:D)。
openpty() -> grantpt() -> unlockpt() --> クライアントが接続し、login_tty() を実行
私のプログラムは、マスター FD とソケットの監視を処理します。ただし、大きな問題があります。出力をリダイレクトする方法がわかりません。私は次のことを試しました:
o シリアルポートファイルを開くハードコード
o login_tty() で開かれたシリアルポートファイルを使用する
しかし、それは機能していないようです (プロセスグループに関する何かと、最初の login_tty() を実行した後のプロセスグループのリーダーであること)。提案やアイデアはありますか?
login_tty() にはある種の「逆」関数がありますか?
python - python pty.fork - どのように機能しますか
http://docs.python.org/library/pty.htmlは言う -
pty.fork()¶ フォーク。子の制御端末を疑似端末に接続します。戻り値は (pid, fd) です。子は pid 0 を取得し、fd は無効であることに注意してください。親の戻り値は子の pid であり、fd は子の制御端末 (および子の標準入出力) に接続されたファイル記述子です。
これはどういう意味ですか? すべてのプロセスには 3 つの fd (stdin、stdout、stderr) があります。これは現在、これらの fd に影響しますか? 子プロセスにはこれらの fd がありませんか? 私は混乱しています.--完全に。
bash - ttyに書き込むプログラムをリダイレクトする方法は?
これはリダイレクトされていない出力です(何であるかわからない場合module
は、それほど重要ではありません)。
それをファイルにリダイレクトしたいとします。
まあ、それは上にある必要がありますstderr
おい!リダイレクトをリセットしています。これは本当に迷惑です、そして私は2つの質問があります:
- どうすれば私が望むものを達成できますか、つまりすべてをファイルにリダイレクトします
- なぜ彼らはそんな奇妙なことをしているのですか?
この関連する質問も参照してください。
編集:誰かがコメントで尋ねたので、いくつかの詳細。これは、AIX5.3の64ビットです。私はPython2.6.5をほぼ完全に利用できます。gcc4.1.1とgcc4.5.1の両方がありますが、それらをリンクするライブラリは多くありません(回答に記載されているスクリプトバージョンを含むutil-linux-ngライブラリは、getopt部分のコンパイルに失敗します)。また、IBMXLコンパイラーxlcのいくつかのバージョンがあります。私が最初に指定しなかった理由は、外部プログラムではなく、おそらくexecを使用して、いくつかのシェルトリックを期待していたためです。
php - PHPを使用してインタラクティブなSSHセッションを設定するにはどうすればよいですか?
Mac OS X 10.6のコマンドラインからPHPを使用して、リモートサーバーへのインタラクティブなSSH接続を確立しようとしています。現在、PHPのproc_open関数を使用して次のコマンドを実行しています。
これはほとんど機能します。-t -t
オプションは、ほとんどの場合、疑似端末を強制することになっています。SSHパスワードを入力して、Enterキーを押すことができます。ただし、Enterキーを押した後、端末は単にハングしているように見えます。出力も何もありません-SSHセッションが失敗したかのようです。コマンドなどを実行できず、Ctrl+Cを使用してすべてを強制終了する必要があります。ssh -t -t -p 22 user@server.com "ls -la"
のようなコマンドを実行して正しい出力を取得できるため、ログインが成功したことはわかっています。
この問題は、proc_open呼び出しで標準パイプを使用していたことに関連していると考えたため、それらをptyに置き換えました。次のエラーが発生します:「このシステムではpty疑似端末がサポートされていません...」
Mac OS Xは単にptyまたは疑似端末をサポートしていませんか?(私はこのすべてのシェル用語を使用するのはかなり新しいです)。
PHPコードは次のとおりです。
(申し訳ありませんが、SOのフォーマット手順を理解することはできません...)
私は何が間違っているのですか?なぜptyを使用できないのですか?これはMacOSXでは不可能ですか?ご協力いただきありがとうございます!
linux - TTY(ターミナル)を期待するLinuxプログラムへのデータのパイピング
Linuxに、stdin / stdoutがTTY(ターミナルデバイス)でない場合に実行を拒否するプログラムがあります。PTYを作成し、新しく作成したTTYでプログラムを起動し、すべてのデータをstdin / stdoutにコピーする使いやすいツールはありますか?
ユースケースはインタラクティブではありませんが、スクリプトです。私は最も軽量なソリューションを探しています。できればTCP接続を作成せず、他のツールやライブラリをインストールする必要がありません。