![SSH /osync 在远程文件路径中转义“@”字符](https://linux22.com/image/199248/SSH%20%2Fosync%20%E5%9C%A8%E8%BF%9C%E7%A8%8B%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E4%B8%AD%E8%BD%AC%E4%B9%89%E2%80%9C%40%E2%80%9D%E5%AD%97%E7%AC%A6.png)
我需要编写一个脚本,将多个目录从本地同步到远程服务器(双向)。
该脚本当前使用同步工具用于ssh
执行同步。它使用的确切命令(导致我的脚本失败的命令位于osync.sh
Github 上文件的第 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
我提到的脚本部分,然后重新安装;
笔记:
- 仅在该路径周围使用单引号,而不是同时使用单引号
--target='/some/remote/path'
。 - 当我阅读脚本的其他部分时,如果您的路径中有
=
和字符,它也会出现问题。:
- 我不确定尖锐的问题是否是这里唯一的问题。