
我看到很多與此相關的問題,但不是我所有的限制,所以我將從我的限制開始。
限制條件:
- 我想遞歸複製遠端目錄。
- 我根本無法控制遠端伺服器設定。
- 我沒有遠端電腦上該目錄的寫入權限。
- 當我嘗試時
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在 Bugfixes 下 bz#3222 的專案。
旁白:OpenSSH 7.9 於 2018 年 10 月發布;它不能有「[來]在[a]Mac上〜5年前」。你已經以某種方式更新了。
你說得對; download_dir_internal
insftp-client.c
建立一個新的本機目錄,其權限與遠端目錄相同(如果有的話),但被01777 屏蔽的除外——即排除suid 和sgid,這是非常罕見的,而且很可能不會出現在您的情況下。需要-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 上進行測試,因為我沒有 Mac,但我相信這裡的所有內容都是便攜式的,除非另有說明。)