回答
我假定程序將調用glibc函數isatty()
來檢查stdout是否是終端。對於在終端上使用彩色輸出的程序或ANSI終端的其他功能(如光標定位或行擦除/重繪),這是很常見的。
您可以使用LD_PRELOAD環境變量欺騙程序。 LD_PRELOAD由ELF鏈接器處理,並告訴動態庫應該在之前被加載。使用此功能可以重寫庫函數,在您的情況下glibc函數isatty()
。例如,您可以按照此article。
我準備了一個例子給你:
首先創建文件libisatty.c:
/**
* Overrides the glibc function. Will always return true.
*
* Note: Although this should be ok for most applications it can
* lead to unwanted side effects. It depends on the question
* why the programm calls isatty()
*/
int isatty(int param) {
return 1;
}
並將其編譯爲一個共享庫:
gcc -shared -o libisatty.so libisatty.c
它應該建立好。
現在是時候測試庫了。 :)我已經使用命令ls --color=auto
進行測試。 ls
調用isatty()
來決定是否着色它的輸出。如果輸出重定向到文件或管道,則不會着色。您可以測試這一點很容易使用下面的命令:
ls --color=auto # should give you colorized output
ls --color=auto | cat # will give you monochrome output
現在,我們將嘗試第二個命令再次使用LD_PRELOAD環境VAR:
LD_PRELOAD=./libisatty.so ls --color=auto | cat
你應該看到彩色輸出。
BTW酷USENAME:uʍopǝpısdn!!:d
只是...哇!神奇的答案! – slezica
警告:創建一個執行'LD_PRELOAD'技巧的shell函數並不完美,因爲顯然其他的東西是shell函數中的其他可觀察的區別(我不確定它們是什麼)。然而,用別名'trick_tty'創建別名trick_tty' trick_tty =「LD_PRELOAD = <完整路徑>> /libisatty.so」'然後執行'trick_tty
對於MacOS用戶,您可以做同樣的事情,但不是設置LD_PRELOAD,而是設置DYLD_INSERT_LIBRARIES和DYLD_FORCE_FLAT_NAMESPACE,如下所示:'DYLD_INSERT_LIBRARIES =。/ libisatty.so DYLD_FORCE_FLAT_NAMESPACE = y ls -G | (注意--color標誌在mac的ls上不起作用) –
你可以試試這個:
./script.sh < `tty` > output
如果程序做這樣的事情isatty(0)
,這可能是不夠的。
請注意,程序在questio n會在stdout上運行isatty()。你把終端傳給stdin。這不會解決問題 – hek2mgl
它可能實際上是測試stdin而不是標準輸出 – arnaud576875
這沒有任何意義。 – hek2mgl
使用script
作品對我來說:
script outputfile.txt yourcommand
# any output ends up in outputfile.txt
您可以使用它來管我猜:
script out.txt yourcommand ; cat out.txt | nextcommand
檢查'script'的源代碼應該揭示程序使用'isatty'之外的其他東西來判斷它們是否以交互方式運行。 – ntc2
- 1. 我該如何欺騙程序stdin是終端(而不是重定向文件)?
- 2. 在bash中終止stdout到終端
- 3. ARP欺騙/ DNS欺騙 - 區別
- 4. PHP形式欺騙代碼
- 5. 防止欺騙形式
- 6. OCR像汽車欺騙應用程序
- 7. Shopify Rails應用程序 - Querystring欺騙
- 8. 終止批量交互式程序
- 9. 欺騙Javascript.location.hostname
- 10. 與欺騙
- 11. 欺騙SQL Server
- 12. 欺騙libdc1394
- 13. JSF應用程序中的交互式終端仿真
- 14. MIME類型欺騙
- 15. ICMP欺騙幫助
- 16. 主機頭欺騙
- 17. IP地址欺騙
- 18. Facebook安全 - 欺騙?
- 19. 欺騙反射器
- 20. 用SinonJS欺騙API?
- 21. 會話欺騙(PHP)
- 22. 防止IP欺騙
- 23. 軟件arp中毒,mac欺騙,ip欺騙
- 24. 設計一個交互式客戶端
- 25. 使用bash腳本與終端輸入請求交互
- 26. 是否可以欺騙HttpRequest.UserHostAddress(REMOTE_ADDR)?
- 27. 是否可以欺騙@media打印?
- 28. Python子進程鍵盤輸入欺騙
- 29. 交互式bash腳本
- 30. 與來自php的終端程序交互?
我聽說過' expect'是一個很好的程序 – BeniBela
同時檢查'腳本'程序的目的:http://stackoverflow.com/a/1402389/516188 –