prueba de eco | stty -echo -> stty: entrada estándar: ioctl inapropiado para dispositivo

9

Estaba jugando con un script perl que toma la entrada del usuario con lo siguiente:

system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;

Pensé que sería capaz de canalizar una respuesta usando echo, sin embargo, parece estar en conflicto con el comando stty -echo y produce el siguiente error:

stty: standard input: Inappropriate ioctl for device

Sin cambiar el script perl, ¿qué se puede hacer en bash para pasar la entrada? ¿Qué causa el problema?

usuario2219808
fuente
en lugar de usar perl, espere intérprete: como: thegeekstuff.com/2010/10/expect-examples
PersianGulf
El ejemplo de Perl podría no estar resaltando el problema. El error surge esencialmente de esta secuencia: prueba de eco | stty -echo;
user2219808

Respuestas:

5

stty -echocambia la configuración en el descriptor del archivo de entrada. Si está canalizando algo al comando stty, entonces el descriptor del archivo de entrada es la tubería, y stty en una tubería es, eh, inapropiado (como dice el mensaje de error).

No está claro lo que estás tratando de lograr. Si desea enviar el texto testa su script perl para que se lea en la my $input = <STDIN>;línea, simplemente elimine las cosas difíciles.

Si también desea leer el texto como entrada del usuario (es decir, tecleado) y al mismo tiempo evitar que el texto se repita (por ejemplo, una contraseña), pruebe si la entrada estándar es un tty (terminal) antes de hacer el stty:

system( qw( stty -echo ) ) if -t 0;

Dicho esto, no desembolses todo tipo de cosas, para eso no está Perl (de lo contrario, también podrías escribir todo en shell). Puede cambiar la configuración de stty desde Perl, Google es su amigo.

wurtel
fuente
No era mi script, así que estaba buscando formas de pasar entradas y automatizarlas sin cambiarlas. Esperar es probablemente la solución, pensé que podría haber sido una de las cosas de otra manera en tuberías.
user2219808
system( qw( stty -echo < /dev/tty) );es una posible solución, pero el script necesita restaurar el eco después. El uso de esperar puede ser mejor.
Henk Langeveld
2

sttyse conecta al terminal en su entrada estándar. Debe ejecutar el script Perl con su entrada estándar conectada al terminal en el que desea actuar. Si el script de Perl se invoca desde un ámbito en el que la entrada estándar se redirige a algo diferente al terminal, puede usar /dev/ttypara referirse al terminal de control del proceso:

that_perl_script </dev/tty

Si desea poder pasar la entrada al script, y no le importa lo que hace el script con la configuración del terminal, puede usar esperar . Usar esperar para alimentar una contraseña a un comando que requiere un terminal es común.

Si el script Perl solo accede al terminal llamando al sttycomando, un enfoque alternativo sería proporcionar un sttycomando ficticio .

mkdir dummy-stty
echo '#!/bin/sh' >dummy-stty/stty
chmod a+rx dummy-stty/stty
echo swordfish | PATH=$PWD/dummy-stty:$PATH that_perl_script
Gilles 'SO- deja de ser malvado'
fuente