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);
}