對於高字符,您可能可以複製/粘貼。
例如echo -ne "\x84" | xclip -i
然後在您的終端模擬器中單擊,如果您的桌面也在運行Linux。 (或可能不是,見)。或者echo ... | ssh [email protected]
可以工作。
ssh -T
或其他任何終端仿真程序中的等價物也可能是「禁用僞終端分配」的選項,因此遠程端的程序將使其stdin
成爲sshd的管道而不是僞 - 終端,我想。這可能會導致像^s
和^v
這樣的東西變得很特殊,我想。
相反,echo foo | ssh -tt
會強制它在遠程端請求一個tty,即使你將東西輸入到ssh中。
A-侵入較少的方法以確保二進制數據通過SSH獲取通過TTY層和接收程序的stdin
是每字節與一個控制v
(十六進制0x16)之前。
正如Barmar指出的那樣,這是字面上的下一個字符(lnext
在stty -a
輸出)。您可以在之前每字節使用它;它甚至在普通字符之前被接收器中的TTY層剝離。
# LANG=C sed to replace every byte with ^V byte
# using bash $'' to put a literal control-V on sed's command line
echo "hello" | LANG=C sed $'s/./\x16&/g' | hd
16 68 16 65 16 6c 16 6c 16 6f 0a |.h.e.l.l.o.|
您可以通過輸入到hexdump -C
(又名hd
)測試這個本地所有。只需在終端中運行它,然後鍵入或粘貼一些內容,然後控制-D直到它退出。
$ echo -ne "\x01\xff\x99" | LANG=C sed $'s/./\x16&/g' | hd
00000000 16 01 16 ff 16 99 |......|
00000006
# yup, correct bytes from sed
$ echo -ne "\x01\xff\x99" | LANG=C sed $'s/./\x16&/g' | xclip -i
$ LANG=C hd
^A�� (middle click, return, control-d)
00000000 01 ef bf bd ef bf bd 0a |........|
# nope, that munged my data :/
$ xclip -o | hd
00000000 16 01 16 ff 16 99 |......|
所以X選擇本身是正確的,但是它越來越受Konsole的被改寫的無論是作爲我貼,或通過從Konsole的到hexdump
的方式TTY層?後者似乎不太可能;可能這是一個粘貼問題。 Konsole的「編碼」設置是UTF-8。它似乎沒有簡單的ASCII設置。
也許試試LANG=C xterm
什麼的,或者只是腳本expect
正確發送實際二進制數據到ssh
,而不是轉義碼。
當然不處理轉義序列的fgets
,任何超過strcpy
會。通常C函數不會;但在C編譯器編譯器處理字符串文字中的轉義序列。
你的問題很混亂。您是問如何在終端上輸入控制字符,或者C程序如何將它讀入內存? – Barmar
如果你使用二進制數據,你不應該使用'fgets()'和朋友。這是爲了讀取文本數據。 –
對不起,我現在正在使用我的手機。可能是前者。如果我寫AAAA,我會在內存中獲得x41x41x41x41等。如果我寫\ x84它會寫x78x38x34等。我在編寫十六進制值時遇到了困難,因爲fgets將所有內容解釋爲ascii,而且似乎不允許使用轉義序列。 – GhostSparkles