シリアルコンソールしかないときにホストにファイルを取得する方法は?


20

シリアルコンソール(たとえば、ターミナルサーバーを介したtelnet経由)のみを使用している場合、ホストとの間でファイルを転送するためにどのような方法を使用できますか?

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


ユーティリティの可用性について残したコメントの一部を考えると、プラットフォームに名前を付けたり、現在の環境の概要を説明したりすることができれば役立ちます。端末からのZMODEMkの回答...
エイブリーペイン

私は1日の大半をSolarisボックスの後ろで過ごします。これらの用語で、もしあなたが持っていたのがSUNCreq(またはSUNWCuser)だけだったら、あなたは何を答えますか?
スティーブンポールLesniewski

わずか5年遅れです:P今、あなたは私の答えを受け入れることができます。なぜなら、それはまさにあなたが望んでいたものだったからです。しかし、おそらく今日は必要ないでしょう。
JMベッカー

回答:


12

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

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ローカルシステム上(または任意の)プログラムをし、上記の技術を使用してリモートシステムに送信します。


脚注:

  1. minicompicocomPuTTYVanDyke CRT ...

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

    のローカルバージョンのuuencode動作が異なる場合があります。


素晴らしい、私はこの質問にカーミットに言及する答えがあることを望んでいた!+1;)
ティム

これは良い答えです、私はそれらの「しかし私は持っていません」セクションが好きです。残念ながら、それは非常にポップなもので止まり、本当に深くは行きません。ASCIIコードだけから異なるアーキテクチャのバイナリ実行可能ファイルを作成していますか?ここにブートストラップがあります:retrocomputing.stackexchange.com/questions/4672/…– pfalcon 18
21:09に

5

基本的に、シリアル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ありましたが、チェックサムコマンドで十分です。合計の一致を手動で確認したら、転送が成功したと想定できます!


(そして2年後...)行末を変更するシステム間でファイルを転送する必要がある私の経験では(Microsoftに感謝!)、base64エンコード/デコードは行末スタイルを気にしません。\r\nまたは\n、途中で「修正」されたとしても、両方とも機能します。それがbase64標準にあるのか、私が使用したツールにあるのかを覚えているわけではありませんが、実際には標準の動作だと思います。
アンドリューヘンレ

5

たぶん、ミニコムを試してみてください。


これには、ソースホストで「sx」または「sz」のようなものが必要ですか?
スティーブンポールLesniewski

4
いいえ、minicomは独自のファイルxferを処理します。sx、sy、szとrx、ry、rzは別々のプログラムで、通常はlszrzなどの適切な名前のパッケージにあります。szとrzを使用することをお勧めしますが。小さく、シンプルで、それはそれがすることをします。Minicomは、完全なターミナルエミュレータです。
-reiche

4
この答えは正しくありません。Minicomはファイル転送用にlrzszを生成します。Minicomは、独自のファイル転送を処理できません。
ジョナサンクラインIEEE

5

シリアルコンソールさえあれば機能するかどうかはわかりませんが、ネットワークにアクセスできる場合は、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)をコピーし、ターゲットホストの認証済みキーファイルに追加しました。


5
最初のアイデアの上に大きな赤い警告サインを表示することをお勧めしますか?学ぶ心のある孤独な魂は、もちろん次の段落を最初に読むことなく、ファイルだけをコピーすることを期待して、そのようなことを実行するかもしれません:)
reiche

2

ファイル転送プログラムの祖父母であるkermitを使用します。私たちは、Linuxが登場するずっと前からそれを使用していました。


ああ、そうです。それを覚えていますが、この場合、kermitはソースホストにインストールされません。
スティーブンポールLesniewski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.