[閒聊] scp(1) 不能複製 symbolic links
你可能沒注意過這件事情, 不過這幾乎是確定的:
scp(1) 不抄 symbolic links! 除非我真的誤會很大!
你可能實在是不需要這種功能, 那就沒話說.
可是你也可能跟我一樣, 偶而需要做這種事
每次需要做這事的時候, 就要再 man scp 一次,
然後再上網爬文, 最後終於再一次確認:
scp(1) 不抄 symbolic links!
然後, 你可能也跟我一樣, 看到一堆有的沒有的建議,
其中, 印象最深刻的就是: 為甚麼不用 rsync(1)....
我想大家跟我一樣, 碰到的大部份是檔名的問題...
然後, 如果你問我, 上一次最後是怎麼辦好這件事的?
不好意思, 我還真的說不出來....
然後, 等到某一天, 又要做這事, 再從頭開始 man scp....
再複習一次, 原來 scp(1) 不抄 symbolic links....
另一個曾經多次干擾過我的 scp(1)--行為是: 它不喜歡冒號
$ scp -p "Chopin: Sonata No.2.mp4" another_host:remote_dir/
ssh: connect to host 1.2.3.4 port 22: Connect refused
直到前一陣子有一天, 我痛定司痛(是不是這樣用的?),
寫了個小 script "scp2", 作為當天給自己的 Le Petit Bonheur.
並決定採用以 tar(1) 打包, 再以 ssh(1) 投放, 的方式進行,
其實就只有一行:
tar cf - "$@" | ssh "$HOST" "(cd ${DIR+\"$DIR\"} && tar xvf -)"
現在的問題是, 我們當然希望是跟原來 scp 一樣的語法, 這個對我很重要.
還好, syntax 的問題可以解決, 而且是抄別人的 (oguz ismail, 2020-06-06)
我實在不想縮網址, 但又很想要引用, 因為他只得兩推太不公平.... :(
https://stackoverflow.com/questions/62227556/assign-last-positional-parameter-to-variable-and-remove-it-from
所以, 以下的 script, 只有最後3行是我寫的
而且, 希望沒有 bashism, 請大家幫檢查看看
有甚麼可以改善的, 一定要告訴我!
------ cut ------- begin scp2 ------------
#!/bin/sh
if [ $# -lt 2 ]
then
# echo >&2 "usage: scp2 source ... target"
echo >&2 "usage: scp2 local... remote"
exit 1
fi
count=0
until test $((count+=1)) -ge $#
do
set -- "$@" "$1"
shift
done
LAST=${1-}
shift $((!!$#))
HOST=$(echo $LAST | sed 's/:.*$//' )
DIR=$(echo $LAST | sed "s/^.*://")
#tar cf - "$@" | ssh "$HOST" "(cd ${DIR+\"$DIR\"} && tar xvf -)"
tar cf - "$@" -P --transform="s|^/\?$(dirname "$1")/||" |\
ssh "$HOST" "(cd ${DIR+\"$DIR\"} && tar xvf -)"
-------- cut -------- end scp2 --------------
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.172.21.14 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1655048383.A.3F1.html
→
06/12 23:44,
2年前
, 1F
06/12 23:44, 1F
推
06/13 09:17,
2年前
, 2F
06/13 09:17, 2F
→
06/13 12:09,
2年前
, 3F
06/13 12:09, 3F
→
06/13 12:15,
2年前
, 4F
06/13 12:15, 4F
→
06/13 12:16,
2年前
, 5F
06/13 12:16, 5F
→
06/13 12:19,
2年前
, 6F
06/13 12:19, 6F
→
06/13 12:20,
2年前
, 7F
06/13 12:20, 7F
→
06/13 12:20,
2年前
, 8F
06/13 12:20, 8F
→
06/13 12:20,
2年前
, 9F
06/13 12:20, 9F
Hmmm... 倒是沒想過這設計哲學的問題... 不過 scp 也不是 rsync
scp(1) 應該很適合跨平台操作吧? 頂多, 在使用者堅持 preserve
太多的 attributes 的時候 (scp -p) 囉唆一下, 例如:
set times: Operation not permitted
至於 rsync, 嘿嘿, 不好意思, 跨不同檔案系統的操作其實是我的日常也...
只要自己心裡有數, 甚麼過得去, 甚麼是強人所難...
在設計上, 應該可以說, 連 rsync 都有意適度容忍跨越不同檔案系統的操作,
正因為如此, 碰到困難時才只是抱怨「恕難照辦」而不是直接 abort 吧.
有空時, 請幫我試試看會出甚麼問題喔~ 目前感覺還蠻好用的喔...
※ 編輯: cuello (218.172.25.44 臺灣), 06/13/2022 21:43:53
推
06/14 23:42,
2年前
, 10F
06/14 23:42, 10F
→
06/14 23:42,
2年前
, 11F
06/14 23:42, 11F
是喔, 謝謝告知. 可是能不能不放棄啊? 他們應該會好好保留 scp 的「殼子」吧
UNIX 世界應該很少發生這種中斷吧...如果是安全的問題, sftp 骨子裡不是解決了?
※ 編輯: cuello (218.172.25.44 臺灣), 06/15/2022 23:33:58
→
06/16 10:40,
2年前
, 12F
06/16 10:40, 12F
→
06/16 10:40,
2年前
, 13F
06/16 10:40, 13F
Aha! 感謝 pointer! 倒也沒有矛盾, 只是很狀況外罷了! 我lag了好幾年..
原來這件事已經醞釀(?)那麼久了... 要不是禮拜天決定 po 文.
還真的錯過 Jonathan Corbet 的文章跟這整件事情的進展
不過你知道, 我手指頭的肌肉跟神經元不會喜歡的... 搞不好是普遍性的
所以有 holishing 的 「開始練習放棄」... 雖然對於某些人來說
可能是練習放氣 backtick 的遠端執行 :)
在我單純的環境裡, 這似乎不構成令人緊張的威脅, 我猜最後的結果是:
我會... 不是! 是我的手指頭會用 scp(1) 直到它被消失的那一天... 吧...
不果, 這件事反而意外突顯了我的「小確幸」scp2(1) 的重要性
等到那一天, 雖然不能夠
$ sftp * remote:
起碼我還可以
$ scp2 * remote:
※ 編輯: cuello (218.172.4.188 臺灣), 06/16/2022 23:04:49
忘了提, scp2 是單向的 local --> remote.
※ 編輯: cuello (218.172.4.188 臺灣), 06/16/2022 23:06:15
剛剛再試了一下, 到時候, 還好我還可以繼續做這事:
$ pwd
/boot/
$ scp2 [vcS]*-5.10.122 root@remote:/boot/
有一個 scp 真好... root!? 偷懶啦, 已經儘量藏, 不在 22...
※ 編輯: cuello (218.172.4.188 臺灣), 06/17/2022 00:00:48
※ 編輯: cuello (218.172.4.188 臺灣), 06/18/2022 12:43:06
→
06/18 17:25,
2年前
, 14F
06/18 17:25, 14F
Linux 近期熱門文章
23
129
PTT數位生活區 即時熱門文章