tcsetattr не работает для пользователей, которые входят в систему с /bin/sh

У меня есть код, чтобы получить то, что stty установлены на терминал пользователя. Затем измените term.c_cc[VERASE], Это прекрасно работает, пока пользователь использует bash. Моя проблема, когда пользователь вошел в систему с помощью оболочки по умолчанию или когда они используют /bin/sh(оболочка, которая имеет только #). Даже если я установил term.c_c[VERASE], это все еще не применяется. Почему это так? Ли tcsetattr не применимо для /bin/sh?

Это часть моего кода:

int tty_raw(int fd)
{
    struct termios attr[1];

    if (tcgetattr(fd, attr) == -1)
            return -1;

    attr->c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
    attr->c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
    attr->c_cflag &= ~(CSIZE | PARENB);
    attr->c_cflag |= (CS8);
    attr->c_oflag &= ~(OPOST);
    attr->c_cc[VMIN] = 1;
    attr->c_cc[VTIME] = 0;

    return tcsetattr(fd, TCSANOW, attr);
}


void get_and_set_tty()
{
    struct termios term,oldterm;
    unsigned char buf[BUFSIZ];
    static char buf2[BUFSIZ];
    static char buf3[BUFSIZ];
    static char end_command[BUFSIZ];
    char exit[5] = "exit";
    char enter = '\x0d';
    char tab = '\x09';
    char end = ';';
    char delete = '\x7f';
    char default_delete;
    int nread;
    int ret;
    int status;
    int restricted = 0;
    int size = 0;
    int i,n;

    if(tcgetattr(STDIN_FILENO, &term) < 0)
    {
      log_debug("Error to get terminal attr");
    }

    default_delete = oldterm.c_cc[VERASE];

    i=0;
    tty_raw(STDIN_FILENO);
    term.c_cc[VERASE] = delete;
    tcsetattr(STDIN_FILENO,TCSANOW,&term);
    while(size != 0)
    {
      end_command[i]=delete;
      size--;
      i++;
    }
    end_command[i]='\x0d';
    i++;
    end_command[i]='\0';
    size = strlen(end_command);
    bufferevent_enable(master_buffer, EV_WRITE);
    log_debug("sending [%s]",end_command);
    if (bufferevent_write(master_buffer, end_command, size)!=0){
      log_error("bufferevent_write failed");
    }
    tty_raw(STDIN_FILENO);
    oldterm.c_cc[VERASE] = default_delete;
    tcsetattr(STDIN_FILENO,TCSANOW,&oldterm);
}

0 ответов

Другие вопросы по тегам