我有一个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 脚本执行这个程序并为其提供一些输入。从这里开始的步骤,我尝试了
$ ./test <<EOF
> hello
> EOF
和
$ ./test <<<'hello'
和
$ ./test <input
和
$ cat input | ./test
但是上述所有方法都给了我tcsetattr: Inappropriate ioctl for device
错误
运行此类程序将其添加到 shell 脚本的适当方法是什么?或者我们可以从python运行它吗?如果是,如何将输入从python传递到c程序?
以下期望脚本对我有用。
#!/usr/bin/expect
spawn ./test
expect "password:"
send "hello wordr"
interact
我得到的输出如下:
$ ./test.sh
spawn ./test
password:
you typed 'hello word'
我不知道为什么这有效,而其他人则不会。如果有人有更多解释,请随时编辑此答案。