(sshシェルなしで)sftp経由でrsyncを使用することは可能ですか?


60

sshを介したRsyncは、毎回うまく機能します。

ただし、sftpログインのみを許可し、sshログインは許可しないホストにrsyncを試みると、次のエラーが発生します。

rsync -av / source ssh user @ remotehost:/ target /

プロトコルバージョンの不一致-シェルはきれいですか?(説明については、rsyncのマニュアルページを参照)rsyncエラー:compat.c(171)[sender = 3.0.6]でのプロトコルの非互換性(コード2)

rsyncのmanページの関連セクションは次のとおりです。

通常、このメッセージは、rsyncがトランスポートに使用しているストリームに不要なゴミを生成する起動スクリプトまたはリモートシェル機能によって発生します。この問題を診断する方法は、次のようにリモートシェルを実行することです。

          ssh remotehost /bin/true > out.dat

次に、out.datを見てください。すべてが正常に機能している場合、out.datは長さゼロのファイルである必要があります。rsyncから上記のエラーを受け取っている場合、おそらくout.datにテキストまたはデータが含まれていることがわかります。内容を見て、何を作っているのかを考えてみてください。最も一般的な原因は、非対話型ログインの出力ステートメントを含むシェルスタートアップスクリプト(.cshrcや.profileなど)が正しく構成されていないことです。

私のシステムでこれを試してみると、out.datで以下が生成されました。

ssh-dummy-shell:コマンドは許可されていません。

思ったように、ホストはsshログインを許可していません。

次のリンクは、sshfsでfuseを使用してこのタスクを実行できることを示していますが、非常に低速であり、実稼働での使用には適していません。

rsync sftpが動作する可能性はありますか?


3
lftpがトリックを行います。-Rスイッチを使用してローカルからリモートに同期します

サーバーでコマンドがどのように制限されているか知っていますか?sshd_configでForceCommandを設定することである場合は、指すファイルを変更できるかどうかを確認します。または、authorized_keysのコマンドで設定されている場合、sshfs経由でauthorized_keysにアクセスして変更できますか?
ptman 14

あなたは試みることができるCSYNCcsync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncこの参照してください答えを
nachtigall 14

6
最終的に、私はlftpでそれをやったlftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall 14

@nachtigall複数の入力ファイル/ファイルとディレクトリのリストでlftpを使用する方法を知っていますか?
ボルトラン16

回答:


39

残念ながら直接ではありません。この方法で実行するrsyncrsync、のリモートコピーを開始できるシェルとのクリーンリンクが必要です。

ホスト上で長期間有効なリッスンプロセスを実行する方法がある場合は、非特権ポートで接続をリッスンして手動でrsyncを開始してみてください選択したポート(および最初にrsyncがインストールされているホスト)での接続を許可するホストファイアウォールの配置。ただし、rsyncを(SSHなどを介して間接的にではなく)パブリックにアドレス指定可能なサービスとして実行することは、一般に非パブリックデータには推奨されません。

ホストがPHPなどでスクリプトを許可し、ロックされていないためexec、ユーザースクリプトが余分なプロセスを実行できない場合は、リスニングモードでrsyncをそのように起動してみてください。エンドが接続可能な場合(外部にアクセスできるSSHを実行している場合)、これを逆に試すことができます-サーバーでrsyncを実行するスクリプトを使用しますが、着信接続をリッスンする代わりに、ローカルサービスに接続してそのように同期します。これは、rsyncが実際に指定されていないホストにインストールされているか、作業コピーをアップロードできることに依存していますが、rsyncデーモンを公にアドレス指定可能な方法で実行し、暗号化されていないホストを介して通信するというセキュリティ上の影響はありませんチャネル。

ただし、上記のような混乱は、それがまったく機能していても、ホストポリシーに反する可能性があり、キックオフされる可能性があります。そのアカウントに対してフルシェルを有効にできるかどうかを尋ね、そのホストのrsyncを放棄するか、ホストを放棄して別の場所に移動しない場合は、その方が良いでしょう。


2
完全なシェルである必要はないことに注意してください。適切な引数を指定してrsyncコマンドを実行できるようにする必要があります。これにはscponlyが便利です。
リス属

19

理論的には、はい。FUSEを使用して、ローカルマシンにリモートファイルシステムをマウントできます。次に、マウントされたディレクトリとローカルディレクトリの間でrsyncのローカルコピーを実行できます。私は個人的にこれを試したことはありませんが、理論的にはうまくいくはずです。比較を実行するために各ファイルの少なくとも一部を転送する必要があるため、SSH経由でrsyncを実行するよりもはるかに効率が低下する可能性があります。


