쓰기 권한 없이 원격 SFTP 디렉터리를 로컬에 반복적으로 복사합니다.

쓰기 권한 없이 원격 SFTP 디렉터리를 로컬에 반복적으로 복사합니다.

이와 관련된 질문이 많이 있지만 모든 제약이 있는 것은 아니므로 제약부터 시작하겠습니다.

제약:

  • 원격 디렉터리를 재귀적으로 복사하고 싶습니다.
  • 원격 서버 설정을 전혀 제어할 수 없습니다.
  • 원격 컴퓨터의 해당 디렉터리에 대한 쓰기 권한이 없습니다.
  • 시도하면 get -r디렉토리가 복사됩니다.현지 없이쓰기 권한 중 하나.
  • 그런 다음 원격 디렉터리에 중첩된 파일과 폴더를 반복적으로 복사하려고 하면 오류가 발생합니다.현지의나에게 부여되지 않은 디렉토리에는 쓰기 권한이 있습니다.
  • 내 컴퓨터에 새 소프트웨어를 설치할 수 없습니다. ( sftp"OpenSSH_7.9p1, LibreSSL 2.7.3"을 사용한 순수 솔루션 필요 )

질문:

sftppure 및 no를 사용하여 원격 디렉터리를 재귀적으로 복사할 수 있습니까?현지의권한 오류?

답변1

업데이트: 2021-03년에 출시된 OpenSSH 8.5에서는 이 문제가 해결되었습니다. 보다http://www.openssh.com/txt/release-8.5버그 수정에서 bz#3222 항목을 수정합니다.

참고: OpenSSH 7.9는 2018-10년에 출시되었습니다. "~5년 전 [a] Mac에서 [come]"을 가질 수 없습니다. 어떻게 든 업데이트되었습니다.

네가 옳아; in은 01777로 마스크된 것을 제외하고 가능한 경우 원격 디렉토리와 동일한 권한을 가진 새 로컬 디렉토리를 생성합니다. 즉, 매우 드물고 귀하의 경우에는 발생하지 않을 가능성이 매우 높은 suid 및 sgid를 제외합니다 download_dir_internal. (또는 ) sftp-client.c플래그 는 다음에 대한 권한을 설정하는 데 필요합니다.-p-P파일그러나 디렉토리에 대해서는 무시됩니다.

그러나 디렉토리가 이미 존재하는 경우 sftp는 EEXIST 오류를 무시합니다. 따라서 먼저 모든 (빈) 디렉토리를 생성하면~와 함께쓰기 권한을 부여한 다음 get -r작동해야 합니다. sftp에서는 할 수 있는 방법이 없습니다.목록따라서 이미 디렉토리 구조를 알고 있거나 find /mydir -type d원격에서와 같은 것을 실행할 수 있는 방법이 없다면 이는 약간 보기 흉해집니다.

#!/bin/bash     # or other location as necessary
REMOTE=(user@host) # array so can add _separated_ options like -i idfile -P port if needed
IFS=$'\n'
all=( )
new=( $( echo ls -n | sftp ${REMOTE[@]} | awk '/^d/{print substr($0,57)}' ) )
while [[ ${#new[@]} -gt 0 ]]; do
        all+=( "${new[@]}" )
        new=( $( printf "ls -n %s\n" "${new[@]}" \
            | sftp ${REMOTE[@]} | awk '/^d/{print substr($0,57)}' ) )
done
mkdir "${all[@]}" # with umask NOT including 200!
# or if (maybe) large enough to hit ARG_MAX
printf '%s\n' "${all[@]}" | xargs mkdir
# if dirnames (can) contain any SP TAB " ' \
# use -d'\n' on GNU but you're on your own otherwise 
# (and Macs mostly don't have GNU)

(Mac이 없기 때문에 테스트하지는 않았지만, 언급된 것을 제외하고는 여기에 있는 모든 것이 이식 가능하다고 생각합니다.)

관련 정보