TL;DR -- echo -n abc | bash -c 'read -s x && echo -n \$x'
не выводит abc
.
У меня есть скрипт PHP CLI, которому нужно прочитать пароль со стандартного ввода.
<?php
function quiet_read_stdin ()
{
return shell_exec ("bash -c 'read -s x && echo -n \$x'");
}
print "got: ###".quiet_read_stdin ()."###\n";
?>
Если я запущу это в терминале и введу, скажем, «xyz»:
$> php /tmp/foo.php
got: ###xyz###
Как и ожидалось, это тоже работает
$> echo xyz | php /tmp/foo.php
got: ###xyz###
Но это не так.
$> echo -n xyz | php /tmp/foo.php
got: ######
Это вызывает проблемы в моем скрипте в том случае, если секретный ключ хранится в файле без новой строки, что эквивалентно php /tmp/foo.php < keyfile
.
Это не работает (Inappropriate ioctl for device
):
system ('stty -echo');
$password = trim (fgets (STDIN));
system ('stty echo');
Я не хочу обманывать его, вставляя новую строку на любом этапе. Как мне изменить quiet_read_stdin
, чтобы он работал независимо от того, есть ли в конце ввода новая строка? Решение только для Linux подходит.
stty -echo
у меня не работает. 21.11.2016stty -echo
должен работать. Для меня сообщение об ошибке появляется только при передаче контента и поэтому может быть проигнорировано. 21.11.2016