Запись взаимодействия Bash, сохранение STDIN, STDOUT отдельно - PullRequest
0 голосов
/ 19 февраля 2019

Итак, я хочу записать свое взаимодействие с bash, которое я знаю, что могу сделать с script или ttyrec .За исключением того, что я хочу на одну функцию больше, чем они.Сохраняйте ввод (т.е. STDIN) и вывод (т.е. STDOUT) отдельно.

Так что-то вроде (где я набрал первый «Hello World!»), За исключением, конечно, script занимает один [file] аргумент,не два:

user@pc:~$ script input.txt output.txt
Script started
user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
Hello World!
user@pc:~$ exit
Script done

Итак input.txt выглядит так:

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
user@pc:~$ exit

И output.txt выглядит так:

Hello World!
exit

Итак, я хочу такую ​​программу, какscript, который сохраняет STDIN & STDOUT отдельно.Так как в настоящее время это будет нормальный вывод script (который я не хочу, и нужно отделить):

Script started

user@pc:~$ paste > textfile.txt
Hello World!
user@pc:~$ cat textfile.txt 
Hello World!
user@pc:~$ exit
exit

Script done

Это существует, или это возможно?

Примечаниеиспользование команды paste, так как я рассмотрел фильтрацию выходного файла на основе user@pc:~$, но в моем случае (как с paste) это не сработало бы.

1 Ответ

0 голосов
/ 20 февраля 2019

пусто

пусто упаковано для различных дистрибутивов Linux (это empty-expect в Ubuntu).

  1. открыть два терминала
  2. клемма 1 : работа empty -f -i in.fifo -o out.fifo bash
  3. клемма 1 : работа tee stdout.log <out.fifo
  4. клемма 2 : работа stty -icanon -isig eol \001; tee stdin.log >in.fifo
  5. введите команды на клемму 2 , следите за выходом на клемме 1
    • , исправьте настройки клеммы с помощью stty icanon isig -echo
    • регистрировать stderr отдельно от stdout с exec 2>stderr.log
    • по окончании exit оболочкой bash;обе команды tee завершат работу
  6. stdout.log и stdin.log содержат журналы

Некоторые другие параметры:

peekfd

Вы можете попробовать peekfd (часть пакета psmisc).Вероятно, его нужно запускать с правами root:

peekfd -c pid fd fd ... > logfile

, где pid - это процесс, к которому нужно присоединиться, -c говорит, что также присоединяется к дочерним элементам, а fd - это список файловых дескрипторов, которые нужно посмотреть (в основном0, 1, 2).Существуют различные другие варианты настройки выходных данных.

Файл журнала потребует постобработки для соответствия вашим требованиям.

SystemTap и аналогичные

Over unix stackexchange , было предложено использовать инструмент SystemTap .Тем не менее, это не просто настроить, и вам все равно придется написать модуль, который разделяет stdin и stdout.

sysdig и bpftrace также выглядят интересно.

LD_PRELOAD / strace / ltrace

Используя LD_PRELOAD , вы можете обернуть вызовы низкого уровня, такие как write (2).

Вы можете запустить свою оболочку в strace или ltrace и записывать данные, передаваемые в системные и библиотечные функции (например, запись).Требуется много постобработки:

ltrace -f -o ltrace.log -s 10000000000 -e write bash

patch ttyrec

ttyrec.c - это всего 500 строк довольно простого кода, и похоже, что было бы довольно легко установить патч для использования нескольких файлов журнала.

...