web-dev-qa-db-ja.com

sshでファイルをローカルシステムにコピーして戻す

SSH経由でシステムにログインしている場合、別のターミナルまたはスクリーンセッションを起動してscpなどを実行せずに、またはリモートシステムからSSHを使用せずにローカルシステムにファイルをコピーして戻す方法はありますか?ローカルシステム?

271
Shawn J. Goff

マスター接続

事前に計画しておくと最も簡単です。

マスター接続を初めて開きます。後続の接続では、既存のマスター接続を介してスレーブ接続をルーティングします。 ~/.ssh/config で、接続共有が自動的に行われるように設定します。

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

既存の接続と同じ(ユーザー、ポート、マシン)に対してsshセッションを開始すると、2番目のセッションは最初のセッションを介してトンネリングされます。 2番目の接続の確立には、新しい認証は必要なく、非常に高速です。

そのため、アクティブな接続が確立されている間は、次のことがすばやくできます。

転送

既存の接続では、リバースSSHトンネルを確立できます。 sshコマンドラインで、-R 22042:localhost:22を渡してリモート転送を作成します。22042は、ランダムに選択された番号で、リモートマシンの他のポート番号とは異なります。次に、リモートマシンのssh -p 22042 localhostがソースマシンに接続します。 scp -P 22042 foo localhost:を使用してファイルをコピーできます。

これをRemoteForward 22042 localhost:22でさらに自動化できます。これの問題は、sshの複数のインスタンスを使用して同じコンピューターに接続する場合、または他の誰かがポートを使用している場合、転送を取得できないことです。

最初からリモート転送を有効にしていない場合は、既存のsshセッションで実行できます。タイプ Enter ~C Enter -R 22042:localhost:22 Enter。詳細については、マニュアルの「エスケープ文字」を参照してください。

this Server Fault thread にも興味深い情報があります。

コピーペースト

ファイルが小さい場合は、入力してターミナル出力からコピーして貼り付けることができます。ファイルに印刷できない文字が含まれている場合は、 base64 などのエンコーディングを使用します。

 remote.example.net $ base64 <myfile 
(出力をコピー)
 local.example.net $ base64 -d> myfile 
(クリップボードの内容を貼り付け)Ctrl+D

より便利なのは、X転送がアクティブな場合は、ファイルをリモートマシンにコピーしてローカルに貼り付けます。 xclip または xsel からパイプでデータを出し入れできます。ファイル名とメタデータを保持する場合は、アーカイブをコピーして貼り付けます。

remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -

別の(IMO)簡単な方法は次のとおりです。

# to remote Host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

または、GUIのようなものを好む場合は、 Midnight Commander を試してください。彼らは機能Shell-Linkと呼びます。ほとんどのディストリビューションでは、パッケージシステムにmcとしてemが含まれています。

75
Florian Fida

SSHは、エスケープ文字(デフォルトでは~)を介していくつかのコマンドをサポートしています。

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:Host:hostport    Request local forward
      -R[bind_address:]port:Host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

!argsは、あなたが望むものに最も近いようです。 /etc/ssh_configコマンドを機能させるには、~CファイルでPermitLocalCommandを有効にする必要があることに注意してください(man ssh_configを参照)。

ssh_configControlMasterを設定すると、同じsshセッションを再利用できます。これを行う場合:

$ ~C
ssh> !scp file user@myserver:

技術的にはsshセッションを離れたことはなく、再認証する必要もありません。おそらくあなたが望むよりも複雑ですが、私は別の簡単な方法を考えることはできません。

54
Corey Henderson

これらはすべて非常に複雑な方法です。
sshfsを使用して、リモートファイルシステムをローカルマシンにマウントできます。

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

次に、nautilus、gnome、konqueror、dolphin、bashなどのファイルをコピーして貼り付けます。

38
Quandary
  • ssh-xfer を使用します。これは、ファイル転送用に既存のsshサイドチャネルを効果的にオーバーロードする変更されたssh-agentです。
  • zssh を使用します。これは事実上、sshよりzmodemです。これまでにrzszを使用したことがある場合、これは非常によく知られているように見えます。
  • 逆行する (-R、リモートからローカルへ)または転送(-L、ローカルからリモートへのポートの場合、ファイル転送を実行するためのポート。ファイル転送デーモンがもう一方の端でリッスンしていると想定します。

しかし、これらは本当に必要ありません、IMO。 SSHプロトコルは単一の接続で複数のチャネルをサポートし、OpenSSHクライアントは多重化をサポートします。あなたがControlMasterControlPathを持っていると仮定すると セットアップControlPersistも便利です)、

#最初の接続
 $ ssh remote 
 
 #元のSSHが開いたのと同じ接続で多重化します
 $ sftpリモート
15
ephemient

さらに簡単な方法:Filezilla(またはお気に入りのftpブラウザー)を開き、同じサイトへのssh接続を開き、ファイルを見つけてローカルファイル構造にドラッグします。 Filezillaを初めて使用する場合は、「サイトマネージャ」機能を使用して、次回にすばやく再接続します。

はい、私はこれがあなたのほとんどに明らかであることを知っていますが(正確には正確ではありません)、ターミナルのみのソリューションを検索しているこのスレッドを見つけた人(私のような)は、その見落としを見落としたかもしれません。

9
Larry Jones

私が最良かつ最も効率的なソリューションであることがわかったのは、xclip-copyfileおよびxclip-pastefileを使用することです。

