Завися, какую программу Вы используете для теста, удостоверьтесь, что вывод установлен на pcm4/5. Возможно, что это пытается произвести аудио по HDMI соединение на Вашей видеокарте. Первые 3 записи являются аудио на видеокарте. Можно также проверить, чтобы видеть, регулируется ли громкость достаточно высоко.
Это - fd основной стороне псевдотерминала в эмуляторе терминала, который Вы хотите контролировать, если Вы хотите видеть то, что отображено на нем. Тот основной fd - то, что моделирует провод, который переходит к реальному терминалу. Что xterm
записи на нем являются символами, сгенерированными от клавиши, которую Вы нажимаете. То, что это читает из него, - то, что это отображает.
Например, на Linux:
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
И затем выполненный, например:
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
Конечно, это работает лучше при выполнении этого в терминале того же типа и размера как тот, Вы пытаетесь контролировать. Можно получить размер с:
stty size < /dev/pts/that-terminal
Это выводит то, что читается xterm
с основной стороны терминала, поэтому что отображено там, включая локальное echo
из того, что вводится.
-e read=4
выше для strace
производить hexdump какой xterm
чтения на его fd 4. Остальная часть команды должна преобразовать это в фактические символы. Я попробовал peekfd -n -8 15173 4
но по некоторым причинам который только дал то, что писалось.
Мы используем -opost
отключить любую последующую обработку в нашем контрольном терминале, так, чтобы все xxd
записи ведомой стороне делают это неизменным нашей основной стороне, так, чтобы наш контроль xterm
получает то же самое как контролируемое. -echo
то, так, чтобы, если приложение в контролируемом терминале отправляет escape-последовательность, которая запрашивает ответ от терминала (такого как те, которые запрашивают позицию курсора или терминальный тип или заголовок окна), который пробьется к нашему контролю xterm
и наш xterm
ответит также. Мы не хотим локальное эхо этого.
Вы могли также контролировать то, что вводится путем трассировки write
системные вызовы того же самого fd (замена read
с write
выше). Обратите внимание, что после нажатия Enter, эмулятор терминала отправляет символ CR, не LF. Кроме того, так как мы прослеживаем на основной стороне, если пользователь вводит a<Backspace>b
, мы будем видеть все 3 нажатий клавиш, даже если оконечное устройство будет в каноническом режиме.
Относительно того, почему Ваш не работает:
tee /dev/pts/user_pts </dev/pts/user_pts
Чтение из оконечного устройства читает ввод данных пользователем и пишет в него, должен отобразить его пользователю.
Вы говорите tee
читать из оконечного устройства. Таким образом, то, что это читает (ввод данных пользователем) не будет read
приложением (приложениями), работающим в терминале (и vis стих, tee
и это application
будет бороться за терминальный вход). Пишущий в оконечное устройство, для дисплея там, это не для откладывания его там, как введено. Когда Вы делаете
echo test
(с echo
так как stdout является терминалом), это не то же самое, как будто Вы ввели test
.
Существует ioctl
(TIOCSTI
) для откладывания символов, как введено, но даже который действительно не работал бы, потому что Вы могли отложить его после приложения, как уже считано еще немного, таким образом, это изменит порядок, приложение читает вход и любой путь, который означал бы, чтение его много раз.
Если Ваша ОС поддерживает dtrace, что простой сценарий, shellsnoop, должен позволить Вам контролировать, все вводило/печатало на данном tty.
При выполнении Linux ttysnoop раньше делал подобную вещь, но нуждался в навязчивой конфигурации как в предпосылке и не является AFAIK, более поддерживаемым с текущими ядрами так или иначе, так не поможет в случае. Там более или менее совершенствуются попытки предоставить динамической трассировке Linux, systemtap, ktap и даже dtrace, таким образом, Вы могли бы исследовать их.
Править: Остерегайтесь peekfd, его страница руководства указывает:
Ошибки:
Вероятно, партии. Не удивляйтесь, умирает ли процесс, который Вы контролируете.
Этот подход включает немного gdb и мишени. А-ч, и это также использует socat для эмуляции псевдотерминала. Это могло работать без него, но пользователь заметит, что его вывод больше не является терминалом (программы как vi будут жаловаться).
Это делает следующее:
Я заметил, что удар, кажется, пишет то, что Вы вводите к stderr, я не уверен, делают ли другие программы то же. Если это так, stdin не должен быть прерван.
Назовите его как это: chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>
. usr
и sys-adm
названия терминалов, например, /dev/pts/1
. Таким образом, демонстрационный вызов был бы похож на это: sudo /path/to/script /dev/pts/1 /dev/pts/2
. Можно узнать терминал с tty
команда. И пользовательский терминал любой с w
или ps
.
#!/bin/sh
[ "$1" ] || exit 1
[ "$2" ] || exit 1
usr=$1
sys=$2
utty=${1#/dev/}
ps -e -o tty= -o pid= -o user= | {
found_it=
while read -r tty pid_sh owner; do
if [ "$utty" = "$tty" ]; then
found_it=y
break;
fi
done
[ "$found_it" ] || exit 1
tmp=$(mktemp)
tmp_gdb=$(mktemp)
trap 'rm "$tmp" "$tmp_gdb"' EXIT
socat PTY,link="$tmp",echo=0,raw,openpty,user="$owner",mode=0600 SYSTEM:"tee $sys > $usr" &
printf 'call dup2(open("%s", 1), 1)\ncall dup2(open("%s", 1), 2)
detach\nquit\n' "$tmp" "$tmp" > "$tmp_gdb"
gdb -p "$pid_sh" -x "$tmp_gdb" >/dev/null 2>&1 &
wait
}
Существует простая программа C, названная xkey.c для показа использования X11. Я позволю Вам погуглить его. Можно получить нажатия клавиш на xterm, использующем это без пользователя, являющегося знающим об этом.