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が機能する可能性はありますか?
残念ながら直接ではありません。 rsync
を実行するには、シェルとのクリーンリンクが必要です。これにより、rsync
のリモートコピーを開始できます。
ホストで長期間リスニングプロセスを実行する方法がある場合は、非特権ポートで接続を手動でリッスンしてrsyncを開始してみることもできますが、そのためのほとんどの手法では、SSH経由の適切なシェルアクセスも必要であり、選択したポート(および最初にrsyncがインストールされているホスト)に接続できるようにするホストファイアウォールの配置。ただし、非公開データの場合は、rsyncを(SSHなどを介して間接的にではなく)公開アドレス可能なサービスとして実行することは、一般的には推奨されません。
ホストがPHPまたは類似のスクリプトを許可し、それをロックダウンしていないため、ユーザースクリプトによって余分なプロセスをexec
edできない場合、リスニングモードでrsyncを開始してみてください。エンドが接続可能な場合(外部からSSHでアクセスできる場合)、これを逆に試すことができます。サーバーでスクリプトを実行してrsyncを実行しますが、着信接続をリッスンする代わりに、ローカルサービスに連絡して同期します。これは依然として、指定されていないホストに実際にrsyncがインストールされていること、または作業コピーをアップロードできることに依存していますが、rsyncデーモンをパブリックにアドレス指定可能な方法で実行してそれとやり取りするというセキュリティ上の影響はありません。暗号化されていないチャネル。
上記のようにいじることは、たとえそれがまったく機能しても、ホストのポリシーに違反する可能性があり、キックオフする可能性があります。そのアカウントで完全なシェルを有効にできるかどうかを尋ね、そのホストのrsyncを放棄するか、そのホストを放棄して他の場所に移動できない場合は、別の場所に移動することをお勧めします。
理論的にはそうです。リモートファイルシステムをローカルマシンにマウントできます Fuseを使用 。次に、マウントされたディレクトリとローカルディレクトリ間でrsyncのローカルコピーを実行できます。私はこれを個人的に試したことはありませんが、理論的にはうまくいくはずです。比較を実行するには各ファイルの少なくとも一部を転送する必要があるため、SSH経由でrsyncを実行するよりもはるかに効率が悪い可能性があります。
Rsyncを使用する代わりに、代わりにlftp(sftpに接続できます)を使用して、mirrorコマンドを使用することもできます。たとえば、次のことができます
lftp
~> open -u user,password sftp://Host.com
~> mirror remotedir outdir
~> quit
少し遅れますが、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
ここには他の答えにはない以下の利点があるようです:
rsync
デーモンを実行するためにサーバーは必要ありませんまだテストしていませんが、rrsync
以外の機能はすべて正常に使用できました。
ssh-keygen
(openSSH機能)を使用してローカルでキーを作成する~/.ssh/authorized_keys
(openSSH機能)にエントリがある特定のキーでのみログインを許可する~/.ssh/authorized_keys
(openSSH機能)を使用し、rsyncで配布されたスクリプトrrsync
をcommand="$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/
いいえ。rsyncは、反対側でrsyncを実行して通信することで機能します。つまり、何らかの形式のシェルアクセスが必要です。
別の方法として、デーモンとしてrsyncを起動し、SSHトンネルを介してデーモンに接続します。