コピー中にSCPにシンボリックリンクを無視させることは可能ですか?


80

私は我々のサーバのいずれかを再インストールする必要があり、予防措置として、私が移動したい/home/etc/opt、および/Servicesバックアップサーバに。

ただし、問題があります。シンボリックリンクがたくさんあるため、多くのファイルが複数回コピーされます。

scpシンボリックリンクを無視する(または実際にリンクをディレクトリやファイルとしてではなくリンクとしてコピーする)ことは可能ですか?そうでない場合、それを行う別の方法はありますか?

回答:


82

私はそれが可能であることを知っていました、私はただ間違った道具を取りました。私はrsyncでそれをしました

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/

1
では、このコマンドは何ですか?シンボリックリンクを無視しますか、それとも新しいシンボリックリンクを作成しますか?-アブ?
ErnestasStankevičius

3
aアーカイブ(物事を保存する)、v冗長でh人間が読める形式の出力でeあり、使用するサービス(この場合はssh)を指定します。もっと読むこっち
quietContest

ありがとうございました。古いサーバーが一時停止されています。新しいサーバーにはコンテンツが必要でした。すべてのソフトリンクを失いましたが、多くが壊れていたため、これは新しいサーバーでのメンテナンス作業に時間がかかります。再度、感謝します。
jlettvin

1
--safe-linksを使用すると、ディレクトリ内にあるリンクを保持し、ディレクトリ外を指すリンクをコピーしないようにすることができます。
ColinPitrat19年

29

私は、ことがわかった方法が私のために動作しませんでした、しかし、私はこのウェブサイト(上の仕事をしたの代替を見つけwww.docstore.mik.ua/orelly)。rsync

具体的には、「O'Reilly:SSH:TheSecureShell。TheDefinitiveGuide」のセクション7.5.3です

7.5.3。ディレクトリの再帰的コピー

..。

scpはディレクトリをコピーできますが、必ずしも最良の方法であるとは限りません。ディレクトリにハードリンクまたはソフトリンクが含まれている場合、それらは複製されません。リンクはプレーンファイル(リンクターゲット)としてコピーされ、さらに悪いことに、循環ディレクトリリンクによりscp1が無期限にループします。(scp2はシンボリックリンクを検出し、代わりにターゲットをコピーします。)名前付きパイプなどの他のタイプの特殊ファイルも正しくコピーされません。より良い解決策は、特殊ファイルを正しく処理するtarを使用して、リモートに送信することです。 SSH経由でタールを取り除くマシン:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -

1
これは、rsyncがリモートエンドにインストールされていない場合、または(わずかな変更を加えて)ソースディレクトリのtarballがすでにある場合に適しています。
Trebor Rude

1
宛先でのアクセス許可を保持するには、「p」(tar xpf)が必要です。
ポールリンチ

このコマンドは、ソースコンピューターから実行し、ファイルをターゲットコンピューターにプッシュする必要があることに注意してください。私の場合(多くの小さな、非圧縮ファイル)の場合、それはより良く、より速く働きましたか。scprsync
ジェラルドリマ

フォローアップの質問:ソース側では、tarコマンドは、リモートに転送する前に、最初にtarballデータをローカルに保存しますか?[これは、ソースディスクがほぼいっぱいになると問題になります-たとえば98%いっぱいです]
ジャングルエディター

18

送信者と受信者の両方としてtaroversshを使用すると、トリックも実行されます。

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

権限を保持するために、ソース側--one-file-systemと宛先側に追加しましたp
2014年

tarのmanページによると; --one-file-system =マウントポイントを越えない
AnneTheAgile 2016

2

1つの解決策は、シェルパイプを使用することです。いくつかのソフトウェアによって生成されたいくつかの* .gzファイルとシンボリックリンクを取得して、少し短い名前の同じ* .gzファイルにリンクする状況があります。単にscpを使用すると、シンボリックリンクが通常のファイルとしてコピーされ、重複が発生します。rsyncがシンボリックリンクを無視できることは知っていますが、私のgzファイルは同期可能なオプションで圧縮されておらず、これらのgzファイルのコピーでは同期が非常に遅くなります。したがって、次のスクリプトを使用してファイルをコピーします。

find . -type f -exec scp {} target_host:/directory/name/data \;

-fオプションは、通常のファイルのみを検索し、シンボリックリンクを無視します。ソースホストでこのコマンドを実行する必要があります。これが私の状況で一部のユーザーに役立つことを願っています。私が何かを逃したかどうか私に知らせてください。


0

tar + sshコマンドを使用してサーバーからフォルダーをコピーするために、クライアントで実行できるワンライナーソリューション。

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

注:mkdirは必須です。リモート宛先ディレクトリが存在しない場合、コマンドは単にリモートサーバーのホーム全体を圧縮してクライアントに抽出します。

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