从 shell 脚本向 C 程序发送输入



我有一个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'

我不知道为什么这有效,而其他人则不会。如果有人有更多解释,请随时编辑此答案。

相关内容

  • 没有找到相关文章

最新更新