我正在編寫一個bash腳本,它檢查文件名列表,並嘗試使用scp
從兩臺服務器將每個文件複製到本地文件夾中。該腳本然後將本地文件相互比較。但有時候,文件不會存在於一臺服務器或另一臺服務器上,或者兩者都存在。SCP的實際返回碼
起初,我用這個代碼:
scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null
error=$(</tmp/Error) # error catching
if [[ -n "$error" ]]; then echo -e "$file not found on $host"; fi
但我發現,一些(企業)服務器輸出(法律術語)消息(標準錯誤我猜)每個用戶通過scp
或ssh
連接時間。所以我開始研究利用exit codes。
我可以簡單地使用
scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null
if [[ $? -ne 0 ]]; then echo -e "$file not found on $host"; fi
但自從exit code for "file does not exist" is supposed to be 6,我寧願有一個更精確的
scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null
if [[ $? -eq 6 ]]; then echo -e "$file not found on $host"; fi
的問題是,我似乎不管有愈演愈烈的退出代碼爲1什麼地方出了錯。這個問題與this one類似,但是這個答案在Bash中幫不了我。
我正在考慮另一種方案是
scp [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null
error=$(</tmp/Error) # error catching
if [[ ${error: -25} = "No such file or directory" ]]; then echo -e "$file not found on $host"; fi
但我關心的是不同版本的scp
可能會對相同的錯誤不同的錯誤消息。
有沒有辦法讓scp
在Bash腳本中的實際退出碼?
使用'case'語句的代碼我得到:'$的情況下? in(0)echo ok ;; (6)echo「找不到文件」;; (*)回聲「別的東西」;; esac'。或者將返回代碼保存在一個變量中:'ret_code = $?'。作爲一個方面說明:不要使用'scp',這很糟糕。改用'rsync'或'sftp'代替。 –
要清楚從'scp'得到的返回碼與它在本地機器上的狀態有關;它不會通過正在複製的遠程計算機的返回代碼。因此,如果主機不存在或憑據失敗,它將具有非零的退出代碼。也許這很清楚,如果是這樣,就忽略評論。 –
@gniourf_gniourf正在表達我的意思,除了我會使用'rsync'時期。我的經驗是'scp'不如'sftp'! ;-)當我不得不在多個操作系統之間進行「ftp」操作時,我有一個知道每個操作系統的ftp錯誤信息的功能並相應地執行了操作。 另外,在足夠的操作系統上沒有使用'rsync'來知道錯誤消息是否一致。我認爲應該是,但是......如果它必須是防彈的,假設最差,並且在開發過程中專門測試每個案例。祝你好運! – shellter