Unixコマンドを使用して、サブディレクトリ内のファイルをSSH経由でリモートコンピューターにcpすることは可能ですか?


17

一連のソフトウェアファイルを~/Downloadsパーソナルコンピューターのサブディレクトリにダウンロードしています。また、bashを使用して、を使用してコンピューターにリモート接続しますssh

このファイルをsshリモートコンピューターに転送することは可能ですか?


質問は、単一のファイル(this file)と複数のファイル(a series of software files)を参照しています。最良の解決策は、単一のファイルを持っているか複数のファイルを持っているかによって異なります。
user2768

回答:


42

scpこの目的に使用することができます。SSHプロトコルを使用してファイルを転送する安全な手段です。

たとえば、yourfile.txtfrom という名前のファイル~/Downloadsをリモートコンピューターにコピーするには、次を使用します。

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

ここで他の例を見ることができます


5
私はrsyncそれについて考えるので、同様に動作するかもしれないと思う
-ShanZhengYang

1
rsyncは、たった1つまたは
手いっぱい

14
@Paebbelsそれどころか、scp上記で置き換えrsyncてください、それはうまく動作するはずです。
8ビットツリー

rsync単純な場合は「機能する」だけで、他の場合ははるかに効率的であるため、単一のファイルでもすべてに使用する傾向があります。いずれかを使用している場合scpか、rsync何もない既に圧縮および/または暗号化された上で、(上の圧縮オプション有効にすることを忘れない-Cためにscp-zまたは--compressのためにrsync)。実際、私は習慣でそれをオンにします-それが物事を遅くする状況を見つけることは非常にまれです(おそらく、rPiのような限られたCPI電力で遅い低電力デバイスを使用している場合)。
デビッドスピレット

37

これにscpは明らかに適切なツールですが、何らかの理由で使用できない場合は、ローカルマシンから次のような操作を行って、たとえばディレクトリ構造をリモートマシンにコピーできます。

tar -c . | ssh <remote> tar -x

この意志tarという現在のローカルマシン上のディレクトリ、および書き込みtarstdoutどの、その後にパイプされますssh、それはそれから読み取り、ファイルをuntarするために、リモートコマンドを実行するコマンドstdin

-f -作成と抽出の両方の終了時のデフォルトであるというDietrich Eppのコメントを反映するように編集されたため、明示的に指定する必要はありません。


7
これを行う場合は、おそらくホームディレクトリ以外の場所に抽出するための-C basedir引数を追加するtar必要があります。
ドゥーガル

17

まれにこれを行いたい場合、sshfsFUSE(Linux、* BSD、Mac OS X)をサポートするUnixライクを使用している場合は、リモートファイルシステムをマウントすることをお勧めします。〜/ remote-serverという名前のホームディレクトリの下にディレクトリを作成します。

    $ mkdir ~/remote-server

次に、でリモートファイルシステムをマウントしますsshfs。「yourserver.com」をリモートマシンのホスト名に、「リモートディレクトリの名前」をリモートシステムで使用しているディレクトリに置き換えます。

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

これが完了すると、リモートディレクトリはファイルシステムの一部となり、次のような通常のツールをすべて使用できますcp

    $ cp ~/Downloads/your-files ~/remote-server

あなたが既に持っていない場合はsshfsインストールされ、あなたは(という名前のパッケージを探して、あなたのパッケージマネージャを使用してコンピュータにインストールすることができる必要がありますsshfsfuse-sshfs)。詳細については、オンラインでチュートリアルを読むことができます

ところで、これはリモートサーバー上のファイルを管理する私のお気に入りの方法です。通常、この方法で1つの運用サーバーと2つの開発サーバーをマウントしたままにして、通常のファイルブラウジングワークフローを使用します。


そして、どのsshfsオプションがあなたの仕事を最高の状態にするのに役立つかを確認してください。例えば、ユーザ/グループIDマッピングで開始-o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherし、-C乏しい帯域幅場合は圧縮のために。うまく機能したらすぐに、コマンドのエイリアスを個人的に追加して、sshを介して遠くのファイルシステムをすばやくマウントします。@Benjamin_Staton少なくとも適切なユーザー/グループマッピングがなければ、ここではsudoまたはrootを使用しません。
-tuk0z

9

最初に、scp(コピーオーバーssh)との間に実際の違いはありませんrsync

後続の実行では、rsyncが既に存在するファイルをコピーしないため、メリットがあります。

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a すべてのファイル
  • -v 冗長な
  • -H 「シンボリックリンクを見つけて正しいことをするだけ」
  • 次にソースおよび宛先パス。ソースでワイルドカードを使用することも、ディレクトリ全体を同期することもできます。

他の有用なフラグは次のとおりです。

  • --delete コピー元に存在しなくなったコピー先のファイルを削除します。
  • --dry-run テスト用-と組み合わせると非常に便利--deleteです。

sshパスワードを設定している場合は、これもキーを使用してパスワードなしのログインを実行します。

実行の最後にrsync、プレーンコピーを再度実行した場合の速度が何倍速かを示します。


1
-H実際にはハードリンク用であり、ソースディレクトリ構造内の複数の場所にリンクされると、同じコンテンツが2回以上送信されるのを停止します(ただし、大きなディレクトリ構造ではプロセスの効率が低下する可能性があります)。シンボリックリンクには影響しませんが、-a/に含まれるオプションの一部は、--archiveシンボリックリンクの処理方法に影響します。
デビッドスピレット

4

上記の回答に追加します。リモートパスが正確にわからない場合があります。これらの場合sftp、最初に必要な場所に移動し、次にgetまたはputを使用して実際にファイルをダウンロードまたはアップロードするために使用します。

何かを常に同期したままにしておき、リモートマシン上にあるファイルをローカルで実行したい場合でも、うまくいきますsshfs


-1

私はsshで非常に似たようなことをしています。Visual Studio用のカスタムビルドツールを作成し、基本的にVSにsshコマンドを実行させて、コードをターゲットコンピューターにコピーし、そのターゲットコンピューターでコンパイルします。

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

単一引用符とセミコロンの使用に注意してください。前者はsshを介してhostBへのコマンドをカプセル化し、後者はhostAから1つのsshコマンドで複数のhostBシステムコマンドを実行できるようにします。

これを機能させるには、起動マシンでsshキーを設定して、userA @ hostAになり、userBとしてhostBにログインできるようにする必要があります。userA @ hostAの公開sshキーを作成するプロセスは、十分に文書化されています。hostAでuserAの公開鍵を作成せず、その鍵をuserBとしてhostBにコピーしないと、毎回パスワードを入力する必要があります。これは自動化の喜びを台無しにします。


ダウン投票した人は、ダウン投票した理由についてコメントを残すことができますか?有益なフィードバックがなければ、反対票は無意味です。ありがとう。OPの特定の質問に直接関連する回答で対処しました。私は新しい技術を導入したり、代替ルートを提案したりしていません。どうして?OPは代替ルートを使用したくないかもしれません。
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.