
이와 관련된 질문이 많이 있지만 모든 제약이 있는 것은 아니므로 제약부터 시작하겠습니다.
제약:
- 원격 디렉터리를 재귀적으로 복사하고 싶습니다.
- 원격 서버 설정을 전혀 제어할 수 없습니다.
- 원격 컴퓨터의 해당 디렉터리에 대한 쓰기 권한이 없습니다.
- 시도하면
get -r
디렉토리가 복사됩니다.현지 없이쓰기 권한 중 하나. - 그런 다음 원격 디렉터리에 중첩된 파일과 폴더를 반복적으로 복사하려고 하면 오류가 발생합니다.현지의나에게 부여되지 않은 디렉토리에는 쓰기 권한이 있습니다.
- 내 컴퓨터에 새 소프트웨어를 설치할 수 없습니다. (
sftp
"OpenSSH_7.9p1, LibreSSL 2.7.3"을 사용한 순수 솔루션 필요 )
질문:
sftp
pure 및 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이 없기 때문에 테스트하지는 않았지만, 언급된 것을 제외하고는 여기에 있는 모든 것이 이식 가능하다고 생각합니다.)