Обманите приложение, думая, что его выступление – это терминал, а не труба

Я пытаюсь сделать противоположное

Обнаруживать, является ли stdin терминалом или трубой?

Я запускаю приложение, которое меняет его выходной формат, потому что он обнаруживает канал на stdout, и я хочу, чтобы он думал, что это интерактивный терминал, так что я получаю тот же результат при перенаправлении.

Я думал, что обернуть его в сценарий expect или использовать proc_open() в PHP сделает это, но это не так.

Есть идеи?

Ага!

Команда script делает то, что мы хотим …

 script --return -c "[executable string]" /dev/null 

Это трюк!

Основываясь на решении Криса , я придумал следующую небольшую вспомогательную функцию:

 faketty() { script -qfc "$(printf "%q " "[email protected]")" /dev/null } 

Причудливый вид printf необходим для правильного расширения аргументов скрипта в [email protected] при защите, возможно, цитируемых частей команды (см. Пример ниже).

Применение:

 faketty   

Пример:

 $ python -c "import sys; print sys.stdout.isatty()" True $ python -c "import sys; print sys.stdout.isatty()" | cat False $ faketty python -c "import sys; print sys.stdout.isatty()" | cat True 

Сценарий unbuffer, который поставляется с Expect, должен обрабатывать это нормально. Если нет, приложение может смотреть на что-то другое, кроме того, к чему подключен его выход, например. для чего задана переменная среды TERM.

Ссылаясь на предыдущий ответ, в Mac OS X «скрипт» можно использовать, как показано ниже …

 script -q /dev/null commands... 

Но, поскольку он может изменить код возврата с «\ n» на «\ r \ n», мне нужно было запустить это.

 script -q /dev/null commands... | perl -pe 's/\r\n/\n/g' 

Если между этими командами есть какая-то трубка, вам нужно сбросить stdout. например:

 script -q /dev/null commands... | ruby -ne 'print "....\n";STDOUT.flush' | perl -pe 's/\r\n/\n/g' 

Anywhere Python установлен,

 echo fakepassword | python -c 'import pty, sys; pty.spawn(sys.argv[1:])' ssh 

Я не знаю, справляется ли это с PHP, но если вам действительно нужен дочерний процесс, чтобы увидеть TTY, вы можете создать PTY .

В C:

 #include  #include  #include  #include  #include  int main(int argc, char **argv) { int master; struct winsize win = { .ws_col = 80, .ws_row = 24, .ws_xpixel = 480, .ws_ypixel = 192, }; pid_t child; if (argc < 2) { printf("Usage: %s cmd [args...]\n", argv[0]); exit(EX_USAGE); } child = forkpty(&master, NULL, NULL, &win); if (child == -1) { perror("forkpty failed"); exit(EX_OSERR); } if (child == 0) { execvp(argv[1], argv + 1); perror("exec failed"); exit(EX_OSERR); } /* now the child is attached to a real pseudo-TTY instead of a pipe, * while the parent can use "master" much like a normal pipe */ } 

На самом деле у меня создалось впечатление, что, как и expect сам создает PTY.

Слишком новое, чтобы прокомментировать конкретный ответ, но я думал, что буду faketty функцией faketty опубликованной в ingomueller-net выше, так как недавно она помогла мне.

Я обнаружил, что это создало файл typescript который мне не нужен / нуждался, поэтому я добавил / dev / null в качестве целевого файла сценария:

function faketty { script -qfc "$(printf "%q " "[email protected]")" /dev/null ; }

Также есть программа pty, включенная в примерный код книги «Расширенное программирование в среде UNIX, второе издание»!

Вот как скомпилировать pty в Mac OS X:

http://codesnippets.joyent.com/posts/show/8786

Interesting Posts

Почему моя система использует только 3,2 ГБ моего 4GM RAM?

Почему никто не принимает публичные поля в C #?

OS X «Смертельная спираль»? Невозможно запустить новые процессы, в конечном итоге становится непригодным

Тройная загрузка Windows 8 Consumer Preview с Windows 7 и Ubuntu 11.10

Как установить последнее (непомеченное) состояние репо с помощью беседки?

Как написать изогнутый текст?

.toInt () удален в Swift 2?

Как получить значение свойства bean, когда само имя свойства является динамической переменной

Проверьте, активна ли активность

Недостатки scanf

Обнаруживать, есть ли в тексте ввод текста с помощью CSS – на странице, которую я посещаю и не контролирую?

Возможно ли изменить схему проверки CSS в VS2010

Почему тройной оператор неожиданно накладывает целые числа?

Центр управления Catalyst Останавливает работу, когда используется графическая карта

Как я могу сделать SSD постоянно бездействующим без каких-либо шансов на восстановление данных?

Давайте будем гением компьютера.