使用输入管道和管理键盘
Use input pipe and manage keyboard
我尝试 运行 一个 PHP 脚本,它通过传入管道读取流,我也想管理键盘:cat /etc/passwd|。 /readSlow.php
该脚本将从管道中读取每个字符并在标准输出上缓慢显示,直到用户按下 'q' 键(而不是按下 RETURN)。
实际上,脚本读取管道并缓慢显示文本。但是当我按下 'q' 时它并没有停止(它显示它并且我需要在 'q' 之后按下 RETURN 键来激活停止)。
#!/usr/bin/php
<?php
// ReadSlow
// This tool take a file in input and read it, character by caracter to the
// output.
// It add a sleep time between each character.
// Wait 0.2s between each char
$defaultSpeed = 0.5;
if (($input = fopen ("php://stdin", "r")) === false)
die ("Can not open stdin\n");
if (($keyboard = fopen("/dev/tty", "r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard, false);
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
最后我想要更多可用的密钥。
问题: 我应该如何混合标准输入和键盘中的管道(不显示按下的键,不等待 return 按下)?
我试着玩“stty”,但每次,我都有“stty:'standard input':设备的 ioctl 不合适”
我在 Linux,Bash 如果它改变了什么。
谢谢
问题是stdin和tty是同一个输入通道。如果你可以在没有管道的情况下逃脱,请通过“./readSlow.php /etc/passwd”尝试以下代码。这将要打印的文件作为命令行参数。命令“stty -echo”抑制按键输出。
#!/usr/bin/php
<?php
// ReadSlow
// This tool take a file in input and read it, character by caracter to the
// output.
// It add a sleep time between each character.
// Wait 0.2s between each char
$defaultSpeed = 0.5;
if (($input = fopen ($argv[1], "r")) === false)
die ("Can not open $argv[1]\n");
if (($keyboard = fopen("/dev/tty", "r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard, false);
system("stty -echo");
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
echo "\n";
system("stty echo");
你很接近。 Terminal/console 又名 'tty' Unix 上的设备默认工作在一次一行的模式下,让您有机会纠正小的打字错误。你需要关闭它,stty
是一个很好的方法——但是 stty
在它的标准输入上运行,并且你已经重定向了标准输入(用管道)所以你需要将它重定向回来stty
。在程序的开头尝试 system("stty </dev/tty raw")
,类似地,但在结尾处使用 -raw
。
我尝试 运行 一个 PHP 脚本,它通过传入管道读取流,我也想管理键盘:cat /etc/passwd|。 /readSlow.php 该脚本将从管道中读取每个字符并在标准输出上缓慢显示,直到用户按下 'q' 键(而不是按下 RETURN)。 实际上,脚本读取管道并缓慢显示文本。但是当我按下 'q' 时它并没有停止(它显示它并且我需要在 'q' 之后按下 RETURN 键来激活停止)。
#!/usr/bin/php
<?php
// ReadSlow
// This tool take a file in input and read it, character by caracter to the
// output.
// It add a sleep time between each character.
// Wait 0.2s between each char
$defaultSpeed = 0.5;
if (($input = fopen ("php://stdin", "r")) === false)
die ("Can not open stdin\n");
if (($keyboard = fopen("/dev/tty", "r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard, false);
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
最后我想要更多可用的密钥。
问题: 我应该如何混合标准输入和键盘中的管道(不显示按下的键,不等待 return 按下)?
我试着玩“stty”,但每次,我都有“stty:'standard input':设备的 ioctl 不合适”
我在 Linux,Bash 如果它改变了什么。
谢谢
问题是stdin和tty是同一个输入通道。如果你可以在没有管道的情况下逃脱,请通过“./readSlow.php /etc/passwd”尝试以下代码。这将要打印的文件作为命令行参数。命令“stty -echo”抑制按键输出。
#!/usr/bin/php
<?php
// ReadSlow
// This tool take a file in input and read it, character by caracter to the
// output.
// It add a sleep time between each character.
// Wait 0.2s between each char
$defaultSpeed = 0.5;
if (($input = fopen ($argv[1], "r")) === false)
die ("Can not open $argv[1]\n");
if (($keyboard = fopen("/dev/tty", "r")) === false)
die ("Can not open /dev/tty\n");
stream_set_blocking($keyboard, false);
system("stty -echo");
$speed = $defaultSpeed;
while (($char = fgetc ($input)) !== false)
{
if (($key = fgetc ($keyboard)) === "q") // get input from keyboard
break;
usleep ($speed * 1000000);
echo "$char";
}
fclose ($input);
echo "\n";
system("stty echo");
你很接近。 Terminal/console 又名 'tty' Unix 上的设备默认工作在一次一行的模式下,让您有机会纠正小的打字错误。你需要关闭它,stty
是一个很好的方法——但是 stty
在它的标准输入上运行,并且你已经重定向了标准输入(用管道)所以你需要将它重定向回来stty
。在程序的开头尝试 system("stty </dev/tty raw")
,类似地,但在结尾处使用 -raw
。