11
タイムスタンプとサイズの比較で、何を送信する必要があるかを判断するのに十分な場合、これは機能するはずです。すぐにチェックサムが必要になると、リモートファイル全体が送信された更新と同様に回線上で読み取られるため、各ファイルに対してオールオアナッシングを実行するようにrsyncのオプションを設定してください(--ignore-を使用しないでください)または--checksumと--whole-fileを指定するだけで十分な場合があります)。--link-destなどの一部のオプションは、この方法で適切に(またはまったく)動作する可能性が非常に低いです。
デビッドスピレット

詳細を追加してくれてありがとう。それは私が考えていた効率の一種の制限であり、それらをあまり明確に表現しなかっただけです。)
カミルキジエル

それはそう、制限付きでの回避策だが、「正しい」のrsyncを起動する方法がない場合、それは十分です
ヴァレリーLourie

10

rsyncを使用する代わりに、代わりにlftp(sftpに接続できる)を使用し、mirrorコマンドを使用することもできます。たとえば、次のことができます

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
この投稿は質問に答えませんが、有用な代替手段を提供します
Dmitri Chubarov

6

少し遅れましたが、sshfsを使用して、私はそれをどのように行うのですか?

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
@デビッドSpillett以前の回答(上の彼のコメントで述べているとおりserverfault.com/questions/135618/...)、これは動作しますが、rsyncのプロトコルの非効率的な使用のビットであるだろう。
エヴァンアンダーソン

2
ジョナサン、あなたの解決策は間違っていると思う。2つのローカルフォルダーを同期するようにリモートドライブをマウントしてrsyncを実行すると、ローカルマシンのrsyncプロセスがリモートファイルのハッシュ値を計算するため、同期時にすべてが常に転送されます。これは、ファイル全体が転送され、rsyncの利点が失われることを意味します。編集:ああ、この答えは数回与えられています...複製のためにsry:D
Thekwasti


2

別の方法として、rsyncをデーモンとして起動し、SSHトンネルを介して接続することもできます。


この答えは短すぎて完全に役に立たないが、サーバー側がシェルアクセスを許可できず、(1)ローカルでリッスンするrsyncサーバー(セキュリティのために外部から利用できない)、および(2)sshトンネルを許可できる場合、原則としてauthorized_keys、特定のトンネルを許可して実行するルールを介してサーバーにログインできましたsleep 86400。その後、クライアント側rsyncはトンネルを経由できます。
ステファンゴーリチョン

2

何よりも優れたオプション

ここの他の答えにはない次の利点があるようです。

  • SSHから完全に利益を得る(セキュア)
  • rsync(帯域幅効率の良いプロトコル、帯域幅制限などのすべてのrsyncオプション)から完全に利益を得る
  • 実際には効率的です(日数を節約するsshfsとは異なり、実際にはまだ遅いです)
  • サーバー側の任意のシェルコマンドは必要ありません
  • sshトンネルを許可するためにサーバーを必要としません
  • rsyncデーモンを実行するためにサーバーを必要としません

まだテストしていませんが、を除くすべての機能を正常に使用しましたrrsync

どうやるか

  • ssh-keygen(openSSH機能)でローカルにキーを作成します
  • サーバーのエントリを使用して、特定のキーのみでログインを許可します~/.ssh/authorized_keys(openSSH機能)
  • このキーを特定のコマンドに関連付け、~/.ssh/authorized_keys(openSSH機能)コマンドとしてrrsyncrsyncで配布されるスクリプトを使用します。command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

その後、クライアントから通常どおりrsyncできます。

詳細が必要な場合

rsyncへのSSHアクセスの制限| ガイ・ルテンベルク

上記のリンクを超えた一歩

そのページの最後のコマンドを短くすることができます。次の~/.ssh/configようなスタンザを作成します。

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

次に、クライアントからのrsyncコマンド

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

になる

rsync -av user@remote: etc2/

1
残念ながら、これはSFTPサーバーでrsyncを使用することとは何の関係もありません。これはrsync、SFTPの側面を回避して、実行できるようにOpenSSHサーバーを構成することに関するものです。他の誰かのSFTPサーバーが表示され、そのサーバーを制御できない場合、この回答では問題を解決できません。
悪意のある

あなたが正しい。別の質問に答えるために実際にこれを書いて、間違ってここに投稿したかもしれません。ここで答えを削除することを検討しています。
ステファンゴーリチョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.