スクリプトの「\033[6n」のように入力(バッファ)に出力を強制します。

スクリプトの「\033[6n」のように入力(バッファ)に出力を強制します。

(Cプログラムまたはスクリプト)出力が入力バッファに到達するようにパイプとリダイレクトを使用してみましたが、printf "\033[6n"肯定的な結果はありませんでした。

これがどのように可能かを知っている人はいますか?

  1. コマンドライン
  2. シェルスクリプトから
  3. Cコード

パイプ出力_cmd_ > /dev/stdinとCコードにはfprintf(stdin, "blah\n");測定可能な影響はありません。

メモ:私は入力を別のコマンドで「パイプ」したくなく、「キーボードバッファ」(実際)に文字を「注入」したいと思います。

編集する:最初のユースケースは、次のshellことを可能にするSandbox CLIアプリケーションです。system注文するオペレーティングシステム(例:Bas)と対話しますが、いいえファイル記述子を処理します。

答え1

編集する:短い答え以前は /dev/uinput、そして今はそうですTIOCSTI(投稿の終わりを参照)


これまでの回答とコメントへの回答は次のとおりです。

ioctl_tty(2)TIOCSTI私はそれを持っていませんが、カーネルのソースコードを見ると(経由)自由電子tiocsti)は、コンテキストを使用する「偽の入力文字」を表示しますtty_struct

問題のアプリケーションは常に対話型で実行されるため、パイプとリダイレクトは使用できません。スクリプトに使用できますが、shell他の同様のアプリケーションとは異なり、結果のキャプチャは許可されず、通常の方法で操作を許可およびstdin実行します。stdout

近い将来、これが変わる可能性はなく、それは私のアプリケーションではありません。ただし、コンテキストを使用して&inを使用すると、カーネルによってキーボードバッファに注入された"\033[6n"結果を切り取ることができます。tty_insert_flip_chartty_schedule_flipsrc/drivers/tty/tty_buffer.ctty_port

私の記憶が正しい場合、FDファイル構造が変更される前に、ただ4つのファイル記述子がこれを達成できます。最近はTTYデバイスに書き込むことができますが、TTYデバイス/dev/stdinに接続されており、TTYデバイスに書き込んだすべての内容は最終的に画面に表示されます()。カーネルは、TTYを使用するときにファイル記述子ルーティングをバイパスするようです。これらの関数はそれを呼び出します。/proc/self/fd/0/dev/tty#/dev/stdoutflipポート

ユーザー空間アプリケーションはこれらのカーネル機能にアクセスできません。 X-Windowsではxvkbdおよびxdotoolまたはを使用できますが、xteこのアプリケーションはLinux(VT)コンソールで使用されます。


(ほぼ)正しい答えは次のとおりです。

/dev/uinputユーザー権限がなくても(ほとんどのシステムでは)すべてのパラメータが機能するsudoスクリプトですprintf

またはキーボードイベントまた、すべてのユーザーがアクセスできるため動作しますが、起動するたびにすべてのシステムを変更します(私は一般的ですが、必ずしも/dev/input/event0そうではありません)。

さらなる調査によると、これらの方法のうち特にスクリプトには実用的ではない。私たちは何をすべきかを理解しなければなりません。私たちはレンダリングしたいだけです。テキスト「キー押しシミュレーション」(上記のデバイスの動作)ではなく、入力バッファにあります。


(最も実用的な)実際の答えは次のとおりです。

オフサイトの質問は、2011年のstackexchangeに対する回答を引用します(ここ)。 。TIOCSTIもう一度Perlの例を見ると、アプリケーションを提供しないスクリプトにも役立ちます。

perl -le 'require "sys/ioctl.ph";
      ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
     ' `_cmds_`

しかし、画面にも反映されます。数時間の追加調査と実験を経た後、スクリプトやコマンドラインで以下が実用的になりました。

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo

メモ:TIOCSTI退会したけどオープンBSD 6.2(2017年10月)明らかにLinuxカーネル開発者は反対キャンセルをしっかり拒否します(次からキャンセルできます)。OpenBSDジャーナル)。

答え2

Debian Bullseyeをはじめ、そこconsole-toolsに吸収されたのはkbdwritevtいいえ含む。必要に応じて、この記事の最後のアップデートにソースをリンクできます。


writevt /dev/tty# text、少なくともLinux、BSD、およびUnixでは、現在のパッケージの一部ですconsole-tools。ユーザーは必ず書くVT権限。特に(編集:OSで利用可能な場合)、OPの完全で正解は次のとおりです。

writevt `tty` "`_cmds_`"

この問題は、StackExchange コミュニティ全体が基本オペレーティングシステムの深い理解を欠いていることを示しています。writevt非常に古く、99%(編集者:Debian Linux)システムにインストールされる必須コマンドです。 2002年6月現在、Debianにはマニュアルページや管理者がいませんでした。これが15年前の仕事であるにもかかわらず、多くの人がそれについて知らなかった理由を説明できます。しかし、Kali Linux(これはすべて) 通常、以下に記載されていません。書くことができる 注文する、最初からそこにあったにもかかわらず。


Debian Buster からはデフォルトでwritevtインストールされなくなり、一部によれば、どのパッケージにも存在しなくなる可能性があります(管理者の不足やパッケージの変更によりconsole-tools?)

アップデート:console-tools実際にDebianパッケージ検索でそれが見つからない場合はバックポートすることもできません(元のコンテンツを確認しました)。

元のパッケージプロジェクトは次のとおりです。

http://lct.sourceforge.net/

パッチは必要ありません。 Raspbian/RPiOS には Debian バージョンがあります (Wheezy から Buster まで):

http://raspbian.raspberrypi.org/raspbian/pool/main/c/console-tools/

Yan Dirsonの言葉を引用するには:

現在(パブリック)ソフトウェアプロジェクト私はDebian GNU / Linuxプロジェクトに参加しており、1997年からそのプロジェクトに参加しました。

http://ydirson.free.fr/en/software/

吸収されるのを待ってkbd- 2001

console-tools「Linuxコンソールツール」プロジェクトのパッケージはRPiOSで引き続き利用できます。linuxconsoletoolsSourceForgeにある「Linuxコンソールプロジェクト」のパッケージとは異なります。

関連情報