高い文字の場合は、おそらくコピー/ペーストできます。
echo -ne "\x84" | xclip -i
あなたのデスクトップがLinuxを実行している場合は、端末エミュレータで中クリックしてください。 (かどうかは、を参照してください)。またはecho ... | ssh [email protected]
が動作する可能性があります。
他の端末エミュレータで
ssh -T
または同等また、「無効疑似端末割当て」に、オプションであるかもしれないので、リモート側のプログラムは、そのstdin
がSSHDからパイプではなく、偽であるだろうターミナル、私は思う。これにより、^s
や^v
のようなものは無効になります。
逆に、echo foo | ssh -tt
は、sshに内容を配管していても、リモート側でttyを要求するよう強制します。SSH上で必ずバイナリデータを作るために
あまり侵入的な方法は、TTY層を介して、受信プログラムのstdin
になっコントロール - v
(16進数の0x16)ですべてのバイトの前にあります。
Barmarが指摘するように、それはリテラルの次の文字(の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
)に入力することで、ローカルにこのすべてをテストすることができます。ターミナルでそれを実行し、いくつかのものを入力または貼り付け、終了するまでcontrol-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としてすべてを解釈し、エスケープシーケンスを許可していないように見せたい16進値を書くのに問題があります。 – GhostSparkles