SSH /osync は、リモートファイルパスから「@」文字をエスケープします。

SSH /osync は、リモートファイルパスから「@」文字をエスケープします。

ローカルからリモートサーバーへ(双方向)複数のディレクトリを同期するスクリプトを作成する必要があります。

スクリプトは現在使用されています同期ツール同期を実行するために使用されますssh。使用される正確なコマンド(私のスクリプトが失敗したコマンドはosync.shGithubファイルの1485行目にあります):

$SSH_CMD env LC_ALL=C env _REMOTE_TOKEN="$_REMOTE_TOKEN" bash -s << 'ENDSSH' >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID.$TSTAMP" 2>&1

これは基本的に単なるsshコマンドです。

コピーに使用しましたが、rsyncこのファイルパス構造でも期待どおりに機能します。しかし、osyncはそうではありません。


これ質問:実行するコマンドは次のとおりです。

osync.sh --initiator="/var/services/homes/@DH-ADS/0/localUser-1/local-folder-to-sync/" --target="ssh://sync-user@DOMAIN:25//var/services/homes/@DH-ADS/0/remoteUser-1/remote-folder-to-sync" --rsakey="/var/services/homes/sync-user/.ssh/id_rsa" --summary --dry --verbose

どこ:

  • localUserとRemoteUserの名前は同じです(Active Directory / LDAPユーザー名)。
  • 同期ユーザーは両方のサーバーで同じ名前を持ちます。
  • SSH キーが正確で有効です。

このコマンドは、ファイルパスに「@」文字が含まれていない場合は正しく機能します。だから問題はこのキャラクターにいるようです。 Synologyサーバーであり、これがActive Directoryユーザーのデフォルトパスであるため、ファイルパスを変更することはできません。

間違い:

TIME: 0 - This is an unstable dev build [2021062901]. Please use with caution.
TIME: 0 - -------------------------------------------------------------
TIME: 0 - Fri Dec  3 11:34:46 CET 2021 - osync 1.3.0-dev-rc2 script begin.
TIME: 0 - -------------------------------------------------------------
TIME: 0 - Sync task [quicksync_task] launched as sync-user@local-server (PID 22970)
sync-user@REMOTE_DOMAIN (without tld and last character [example.de -> exampl)@REMOTE-SERVER-DOMAIN (correct)'s password: 

ご覧のとおり、ユーザーにパスワードを尋ねますが、私は何らかの方法でパスワードを指定しません。原因は、リモートファイルパス(おそらくローカルファイルパスにもあります)の「@」文字によるものです。

「」を試してみましたが、リモートファイルパスとローカルファイルパスが見つかりません(「がファイルパスの一部であると仮定しているため)。

osync.sh --initiator="'/var/services/homes/@DH-ADS/0/localUser-1/local-folder-to-sync/'" --target="'ssh://sync-user@DOMAIN:25//var/services/homes/@DH-ADS/0/remoteUser-1/remote-folder-to-sync'" --rsakey="/var/services/homes/sync-user/.ssh/id_rsa" --summary --dry --verbose
TIME: 0 - This is an unstable dev build [2021062901]. Please use with caution.
TIME: 0 - Local replica path [/var/services/homes/@DH-ADS/0/localUser-1/local-folder-to-sync/] does not exist or is not writable and CREATE_DIRS is not allowed.
TIME: 0 - Local replica path ['ssh://video-sync@REMOTE_DOMAIN:25//var/services/homes/@DH-ADS/0/remoteUser-1/remote-folder-to-sync/'/] does not exist or is not writable and CREATE_DIRS is not allowed.
TIME: 0 - _ExecTasksPidsCheck called by [CheckReplicas] finished monitoring pid [22142] with exitcode [1].
TIME: 0 - _ExecTasksPidsCheck called by [CheckReplicas] finished monitoring pid [22143] with exitcode [1].
TIME: 0 - Cancelling task.
TIME: 0 - osync finished with errors.

SSHコマンドファイルパスで "@"文字をエスケープする方法はありますか?他のエラーはありませんか?

書き込み権限をテストし、ディレクトリ権限を生成しました。すべてが許可され、有効です。

また、osync.sh 1.2バージョン(数年前の最新の安定版)でテストしましたが、やはり動作しませんでした。

答え1

リンクされたスクリプトのソースコードを確認し、詳しく見てくださいfunction Init { ... }うん、問題は@あなたが行く途中のキャラクターだスクリプトは、指定されたパス(${parameter%@*}以下に示すように)で最も短いサフィックスを切り捨てるため、次の場所で無効なリモートユーザー名を取得します。

if [[ "$uri" == *"@"* ]]; then
            # remove everything after '@'
            REMOTE_USER=${uri%@*}

最終的にREMOTE_USERを次のように設定します。sync-user@DOMAIN:25//var/services/homes/これは間違っています。スクリプト所有者は、最長の一致除去を使用してこの問題を解決できます${parameter%%@*}

osync.shまたは、私が直接言及したスクリプト部分を修正してから再インストールしてください。


メモ:

  1. パスの周りに単一引用符を使用し、両方を使用しないでください--target='/some/remote/path'
  2. スクリプトの他の部分を読み取るときに=パスに文字がある場合にも問題があります。:
  3. ここで指摘された質問が唯一の問題かどうかはわかりません。

関連情報