@MaxRAF

Почему не работает ALT-CTRL-Fx?

Всем привет.

Linux CentOS 7

Захожу в консоль по SSH через Putty. Хочу переключиться к примеру на TTY2. Нажимаю CTRL+ALT+F2, но в консоли только [12~

Или

Под простым юзером ввожу chvt 2:
[user@server2 ~]$ chvt 2
Couldn't get a file descriptor referring to the console


Если под рутом, то команда выполняется и всё
[root@server2 user]# chvt 2
[root@server2 user]#


Что я делаю не так?
  • Вопрос задан
  • 445 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Захожу в консоль по SSH через Putty. Хочу переключиться к примеру на TTY2. Нажимаю CTRL+ALT+F2, но в консоли только [12~
Что я делаю не так?

ctrl-alt-f2 -- это сочетание клавиш для драйвера виртуального терминала. Соответственно, оно работает только при вводе через виртуальный терминал.

Под простым юзером ввожу chvt 2:
Если под рутом, то команда выполняется и всё
Что я делаю не так?

В графической консоли вводишь? С помощью strace легко понять что происходит:
от простого юзера:
$ strace -iv chvt 2
...
[00007f96b99d56f0] open("/proc/self/fd/0", O_RDWR) = 3
[00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
[00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
[00007f96b99d5f30] close(3)             = 0
[00007f96b99d56f0] open("/dev/tty", O_RDWR) = 3
[00007f96b99da80a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
[00007f96b99db017] ioctl(3, KDGKBTYPE, 0x7fff06db6d67) = -1 ENOTTY (Inappropriate ioctl for device)
[00007f96b99d5f30] close(3)             = 0
[00007f96b99d56f0] open("/dev/tty0", O_RDWR) = -1 EACCES (Permission denied)
...

Т..е. stdin и /dev/tty не поддерживают ioctl переключающий терминал (вернее, до него даже не доходит), потому что твоя консоль -- это псевдотерминал, а открыть /dev/tty0 не хватает привилегий.
А от рута:
$ sudo strace chvt 2
...
[00007f591848c6f0] open("/proc/self/fd/0", O_RDWR) = 3
[00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
[00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
[00007f591848cf30] close(3)             = 0
[00007f591848c6f0] open("/dev/tty", O_RDWR) = 3
[00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
[00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = -1 ENOTTY (Inappropriate ioctl for device)
[00007f591848cf30] close(3)             = 0
[00007f591848c6f0] open("/dev/tty0", O_RDWR) = 3
[00007f591849180a] ioctl(3, TCGETS, {c_iflags=0x5, c_oflags=0, c_cflags=0xbf, c_lflags=0, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0
[00007f5918492017] ioctl(3, KDGKBTYPE, 0x7fffe5e72d17) = 0
[00007f5918492017] ioctl(3, VT_ACTIVATE, 0x2) = 0
[00007f5918492017] ioctl(3, VT_WAITACTIVE, 0x2) = 0
...

Т.е. stdin и /dev/tty -- то же самое, но /dev/tty0 открывается и ioctl VT_ACTIVATE проходит.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы