シリアルコンソールのみがあるときにホストシステムにファイルを転送するにはどうすればよいですか?

シリアルコンソールのみがあるときにホストシステムにファイルを転送するにはどうすればよいですか?

持っているものがシリアルコンソールだけである場合(たとえば、ターミナルサーバーを介したTelnet経由)、どのような方法でホストシステムとファイルを送受信できますか?

切り取り/貼り付けは、小さい/印刷可能なコンテンツで機能します。印刷できないコンテンツを処理するためにuuencode / uudecodeの組み合わせ(gzipを使用)を使用しましたが、これはすべて非常に制限的です。

答え1

接続のもう一方の端で使用するシリアルコンソールプログラムには、ファイルをリモート側に送信する方法があります。進行方法は、リモートシステムで利用可能なリソースによって異なります。

私が持っているかlrzsz遠いkermit側に

最も簡単な場合は、リモート側に信頼できるバイナリファイル転送プログラムがインストールされている場合です。lrzszまたはkermit。これは今日よりも一般的でしたが、特定のシステムにはまだこれらのいずれかがある可能性があります。

ローカルで使用するシリアルコンソールプログラムでは、ZmodemまたはKermitアップロードを実行する方法がほとんど確実であるため、必要なものを直接送信できます。

Zmodemを使用すると、リモートシステムに入力するだけで、システムrzはローカルシリアル端末が理解する必要がある特別な文字列をエクスポートするため、ファイルセレクタダイアログボックスが表示されます。

Kermitはより簡単なプロトコルなので、この場合は手動で転送を開始する必要があります。

バイナリファイル転送プログラムはありませんがuuencode/はあります。base64

lrzsz適切なバイナリファイル転送プログラム(or)を使用すると、kermit効率性、チェックサム、自動再試行、中断された転送リカバリ、複数ファイル転送などのいくつかの利点がありますが、これは次のとおりです。贅沢。ファイルを1つだけ送信する必要がある場合、またはファイルをほとんど送信しない場合は、ASCIIアップロードを使用できます。

なぜなら端末プロトコルバイナリデータファイルに現れる多くのバイト値を解釈するために、同じ接続を介してファイルを直接送信することはできません。これにより、両端の端末エミュレーションコードが一部のデータを解釈しようとし、データとおそらく混乱と端末処理コード。

バイナリデータをローカルでASCIIの安全なサブセットにエンコードし、リモートで元のバイナリデータに変換することでこの問題を解決できます。これはuuencodeそしてbase64プログラムはマイナーなアルゴリズム選択のみ異なります。

ローカルシステムで次のファイルをエンコードします。²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

次に、リモートシステムにこのコマンドを入力し、ローカルシリアルコンソールのASCIIアップロード機能を使用してファイルを送信します。

$ cat | uudecode

ファイルのアップロードが完了したら、[終了]をCtrl-Cクリックしますcat。これで、必要に応じてリモートシステムにデコードされたファイルがあります。

しかし、私は持っています。たくさんASCIIを転送して印刷できるようにファイルをトランスコードするのは痛いです!

より高い技術レベルに達することは難しくありません。リモートシステムにCコンパイラがある場合は、既存の技術を使用してソースコードのコピーをリモートシステムに送信できますlrzsz。ローカル側:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

次に、リモートシステムでシリアルコンソールプログラムを介して次のように入力します。

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

最初のコマンドを実行した後、ファイルをlrzsz.tgz.uueリモートシステムに「ASCIIアップロード」します。パイプラインはuuencodedデータを受け取り、解凍してビルドできるバイナリtarballにデコードします。

しかし、リモートシステムにCコンパイラはありません。

リモートシステムでコンパイラが利用できない場合は、次のことができます。クロスコンパイルrz(またはその他)ローカルシステムでプログラムし、上記の技術を使用してリモートシステムに送信します。


脚注:

  1. ミニコンピュータピココンパテヴァンダイク映像館...

  2. uuencodeこのバージョンでは、入力ファイル名を2回指定する必要があります。一度は入力データソースの名前を指定し、一度はデータを出力ファイルにデコードするときにリモートシステムがファイルを呼び出す必要があることを宣言する必要があります。リモートシステムの出力ファイルに異なる名前を付けることができます。

    ローカルバージョンは異なる動作をする可能性uuencodeがあります。

答え2

デフォルトでは、シリアルttyを介して送信するにはインターネット移行方法を使用し、相手から送信を受信する方法が必要です。明らかに最善の方法はZMODEMを使用することです。つまり、sz受信側にすでに持っているものと同様のツールが必要であるという意味です。ただし、これは受信先がネットワークレスルーターである場合など、必ずしも可能ではありません。

この転送を実行する唯一の方法は、上位8ビットクリーンスタイルで端末安全ASCIIを使用してチャネルを介して直接実行することです。私はほとんどのシステムにインストールされることを望むより現代的なツールを使用します。

送信者:

まずファイルをエンコードします。

base64 file.tar.gz > file.tar.gz.b64

ascii-xfr次に、com send fileコマンドが私の接続コマンドラインであることを確認してください。

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

通常、受信側が必要ですascii-xfrが、それがないため、-n正しい行末を維持することでこの問題を解決できます。

受信者:

リンクされたので、ファイルを受け取るディレクトリに移動します。

cd /tmp/
cat > file.tar.gz.b64

picocomで私はただCTRL+A+Sをクリックして、送信したいファイルのフルパスを入力してください。転送が完了したら、次のことを行う必要があります。CTRL+Cこれを分解してくださいcat

これでファイルをデコードします。

base64 -d file.tar.gz.b64 > file.tar.gz

ASCII転送はチェックサムで保護されていないため、ファイルが送信されたファイルと同じであることを確認するために最善を尽くしてください。私の受信ボックスにはありますが、sha512sumすべてのチェックサムコマンドで十分です。金額が一致することを手動で確認すると、振替が成功したと見なすことができます。

答え3

シリアルコンソールがあればこれが可能かどうかはわかりませんが、ネットワークアクセスがあればnc(1)TCP / IPを使用してファイルをコピーできます。

# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675

上記の例では、sdbYYYソースボックスからターゲットsdaXXXボックスに複製しました。 TCPポート番号として8675をランダムに選択しました。アクセス可能なすべてのポートを使用できます。必ずしもデバイスである必要はありません。どんなファイルでも可能です。

[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

2番目の例では、rsa公開鍵(~/.ssh/id_rsa.pub)をコピーしてターゲットホストの認証鍵ファイルに追加しました。

答え4

私は使用しますコミット、ファイル転送プログラムの祖先。私たちはLinuxが存在する前からLinuxを使用してきました。

関連情報