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. 여기서 지적된 질문이 유일한 문제인지는 잘 모르겠습니다.

관련 정보