SSHを使用してファイルをローカルシステムにコピーする

SSHを使用してファイルをローカルシステムにコピーする

システムにSSHで接続している場合は、他の端末や画面セッションを開始してscpなどを実行したり、リモートシステムからローカルシステムにSSHを使用せずにファイルをローカルシステムにコピーしたりする方法はありますか?

答え1

主な接続

事前に計画を立てると、これが最も簡単です。

初めて基本接続を開きます。後続の接続の場合、スレーブ接続は既存のマスター接続を介してルーティングされます。あなたの~/.ssh/config、接続共有設定が自動的に行われます。

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

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

したがって、有効な接続があればすぐに次のことができます。

今後

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

を使用してさらに自動化できますRemoteForward 22042 localhost:22。問題は、複数のSSHインスタンスを使用して同じシステムに接続した場合、または他の人がそのポートを使用している場合は転送されないことです。

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

その中にも興味深い情報があります。このサーバー障害スレッド

コピーして貼り付ける

ファイルが小さい場合は、それを入力してターミナル出力からコピーして貼り付けることができます。ファイルに印刷できない文字が含まれている場合は、次のようなものを使用してください。64ビットベース

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 -

答え2

別の(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のようなものを好むなら試してみてください。真夜中司令官。彼らはこの機能を呼び出しますシェルリンク。ほとんどのディストリビューションにはemがmc

答え3

~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あなたが望むものに最も近いようです。これらのコマンドがPermitLocalCommand機能する/etc/ssh_configには、ファイルでこれらのコマンドを有効にする必要があります~C(参考資料を参照man ssh_config)。

ControlMaster設定すると、同じSSHセッションを再利用できますssh_config。これにより:

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

技術的にはSSHセッションを終了せず、再認証する必要もありません。おそらくあなたが望むものよりも複雑です。しかし、他の簡単な方法は思い出されません。

答え4

  • 使用SSH-xfer、ファイル転送のために既存のSSH側チャネルを効果的にオーバーロードする修正されたSSHエージェント。
  • 使用、実際にはssh経由のzmodemです。 rzszを使ったことがあるとしたら、とてもおなじみのようです。
  • もう一方の端でリッスンするいくつかのファイル転送デーモンがあるとし、逆方向(、リモート-Rからローカルへ)または転送(、ローカルからリモートへ)ポートでファイル転送を実行します。-L

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

  #最初の接続
$SSHリモート

  #元のSSHによって開かれた同じ接続で多重化されます。
$SFTPリモート

関連情報