ทดสอบเสียงสะท้อน stty -echo -> stty: อินพุตมาตรฐาน: ioctl ที่ไม่เหมาะสมสำหรับอุปกรณ์


9

ฉันกำลังเล่นกับสคริปต์ perl ที่จะนำผู้ใช้ป้อนด้วยต่อไปนี้:

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

ฉันคิดว่าฉันจะสามารถตอบสนองโดยใช้ echo ได้ แต่ดูเหมือนว่าจะขัดแย้งกับคำสั่ง stty -echo และสร้างข้อผิดพลาดต่อไปนี้:

stty: standard input: Inappropriate ioctl for device

โดยไม่ต้องเปลี่ยนสคริปต์ perl สิ่งที่สามารถทำได้ใน bash ที่จะผ่านในการป้อนข้อมูลหรือไม่ ทำให้เกิดปัญหาอะไร


แทนการใช้ Perl คาดหวังล่าม: เช่น: thegeekstuff.com/2010/10/expect-examples
PersianGulf

ตัวอย่าง Perl อาจไม่ได้เน้นปัญหา ข้อผิดพลาดเกิดขึ้นจากลำดับนี้: echo test | stty-echo;
2219808

คำตอบ:


5

stty -echoเปลี่ยนการตั้งค่าบน descriptor ไฟล์อินพุต หากคุณกำลังไพพ์บางอย่างให้กับคำสั่ง stty ตัวบ่งชี้ไฟล์อินพุตคือไพพ์และ stty บนไพพ์คือใช่มั้ยไม่เหมาะสม (เช่นข้อความแสดงข้อผิดพลาดบอก)

ไม่ชัดเจนว่าคุณกำลังพยายามทำอะไร หากคุณต้องการส่งข้อความtestไปยังสคริปต์ perl ของคุณเพื่ออ่านในmy $input = <STDIN>;บรรทัดจากนั้นเพียงแค่กำจัดสิ่ง stty

หากคุณต้องการอ่านข้อความเป็นอินพุตของผู้ใช้ (เช่นพิมพ์ลงไป) และในขณะที่ทำเพื่อป้องกันข้อความที่ถูกสะท้อน (เช่นรหัสผ่าน) ให้ทดสอบว่าอินพุตมาตรฐานเป็น tty (เทอร์มินัล) ก่อนทำการ stty หรือไม่

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

ที่กล่าวว่าอย่าใช้จ่ายทุกประเภทนั่นไม่ใช่สิ่งที่ Perl สำหรับ (มิฉะนั้นคุณอาจเขียนทุกอย่างลงในเชลล์ด้วย) คุณสามารถเปลี่ยนการตั้งค่า stty จากภายใน perl, google เป็นเพื่อนของคุณ


มันไม่ใช่สคริปต์ของฉันดังนั้นฉันจึงมองหาวิธีการส่งผ่านอินพุตและทำให้เป็นอัตโนมัติโดยไม่ต้องเปลี่ยนแปลง คาดว่าน่าจะเป็นวิธีแก้ปัญหาฉันคิดว่าอาจมีวิธีอื่นในการทำสิ่งต่าง ๆ ค่ะ
2219808

system( qw( stty -echo < /dev/tty) );เป็นวิธีแก้ปัญหาที่เป็นไปได้ แต่สคริปต์ต้องการกู้ echo ในภายหลัง การใช้ความคาดหวังอาจเหมาะสมกว่า
Henk Langeveld

2

sttyเชื่อมต่อกับเทอร์มินัลในอินพุตมาตรฐาน คุณต้องรันสคริปต์ Perl พร้อมกับอินพุตมาตรฐานที่เชื่อมต่อกับเทอร์มินัลที่คุณต้องการดำเนินการ หากสคริปต์ Perl ถูกเรียกใช้จากขอบเขตที่อินพุตมาตรฐานถูกเปลี่ยนเส้นทางไปยังสิ่งอื่นนอกเหนือจากเทอร์มินัลคุณสามารถใช้/dev/ttyเพื่ออ้างถึงเทอร์มินัลการควบคุมของกระบวนการ:

that_perl_script </dev/tty

หากคุณต้องการส่งผ่านอินพุตไปยังสคริปต์และคุณไม่สนใจว่าสคริปต์ทำอะไรกับการตั้งค่าเทอร์มินัลคุณสามารถใช้ความคาดหวังได้ การใช้ความคาดหวังในการป้อนรหัสผ่านไปยังคำสั่งที่ต้องใช้เครื่องปลายทางนั้นเป็นเรื่องปกติ

หากสคริปต์ Perl เข้าถึงเทอร์มินัลเพียงการเรียกใช้sttyคำสั่งวิธีการทางเลือกอื่นก็คือจัดเตรียมsttyคำสั่งดัมมี่

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.