簡體   English   中英

在期望腳本中發送不可打印的字符

[英]sending non-printable characters in expect script

我發現當我在期望腳本中使用某些字節作為程序的輸入時,當一個字節高於 0x7f 時,會自動轉換為多字節。 例如腳本中的以下行:

spawn./myprog [exec perl -e { print "\x7f\x80" }]

實際上向 myprog 發送了三個而不是兩個字節:0x7f 0xc2 0x80

myprog 是一個簡單的測試程序,它打印它得到的輸入:

int main(int argc, char** argv) {
   int i;
   for (i=0;i<strlen(argv[1]);i++) {
      printf("%x\n", (unsigned char)argv[1][i]);
}

我知道 0x7f 是與 unicode 相關的編碼的神奇邊界,但是我怎樣才能將像 0x80 這樣的字節發送到我的程序呢? 在期望腳本中,我已經嘗試過https://www.tcl.tk/doc/howto/i18n.ZFC35FZ88 30D5FCC69D2E88中描述的 [encoding convertto iso8859-1 [exec perl...]] 之類的轉換

另一方面,當我在命令行上做同樣的事情時,例如:

./myprog `perl -e 'print "\x7f\x80"'`

我確實只得到了兩個字節 - 正如預期的那樣(與期望腳本行相比,不同的 {} 是 tcl 替換 '')。

如何在期望腳本中強制執行相同的行為?

經過更多的實驗,我發現唯一的方法是在期望邏輯之外進行參數切換,例如:

set input [binary format H* 7f80]
exec echo "$input" > input.dat
spawn sh -c "./myprog `cat input.dat`"

請注意,由於 $ 的特殊含義,使用 ${...} 代替反引號似乎並不容易。

當然,生成 shell 而不是直接生成進程並不是一回事,但這對我的大多數用例來說都無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM