我有一个c程序 它使用tcgetattr和tcsetattr来阻止用户输入的回声。
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
int
main(int argc, char **argv)
{
struct termios oflags, nflags;
char password[64];
/* disabling echo */
tcgetattr(fileno(stdin), &oflags);
nflags = oflags;
nflags.c_lflag &= ~ECHO;
nflags.c_lflag |= ECHONL;
if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
printf("password: ");
fgets(password, sizeof(password), stdin);
password[strlen(password) - 1] = 0;
printf("you typed '%s'\n", password);
/* restore terminal */
if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
return 0;
}
我想使用shell脚本执行此程序并为其提供一些输入。从here开始执行以下步骤
$ ./test <<EOF
> hello
> EOF
和
$ ./test <<<'hello'
和
$ ./test <input
和
$ cat input | ./test
但上述所有方法都给了我tcsetattr: Inappropriate ioctl for device
错误
运行此类程序将其添加到shell脚本的适当方法是什么? 或者我们可以从python运行它?如果是,如何将输入从python传递到c程序?
答案 0 :(得分:0)
以下Expect脚本为我工作。
#!/usr/bin/expect
spawn ./test
expect "password:"
send "hello word\r"
interact
我输出如下:
$ ./test.sh
spawn ./test
password:
you typed 'hello word'
我不知道为什么这有效,而其他则不然。 如果有人有更多解释,请随时编辑此答案。