> 記事

rz / sz コマンドの使い方:ターミナルでファイルをアップロード・ダウンロード

ターミナルだけで、rz でアップロード、sz でダウンロード。ZMODEM とは何か、lrzsz の入れ方と使い方、文字化けや tmux で使えないときの対処を説明します。

公開

目次
  1. どんなときに使うか
  2. rz・sz と ZMODEM とは
  3. インストールと使い方
  4. rz を打つと画面が文字化けする
  5. tmux や screen の中では使えない
  6. ほかに気をつけること
  7. SFTP や scp を使ったほうがよいとき
  8. ShellRS では

毎日 SSH でサーバーに入って作業していると、ファイルを送りたい場面がよくあります。設定ファイルを上げたい、ログを手元に持ってきたい。ふだんは SFTP のツールを開けば済みますが、それが届かないこともあります。踏み台サーバーにログインするとシェルしか使えない、スイッチがシリアルケーブルの先にある、目的のサーバーまで ssh を何段も重ねる、といった場合です。そんなときは、サーバーで rz と打てばアップロード、sz ファイル名 と打てばダウンロードでき、ファイルはターミナルそのものを通って届きます。この記事では、rz と sz が何なのか、どう使うのか、うまくいかないときに何が起きているのかを説明します。

どんなときに使うか

SFTP と scp は、SSH 接続の中にファイル転送専用の通り道を開きます。また、手元のコンピューターからそのサーバーへ直接つながる必要があります。次のような場面では、これができません。

  • シェルしか使えない踏み台サーバー:ログインするとメニューや制限付きのシェルが出て、目的のサーバーへの接続は踏み台が代わりに行います。SFTP はその先へ進めません。
  • シリアルコンソール:シリアルケーブルでつないだスイッチや開発ボードとは文字をやりとりできるだけで、ネットワークはありません。
  • 多段 ssh:A にログインしてから ssh B すると、手元から始めた SFTP は A までしか届きません。

どの場合も、目的のマシンとのあいだにあるのはターミナルだけです。打った文字が向こうへ行き、画面に出る文字が返ってきます。rz と sz は、この同じ道でファイルを運びます。

rz・sz と ZMODEM とは

rz と sz はサーバーに入れる 2 つのコマンドで、r は receive(受信)、s は send(送信)の頭文字です。名前はサーバー側から見た動作なので、取り違えやすいところです。

サーバーで打つ サーバーの動作 あなたにとって
rz ファイルを受信 アップロード:手元 → サーバー
sz ファイル名 ファイルを送信 ダウンロード:サーバー → 手元

コマンドはいつもサーバーで打ち、手元では何も実行しません。相手役を務めるのはターミナルソフトです。rz は起動するとまず、決まった短い「合図」を画面に出力します。対応しているターミナルはその合図に気づき、アップロードするファイルを選ぶ画面を開きます。sz も同じで、ターミナルが合図に気づくと保存先を尋ねてきます。ファイルの中身も、ターミナルの文字の流れに混ぜて送られます。ふつうの出力に混ざった合図をターミナルが拾うという点で、OSC エスケープシーケンスと同じ考え方です。Xshell や SecureCRT は、対応しているターミナルとしてよく知られています。

両側が使うこの取り決めが ZMODEM です。ダイヤルアップモデムの時代、1986 年に Chuck Forsberg が設計したファイル転送プロトコルで、XMODEM、YMODEM の後を継ぐものです。現在 Linux で使われる rz と sz は、たいてい lrzsz というパッケージに入っています。

つまり、サーバーに lrzsz が入っていて、手元のターミナルが ZMODEM に対応していれば使えます。

インストールと使い方

rz と sz はサーバーに入れます。rz と打って rz: command not found と出たら、まだ入っていません。

sudo apt install lrzsz   # Debian、Ubuntu
sudo dnf install lrzsz   # RHEL、Rocky Linux、Fedora など
sudo yum install lrzsz   # 古いシステム

入れたら、よく使うのは次のコマンドです。

rz                    # アップロード:ターミナルがファイルを尋ねる。複数選択も可
rz -y                 # アップロードし、サーバー上の同名ファイルを上書き
sz app.log            # 1 つダウンロード
sz *.log nginx.conf   # まとめてダウンロード

rz はデフォルトでは、サーバーにすでにあるファイルには手を付けず、同じ名前のファイルはスキップします。上書きするなら -y を付けます。sz はフォルダーをダウンロードできず、is not a file と出して飛ばすので、先に tar でまとめてから送ります。

