シリアルコンソール(たとえば、ターミナルサーバーを介したtelnet経由)のみを使用している場合、ホストとの間でファイルを転送するためにどのような方法を使用できますか?
切り取り/貼り付けは小さい/印刷可能なものに対して機能し、uuencode / uudecodeの組み合わせ(gzipを使用)で印刷できないものを処理しましたが、すべて非常に制限されています。
シリアルコンソール(たとえば、ターミナルサーバーを介したtelnet経由)のみを使用している場合、ホストとの間でファイルを転送するためにどのような方法を使用できますか?
切り取り/貼り付けは小さい/印刷可能なものに対して機能し、uuencode / uudecodeの組み合わせ(gzipを使用)で印刷できないものを処理しましたが、すべて非常に制限されています。
回答:
接続のもう一方の端で使用するシリアルコンソールプログラム¹には、リモート側にファイルを送信する何らかの方法があります。どの程度正確に実行するかは、リモートシステムで使用可能なリソースによって異なります。
I持っているlrzsz
か、kermit
リモート側で
最も簡単なケースは、lrzsz
またはなどのリモート側に固体バイナリファイル転送プログラムがインストールされている場合kermit
です。これはかつて今日よりも一般的でしたが、特定のシステムにはまだこれらのいずれかがある可能性があります。
ローカル側で使用しているシリアルコンソールプログラムには、ZmodemまたはKermitのアップロードを行う方法がほぼ確実にあり、必要なものを直接送信できます。
Zmodemの場合rz
、リモートシステムで入力するだけで、ローカルシリアル端末が理解できる特別な文字列が送信され、ファイルピッカーダイアログがポップアップ表示されます。
Kermitはより単純なプロトコルなので、その場合は手動で転送を開始する必要があります。
バイナリファイル転送プログラムはありませんが、持っていますuuencode
/base64
lrzsz
またはのような適切なバイナリファイル転送プログラムを使用することにはいくつかの利点があります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アップロード」を実行します。パイプラインはuuencodeされたデータを受け入れ、それをバイナリtarballにデコードします。これを解凍してビルドできます。
しかし、リモートシステムにCコンパイラがありません
あなたも、リモート・システム上のコンパイラを持っていない場合は、できるクロスコンパイルrz
ローカルシステム上(または任意の)プログラムをし、上記の技術を使用してリモートシステムに送信します。
脚注:
このバージョンに入力ファイル名をuuencode
2回指定する必要があります。1回は入力データのソースに名前を付け、再びデータを出力ファイルにデコードするときにリモートシステムがファイルを呼び出す必要があることを宣言します。おそらく、リモートシステムの出力ファイルに別の名前を付けることができます。
のローカルバージョンのuuencode
動作が異なる場合があります。
基本的に、シリアルttyを介して転送するには、インターネット前の方法を使用する必要があり、相手側で転送を受信する方法が必要です。明らかにこれを行う最善の方法は、ZMODEMを使用することですsz
。つまり、受信側に既にあるようなツールが必要です。ただし、たとえば、受信ターゲットがネットワークのないルーターである場合、これは常に可能とは限りません。
この転送を行う唯一の可能な方法は、ターミナルセーフASCIIを使用して、8ビットより前のクリーンスタイルで直接チャネルを介して行うことです。ほとんどのシステムにインストールされることを望んでいる、より新しいツールを使用します。
送信者:
まず、ファイルをエンコードします
base64 file.tar.gz > file.tar.gz.b64
次に、com send-fileコマンドがであることを確認しますascii-xfr
。これは、私の接続コマンドラインでした。
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
ありましたが、チェックサムコマンドで十分です。合計の一致を手動で確認したら、転送が成功したと想定できます!
\r\n
または\n
、途中で「修正」されたとしても、両方とも機能します。それがbase64標準にあるのか、私が使用したツールにあるのかを覚えているわけではありませんが、実際には標準の動作だと思います。
たぶん、ミニコムを試してみてください。
シリアルコンソールさえあれば機能するかどうかはわかりませんが、ネットワークにアクセスできる場合は、nc(1)
TCP / IPを使用してファイルをコピーできます。
# WARNING: Depending on your setup, this could make your system unbootable
root@destination-box.local # nc -l 8675 | dd of=/dev/sdXXX
root@source-box.local # dd if=/dev/sdYYY | nc destination-box.local 8675
上記の例でsdbYYY
は、ソースボックスからsdaXXX
宛先ボックスのクローンを作成しました。TCPポート番号に8675を選択したのは任意でした。アクセスできる任意のポートを使用できます。また、デバイスである必要はありません。任意のファイルを使用できます。
kevin@destination-box.local $ nc -l 12345 >> ~/.ssh/authorized_keys
kevin@source-box.local $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345
2番目の例では、rsa公開キー(~/.ssh/id_rsa.pub
)をコピーし、ターゲットホストの認証済みキーファイルに追加しました。
ファイル転送プログラムの祖父母であるkermitを使用します。私たちは、Linuxが登場するずっと前からそれを使用していました。