2

プログラムを起動してキー入力を送信するスクリプトを作成したいと思います。疑似スクリプト:

#!/bin/bash
./program << (PRESS CONTROL-Z)

プログラムは実行中なので、スクリプトに追加のコマンドがあった場合、control-zがプログラムを終了しない限り、それらのコマンドには到達しません。

これは可能ですか?私が見つけたものから、それはキーコードを必要とするかもしれないと思いましたが、私は間違っている可能性があります。

4

4 に答える 4

2

これは、ネイティブのbashスクリプトで実行できるため、「expect」よりもおそらく優れたソリューションだと思います。あなたの考えを見てみたいと思います。

使用する

`printf "character code here"` 

バックティックに注意してください

たとえば、リモートのgnu screenセッションを制御するスクリプトを作成した場合、次の行でウィンドウ2が開き、ctrl-cキーコンボが発行されます。

ssh -t user@$host screen -p 2 -X stuff `printf "\003"`
  • -tオプションは、リモートマシンの端末入力をシミュレートします
  • -pを使用すると、画面セッション内で接続しているウィンドウの名前または番号を指定できます。
  • \003は文字コード0x03のbash形式です

コードの完全なリファレンスについては、ここを参照してください。

いくつかのキー入力のコードを見つけるには、次を使用できます

printf "%#x\n" "'X"
0x58
  • Xはあなたがのコードを見つけたい鍵です
  • 非リテラルのコードを見つけるには、ctrl-vを使用して(bashに次のキーを解釈するのではなくコマンドラインに追加させます)、キーコンボを入力します。したがって、ctrl-cのキーコードを見つけたい場合は、 Xを削除し、ctrl-vを押してから、ctrl-cを押します。

上記のASCIIコードリファレンスでは、キャリッジリターンとして0x13がリストされていますが、画面のマニュアルでは、Enterキーコードとして0x15がリストされていますが、その理由を知っている人はいますか?ローカル画面でテストし、Enterキーを押すと0x13が生成されますが、ssh経由でリモート画面にコマンドを送信すると0x13は機能しませんが、0x15は機能します。

お役に立てば幸い

桟橋

于 2010-09-14T19:42:21.343 に答える
1

あなたが探しているかもしれませんexpecthttp://expect.nist.gov/から)。expectこれは、スクリプト(このシナリオではプログラム)からの入力が端末からのものであるようにプログラムに見せかける、疑似ttyの複雑さを扱います。

echoまたは、その出力を使用するかcat、プログラムにパイプすることができる場合があります。これはプログラムによって異なります。

于 2010-04-11T04:11:47.230 に答える
0

プログラムをバックグラウンドで開始したいだけの場合は、

#!/bin/bash
./program&
于 2010-04-11T04:12:01.473 に答える
0

プログラムをバックグラウンドで実行することが目的の場合は、次を使用します。

./program &    # The & sends the command to the background
echo commands here are executed while program is in the background
…
wait           # Wait for the completion of background commands
echo commands here are executed after background program has completed

編集:プログラムを停止することが目的の場合(ctrl-Zが* nixシェルでよく行うように)、STOP信号を送信できます。

kill -STOP pid

実行を再開するには、CONTシグナルを送信します。

kill -CONT pid

これらの各例pidには、プログラムのプロセスIDがあります。スクリプトで起動すると、変数を使用して簡単に取得できます$!。たとえば、

./prog &
echo prog started in the background
pid_of_prog=$!
kill -STOP $pid_of_prog
echo prog stopped
kill -CONT $pid_of_prog
echo prog continues
wait
echo prog finished

編集2:プログラムがctrl-Z文字を受け取ったときに終了するプログラムである場合、制御文字にはアルファベットの位置文字の数値があることに注意してください(つまり、Ctrl-Aは1、Ctrl-Bは2です)。等。)。このキャラクターをプログラムに送信するには、次のことができます。

echo -e "\032" | ./prog

032は26、つまり^ Z、8進数です。もちろん、同じ文字を任意の方法で生成できます。おそらく、。のような他の入力の最後に追加します( cat inputfile ; echo -e "\032" ) | ./prog

しかし、これは必ずしも機能するとは限りません。プログラムは、入力からこの文字を認識するように設計されている必要があります(おそらく認識されません)。通常、シェルがそれをキャッチします。繰り返しになりますが、入力を読み取るほとんどのプログラムstdinは、入力が終了すると終了するだけなので、有限の入力(でも</dev/null)をリダイレクトすると、入力が終了するはずです。

そして最後に、他のイベント(スクリプトの他の場所で検出された)が発生したときにプログラムの実行を停止することが目的である場合は、それだけkillで済みます…</ p>

于 2010-04-11T04:21:20.833 に答える