Ssh

SSH /osync 在遠端文件路徑中轉義“@”字元

  • December 6, 2021

我需要編寫一個腳本,將多個目錄從本地伺服器同步到遠端伺服器(雙向)。

該腳本目前使用osync.shssh執行同步。它使用的確切命令(導致我的腳本失敗的命令位於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 Server,這是 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 命令文件路徑中的“@”字元嗎?錯誤是別的嗎?

我已經測試了 Write 權限和 Create-dirs 權限。一切都被允許並且確實有效。

我還測試了 osync.sh 1.2 版本(這是幾年前的最新穩定版本),它也沒有工作。

查看您連結的腳本的原始碼並深入研究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. 我不確定指出的問題是否是這裡唯一的問題。

引用自:https://unix.stackexchange.com/questions/680003