web-dev-qa-db-ja.com

リモートマシンからローカルマシンにファイルをコピー(または移動)する方法は?

ローカルのUbuntuマシンからリモートのUbuntuマシンにSSHトンネリングし、リモートのUbuntuからローカルのUbuntuにファイルをコピー/移動したい。

SSHセッション内から(つまり、リモートUbuntu内から)する必要があります。

これらは機能しませんでした:

scp [remote-source] [local-destination] # Which is actually:
scp /home/user/files_to_depart/file1.txt /home/user/files_that_arrived/file1.txt

さもなければこれをどのように行うことができますか?

6
JohnDoea

nullmetaの答え は完全に有効であり、おそらく、nullmetaは編集して、探している説明を提供します。ネットワーク構造(NATファイアウォール)が原因でローカルシステムに単純にsshすることが困難な場合があることを考慮して、個別のソリューションをすべて掲載しています。

ComputerAとComputerBの2台のコンピューターがあるとします。 ComputerAはローカルワークステーションです。 ComputerBは、ssh経由でアクセスできるリモートマシンです。

シナリオ1:ComputerAがNATファイアウォールの背後にないの場合

これはSwiftであり、scpとsshを組み合わせた簡単なソリューションです(scpはsshプロトコルを使用して安全なコピーを実行します)。両端(computerAとcomputerB)にsshサーバー(およびクライアント)をインストールする必要があります。

このソリューションを使用するには、ComputerBから実行します。

scp /path/to/file/on/ComputerB ComputerAUser@ComputerA:/path/to/dump/file/on/ComputerA

シナリオ2:ComputerAがNATファイアウォールの背後にあるの場合

このシナリオでは、通常、NATファイアウォールでポート転送を構成する必要があります。ただし、これらの種類の変更を行うためのアクセス権が常にあるとは限りません。この場合、ComputerA-> ComputerBからsshトンネルを構成して、逆接続もトンネルできるようにします。

Ssh接続ComputerA-> ComputerBを確立するときは、-Rオプションを次のように設定します。 ssh ComputerBUser@ComputerB -R 2222:localhost:22ここで、ComputerBUserは、認証されるComputerBのアカウントのユーザー名であり、2222はComputerBの空きポートです。このポートを使用して、逆トンネルでComputerBからComputerAに戻ります。

from ComputerB、次の方法でscpコマンドを発行して、ComputerB-> ComputerAからファイルをコピーできます。ComputerAUserはComputerAのユーザー名です。

scp -P 2222 /path/to/file/on/ComputerB ComputerAUser@localhost:/path/to/drop/file/on/computerA

ここで何が起こっていますか? ComputerAの代わりにlocalhostを渡すので、単にComputerBにファイルを自分自身に送り返すように指示しているように見えます。実際、scpにファイルをComputerBに渡すように伝えていますが、ポート2222に渡します。ComputerBのポート2222へのすべての接続は、ComputerAのポート22(デフォルトのsshポート)に転送されます。したがって、既存のssh接続を逆方向にトンネリングすることにより、ComputerAがNATファイアウォールの背後にあることは問題になりません。


シナリオ3:ComputerAからのファイルコピーの実行

または、ComputerBから実行するのではなく、ComputerAからscpコマンドを実行するだけです。

scp ComputerBUser@ComputerB:/path/to/file/on/ComputerB /path/to/dump/file/on/ComputerA
9
b_laoshi

リモートマシンのファイルシステムを参照し、特定のファイルをローカルマシンにコピーする簡単な方法(およびその逆)が必要な場合は、 SSHFS を使用できます。

説明

  • man sshfs から:

    SSHFS(Secure Shell FileSystem)は、Linux(およびFuse実装を備えた他のオペレーティングシステム)用のファイルシステムであり、リモートコンピューター上の安全なシェルログインのみを使用してリモートコンピューター上のファイルを操作できます。 。 SSHFSがマウントされているローカルコンピューターでは、実装はFuse(ユーザー空間のファイルシステム)カーネルモジュールを使用します。これの実際的な効果は、エンドユーザーが、まるで自分のコンピューター上のローカルファイルであるかのように、SSHを介して安全に提供されるリモートファイルとシームレスに対話できることです。リモートコンピューターでは、SSHのSFTPサブシステムが使用されます。

  • apt show sshfsから:

    sshfsは、SSH File Transfer Protocolに基づくファイルシステムクライアントです。ほとんどのSSHサーバーはすでにこのプロトコルをサポートしているため、設定は非常に簡単です。つまり、サーバー側では何もする必要がありません。クライアント側では、sshを使用してサーバーにログインするのと同じくらい簡単にファイルシステムをマウントできます。

