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

时间:2016-05-25 11:27:38

标签: c bash shell input io-redirection

我有一个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程序?

1 个答案:

答案 0 :(得分:0)

以下Expect脚本为我工作。

#!/usr/bin/expect
spawn ./test
expect "password:"
send "hello word\r"
interact

我输出如下:

$ ./test.sh 
spawn ./test
password: 
you typed 'hello word'

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