tar czf logs.tar.gz logs/ && sz logs.tar.gz

rz を打つと画面が文字化けする

rz と打ったのに選択画面が出ず、代わりにおかしな文字列が表示されることがあります。

$ rz
rz waiting to receive.**B0100000023be50

これが先ほどの合図で、そのまま文字として表示されています。ターミナルが ZMODEM に対応していないか、その機能が無効になっていて、手元側で誰も応答していないのです。sz では **B00000000000000 と出ます。ファイルが壊れたわけではないので、ZMODEM に対応したターミナルを使えば解決します。

このとき rz や sz はサーバー上でまだ待っていて、Ctrl+C は効かないことが多いです。Ctrl+X を 5 回続けて押してください。これが ZMODEM で決められた中止の方法です。プロンプトに戻ったあと入力の表示がおかしければ、reset と打って Enter を押します。

tmux や screen の中では使えない

tmux と screen は、それ自体がターミナルです。プログラムの出力をいったん受け取り、手元のウィンドウに描き直します。ZMODEM のデータはその途中で書き換えられてしまい、転送は失敗するか止まります。ファイルを送るときは、tmux の外で別の接続を開いて rz や sz を実行するか、SFTP や scp を使ってください。

ほかに気をつけること

  • 1 ファイル 4 GB 未満まで:プロトコルがファイル内の位置を 4 バイトで記録するので、これが上限です。大きいファイルは split で分けて送って手元で結合するか、SFTP を使います。
  • 日本語のファイル名が化けることがある:ZMODEM はファイル名の文字コードを伝えません。サーバーのファイル名が Shift_JIS や EUC-JP で、ターミナルが UTF-8 として読むと、名前が化けます。送る前に英数字の名前に変えるか、アーカイブにまとめてから送ります。
  • ssh を経由するとアップロード中に切れる:踏み台でさらに ssh したり、ローカルのターミナルから ssh コマンドで接続したりしていると、アップロードするデータはその ssh を通ります。ssh は行頭の ~. を「接続を切る」という意味に受け取るので、ファイルにたまたまそれが含まれていると切れてしまいます。ssh -e none で接続すれば、この機能を止められます。

SFTP や scp を使ったほうがよいとき

rz と sz の強みは手軽さです。別のツールはいらず、手元からサーバーへ直接つながらなくても、ターミナルさえあれば送れます。ただしデータはターミナルを回り道し、サーバー側の端末を通ったあと、手元のターミナルソフトが 1 バイトずつ読み解きます。SFTP と scp には専用の通り道があります。大きなファイル、大量のファイル、フォルダーごとの転送では、使えるなら SFTP や scp を選んでください。rz と sz は「ターミナルしかなく、ファイルをいくつか送りたい」ときのための道具です。SFTP と WebDAV の違いはこちらの記事をご覧ください。

ShellRS では

ShellRS は無料でオープンソースの SSH クライアントで、ZMODEM に対応しています。

  • ターミナルで rz または sz ファイル名 を実行すると、ShellRS が自動で受け持ちます。SSH、Telnet、シリアルのターミナルで使え、シェルしか使えない踏み台サーバーでも、ローカルターミナルから ssh で別のマシンに入った先でも動きます。サーバーには lrzsz が必要です。
  • アップロード:rz を実行するとファイルの選択画面が開き、複数選べます。Finder(Windows ではエクスプローラー)からファイルをリモートターミナルにドラッグすると、ShellRS が rz と Enter を代わりに入力し、選択画面を出さずにアップロードします。フォルダーは飛ばされるので、SFTP でアップロードしてください。サーバーに同名のファイルがあると「Skipped」と表示されます。上書きするには rz -y を使います。
  • ダウンロード:sz を実行すると、保存先のフォルダーを毎回尋ねます。既存のファイルを上書きすることはなく、同名のときは「名前 (1)」として保存されます。受信しきれなかったファイルは削除されます。
  • 転送中はターミナルに 1 行の進行状況(ファイル名、割合、サイズ、速度)が表示され、Ctrl+C で中止できます。1 ファイル最大 4 GB で、tmux や screen の中では使えません。

詳しくは ShellRS のマニュアル(英語)の「Terminal」の章にある「ZMODEM transfers」をご覧ください。ShellRS はダウンロードページから入手できます。

ShellRS を試す

無料でオープンソースの SSH クライアント。ターミナル、SFTP、ポートフォワーディングを 1 つのウィンドウで。macOS、Windows、Linux に対応。