インストール

Sudo apt install sshfs

このガイドとは異なり Ubuntu 16.04で他に何もしていません。 Fuseユーザーグループはありません。

使用法

  1. 適切なマウントディレクトリを作成します。次に例を示します。

    mkdir ~/sshfs-mount-point
    
  2. リモートパスをマウントします

    • デフォルトのssh設定を使用する場合は、リモートパスをマウントします

      sshfs user@IP:/remote/path ~/sshfs-mount-point
      
    • カスタムssh設定を使用する場合、リモートパスをマウントします

      sshfs -o IdentityFile=/path/to/id_rsa,port=2222 user@hostname-or-IP:/remote/path ~/sshfs-mount-point
      
    • ~/.ssh/configファイルを適切に設定したら、リモートパスをマウントします

      sshfs hostname:/remote/path ~/sshfs-mount-point
      
  3. リモートパスをアンマウントします。 2つの方法があります。

    • fusermount -u ~/sshfs-mount-point

    • Sudo umount ~/sshfs-mount-point

質問に応じた使用法

  • マシンからsshに接続している間AマシンにBであり、かつableからssh接続を確立するためにB to A。上記の方法のいずれかを使用して、A on Bからフォルダーをマウントできます。次に、 cprsync または mc を使用してファイルをコピーします。

  • マシンからSSH接続している間AマシンにBであり、かつできませんからSSH接続を確立する- B to A。マシンに専用フォルダーを作成できますB、ファイルをそのフォルダーにコピーします。このフォルダをマシンにマウントしますAそしてこれらのファイルを好きな場所に移動します。このタスクを処理する cronjob または bash script を設定できます。

3
pa4080

SSHセッションに参加せずに使用したい

scp user@remotehost:/file/to/copy /local/destination

ローカルマシンでsshdが実行されており、ポートが開いている場合、sshセッションでは次のことができます。

scp /remote/file user@localmachine:/destination/file

このリンクにはいくつかの回避策があります https://unix.stackexchange.com/questions/2857/ssh-easily-copy-file-to-local-system

編集:混乱をおaびします。最も簡単で効率的な方法は、2番目のターミナルを開いて、最初に述べたscpコマンドを実行することです。

1
nullmeta

ネットワークを介してコンピューターからコンピューターにファイルを移動するには、scpユーティリティを使用します(scpは安全なコピーを表します)。 sshは、リモートログインアクセスにのみ使用されます。

すでにネットワーク上の別のコンピューターに正常にログインしているので、そこからファイルをローカルマシンにコピーするだけで済みますが、ローカルマシンでsshデーモンを実行する必要があります。したがって、最初にインストールします。

$ Sudo apt-get install openssh-server -y

それが実行中であることを確認してください(青信号がそれを示しています):

$ systemctl status sshd

enter image description here

ローカルコンピューターにコピーする別のディレクトリにあるすべてのファイルをリモートマシンに配置します。次に、次のコマンドを使用します。

$ scp -r [DIRECTORY] [USER]@[IP_ADDRESS]:~/Downloads

-rは、ディレクトリとそのすべてのコンテンツが再帰的に処理されることを意味します。簡単に言えば、これは、ファイルを含むディレクトリをコピーするたびに使用するオプションであることを意味します。 [DIRECTORY]は、そのディレクトリへのパスです。 [USER]はローカルマシンのユーザーです。 [IP_ADDRESS]は、そのマシンのIPアドレスです。 :の後のものは、ローカルマシンでファイルを保存する場所です。この場合、それはDownloadsフォルダーです。

これは、このプロセスが実際にどのように見えるかです:

enter image description here

1
misha