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


257

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


4
クライアントにsshサーバーがある場合は、いつでも試すことができますscp file.foo user@myclient.com:file.foo:P
rahmu

4
確かに、しかし、私が働いている会社が所有するサーバーからコンピューターへのアクセスを許可したくありません。サーバー上で!
ナフトゥリケイ

2
私はあなたの問題を理解していません。新しいキーペアを生成し、パブリック部分をコンピューターauthorized_keysにコピーし、転送後にその行を再度削除します。
ニルス

8
私はこれを頻繁に行うので、SSHセッションの途中でファイルをコピーするたびにこれを行うのは非効率的です。SSHターミナルセッション中にローカルコンピューターにフックして、現在のSSHセッションを終了せずにリモートサーバーにファイルを送信する方法を探しています。
ナフトゥリケイ

2
問題は、最初のsshログインが苦痛(2faまたはキーまたはパスワードを超える他の課題)になる可能性があり、sshサーバーの構成を変更する権限がない場合があり、キーネゴシエーションを複数回行う必要がないことです。セッションができたら、そのセッションを複数の目的に使用するとよいでしょう。
デュアネフ

回答:


139

マスター接続

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

初めてマスター接続を開きます。以降の接続では、既存のマスター接続を介してスレーブ接続をルーティングします。で~/.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ます。詳細については、マニュアルの「エスケープ文字」を参照してください。

このServer Faultスレッドには、いくつかの興味深い情報もあります

コピーペースト

ファイルが小さい場合は、入力してターミナル出力からコピーアンドペーストできます。ファイルに印刷できない文字が含まれている場合は、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 -

SSHを使用してファイルを転送できる場合、なぜ人々はまだSFTPを必要としていますか?
14

3
@Pacerier SFTPはSSHを使用してファイルを転送する方法だからです。
ジル14年

SSH-without-SFTPを使用してファイルを転送できる場合、なぜ人々はSFTPを必要とするのですか?
14

コピーと貼り付けの方法は、連鎖接続(つまり、複数のホストを経由して最後のホストに到達する)で特に便利
です。ゴリマー

1
@Pacerier SFTPには、リストファイルやリモートファイルの削除などの追加のコマンドがあります。
rahmu18年

67

別の(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を呼び出します。ほとんどのディストリビューションは、それらのパッケージシステムでのemを持っていますmc


8
正直なところ、なぜこれが支持されないのか理解できません。OPはscpのないソリューション求めました。時々、特に私が非常に不自由なISP提供のルーターにsshしている場合のように、sftpがなく、scpがなく、ftpさえひどく壊れています。これができるとわかっていたので、構文が正しいことを確認するためにここに来ました。
-Auspex

1
ブリリアント!mc使用するのが最も速いです。
ナメク

2
実際、私の場合、このソリューションは機能しません。WindowsからLinuxへのトンネルを作成すると、ターミナルではなくパテで開始します。この方法はまさに私が望んでいたものですが、使用することはできません。腹が立つ。
ベンジャミン

1
これを支持しない理由は、クライアントマシンが共有ルーター(企業ネットワークなど)の背後にある場合は機能しないためです。私が職場のコンピューターを使用していて、ホームサーバーにsshしたとします。スペースと特殊文字を含む複雑なディレクトリをCDで移動するという苦労を経て、作業コンピューターにファイルをコピーするにはどうすればよいですか?
シュリダールSarnobat

1
バイナリデータで正常に動作します。私はtgz常にファイルでこれをやっています:)
Florian Fida

53

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~Cman ssh_config

あなたが設定している場合は、同じSSHセッションを再使用することができますControlMasterではssh_config。これを行う場合:

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

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


これはまだ機能しますか?!argsヘルプメッセージで見つけることができませんでした。
-xuhdev

@xuhdevそれは、OpenSSH_7.2p2にまだそこだargs最初のヘルプメッセージ(にされていない~?)が、2番目に(1が入るとssh>、プロンプトをして~C、一つは入力できhelpssh>プロンプト)
sdaau

これは良い解決策のように見えますが(私は試していませんが)、vimスタイルの親コマンドラインバッファーを取得できることを知りませんでした。実際には、セッションに戻る方法を忘れないように、新しいターミナルタブを開くことを好む場合があります(emacsを終了する方法を思い出せない場合など)。
スリダールサルノバト

37

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

mkdir -p /mnt/sshfs

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

次に、ファイルをコピーして、ノーチラス、ノーム、コンクレール、イルカ、バッシュなどを貼り付けます。


4
キーファイルを使用した接続:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

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

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

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

  #元のsshが開いた同じ接続で多重化されます
$ sftp remote

5
zmodemは、ローカルのBBSから最新のシェアウェアをダウンロードしたことを思い出させます。:
スチュアートウッドワード

xferの方法はまさに私が探していたものですが、なぜssh-xferパッチがOpenSSHアップストリームに含まれていないのか知っていますか?炎?
フェランバソラ

zsshヒントをありがとう!Konsoleでtmuxを使用していますが、tmuxのおかげで、サーバーからの「sz」が機能しなくなりました。zsshは私の問題を解決します!
0xAF

9

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

はい、私はこれがほとんどの人に明白であることを知っています(そして正確に正確ではありません)が、端末専用のソリューションを探しているこのスレッドを見つけた人(私のような)は明白なことを見落としているかもしれません。



FileZillaサーバーはWindowsのみだと思います。ただし、クライアントはクロスプラットフォームです
-Freedom_Ben

Cajaを使用することもできますssh://SERVER
-basic6

8

私が最良かつ最も効率的なソリューションであることがわかってきたことは使用することですxclip-copyfilexclip-pastefile

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

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


うわー、これは私の逆ポート転送プラスnetcatよりも良い解決策かもしれません。
スリダールサルノバト

3

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デフォルトのダウンロードディレクトリへのダウンロードをすぐに開始するよう指示します。

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

    (パッケージのsz一部である "ZModemの送信"プログラムlrzszです。ほとんどの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 soTabEnterです。

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

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

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

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

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.