サーバーでは、xclip-copyfileを使用して1つ以上のファイルをコピーします。これらのファイルは、ローカルサーバーで使用できます。そこで、xclip-pastefileを使用できます。

これにより、scpを使用したり、ローカルのsshサーバーを用意したりする必要がなくなります。たとえば、cygwinでこれを使用します。唯一の問題は、xclipをまだインストールしていない場合は、インストールする必要があることです。ああ、これはバイナリファイルでも機能します。

8
Robert

私たちが SecureCRT を使用する多くの理由の1つ—実用的なオープンソースソフトウェアを好むにもかかわらず—ファイル転送を容易にすることです。 F/OSSの世界では、直接的な代替品はありません。

SecureCRTは1990年代半ばに純粋なWindowsプログラムとして始まりましたが、Mac OS XおよびLinuxに移植されました 数年前

SecureCRTには、SSH接続先のシステムとの間でファイルを転送するための3つの主要な機能があります。

  • ZModemYModemXModemKermit およびASCII-SecureCRTは昔ながらの種類の端末エミュレータであり、いくつかの帯域内ファイル転送プロトコルをサポートしています。

    最も使いやすいのはZModemです。リモートコマンドラインでsz file-to-downloadのようなものを入力すると、リモートszプログラムが エスケープシーケンス を書き込み、SecureCRTにfile-to-downloadのダウンロードをすぐに開始するように指示します。デフォルトのダウンロードディレクトリ。

    いい感じは、ダウンロードディレクトリがセッションごとにカスタマイズできることです。これを使用して、本社のファイルサーバーにサイトごとのディレクトリを作成しているため、ダウンロードしたファイルを手動で並べ替える必要はありません。

    szlrzsz パッケージの一部である「ZModem送信」プログラムです。ほとんどのUnixyシステム用にすでにパッケージ化されています。何らかの理由でリモートシステムがまだインストールされていないため、簡単にバイナリパッケージをインストールすることはできません。ソースパッケージは小さく、移植性に優れています。複数回、lrzsz"sharchiveを送信する必要がありました" または uuencode 'd tarball 削除されたリモートシステムにZModemファイルを追加できるようにします。)

  • [〜#〜] sftp [〜#〜]-SecureCRTは、緊密に統合された基本的なSFTP実装を備えています。

    「緊密に統合されている」とは、SFTPメニューコマンドまたはキーボードショートカットを指定すると、同じSSH接続を介してリモートサイトに接続されている新しいタブが開くことを意味します。したがって、再度ログインする必要はなく、同じサーバーへの別のSFTP接続を開いた場合よりも少し速く接続が確立されます。

    VanDyke Softwareには個別のファイル転送製品 SecureFX があるため、私はSFTP機能を「基本」として特徴付けています。組み込みのSFTPクライアントよりも機能が豊富で、SecureCRTとも統合されます。

    SecureCRTのSFTP機能を使用すると、ZModem構成とは別のデフォルトのリモートおよびローカルディレクトリを構成できます。

    このSFTP機能には、基本的なコマンドラインのインターフェースがあり、OpenSSHのsftpプログラムを模倣していますが、次のようなアフォーダンスを備えています。 Tab コマンド補完。したがって、somefile.tar.gzというリモートファイルを取得するのは、get soと同じくらい簡単です。TabEnter

  • ドラッグアンドドロップ-ファイルをターミナルウィンドウにドラッグアンドドロップすると、自動的にrzが入力され、ファイルの送信を開始します。

    または、SFTPタブを開いてファイルをそのタブにドロップし、SFTP経由で送信することもできます。したがって、リモートシステムへのファイルの送信は、次のように簡単です。 Alt-Pドラッグドロップ

    おそらくTCPベースのプロトコルであるため、転送がSFTPを介してはるかに速く行われることがわかります。そのため、大きな スライディングウィンドウ 現代の TCP/IPスタック の恩恵を受けます。 ZModemは、64 kiBのブロックサイズが「大きい」と考えられていた時代に設計されました。したがって、リンクの潜在的な速度の多くはZModemに吸収され、その間、両端はブロック転送の確認応答を待ちます。

    ドラッグアンドドロップ操作の優れた点の1つは、ZModemを使用することによるストレスの1つを取り除くことです。リモートシステムでrzと入力すると、SecureCRTはファイルピッカーを自動的にポップアップします。その後、リモート側がタイムアウトする前に、ファイルを見つけて選択するのに約1分かかります。これは、快適ではない、24時間レースのような雰囲気を作り出します。ドラッグアンドドロップにより、自由にファイルを見つけて、マウスを1回動かすだけで転送を開始できます。

    私たちはまだ手動の方法を使用しており、明示的なrzコマンドで転送を開始しています。これは、SecureCRTではセッションごとのアップロードディレクトリを構成できるためです。このディレクトリは、特定のリモートサイトで実行されているソフトウェアの最新のビルドが常に含まれているファイルサーバー上のフォルダーを指します。このような転送の場合、ファイルピッカーが正しい場所で開くため、時計との競合はありません。

3
Warren Young

使用する "!"ファイルをファイルのASCII表現に変換します(例:! uuencode myfile.bin >uuencode.dat)。次に、! cat uuencode.dat >target.datを使用します。その後、ターゲット側でuudecodeを使用します:! uudecode target.dat >myfile.bin

1
Nils