web-dev-qa-db-ja.com

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

Sshを介したRsyncは、毎回素晴らしい働きをします。

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

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

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

以下は、rsyncのmanページの関連セクションです。

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

          ssh remotehost /bin/true > out.dat

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

私のシステムでこれを試すと、次のin.datが生成されました。

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

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

次の link は、Fuseとsshfsを使用してこのタスクを実行できることを示しています。ただし、非常に遅く、本番環境での使用には適していません。

Rsync sftpが機能する可能性はありますか?

61
Tom Feiner

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

ホストで長期間リスニングプロセスを実行する方法がある場合は、非特権ポートで接続を手動でリッスンしてrsyncを開始してみることもできますが、そのためのほとんどの手法では、SSH経由の適切なシェルアクセスも必要であり、選択したポート(および最初にrsyncがインストールされているホスト)に接続できるようにするホストファイアウォールの配置。ただし、非公開データの場合は、rsyncを(SSHなどを介して間接的にではなく)公開アドレス可能なサービスとして実行することは、一般的には推奨されません。

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

上記のようにいじることは、たとえそれがまったく機能しても、ホストのポリシーに違反する可能性があり、キックオフする可能性があります。そのアカウントで完全なシェルを有効にできるかどうかを尋ね、そのホストのrsyncを放棄するか、そのホストを放棄して他の場所に移動できない場合は、別の場所に移動することをお勧めします。

39
David Spillett

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

20
Kamil Kisiel

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

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

少し遅れますが、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
6
jonathan

すべてを組み合わせたオプション

ここには他の答えにはない以下の利点があるようです:

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

まだテストしていませんが、rrsync以外の機能はすべて正常に使用できました。

どうやってするの

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

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

詳細が必要な場合

rsyncへのSSHアクセスを制限する| Guy Rutenberg

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

そのページの最後のコマンドを短くすることができます。 ~/.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/
4

いいえ。rsyncは、反対側でrsyncを実行して通信することで機能します。つまり、何らかの形式のシェルアクセスが必要です。

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

2
Dan Andreatta