2014-12-30 117 views
1

我正在編寫一個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 

但我發現,一些(企業)服務器輸出(法律術語)消息(標準錯誤我猜)每個用戶通過scpssh連接時間。所以我開始研究利用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腳本中的實際退出碼?

+0

使用'case'語句的代碼我得到:'$的情況下? in(0)echo ok ;; (6)echo「找不到文件」;; (*)回聲「別的東西」;; esac'。或者將返回代碼保存在一個變量中:'ret_code = $?'。作爲一個方面說明:不要使用'scp',這很糟糕。改用'rsync'或'sftp'代替。 –

+0

要清楚從'scp'得到的返回碼與它在本地機器上的狀態有關;它不會通過正在複製的遠程計算機的返回代碼。因此,如果主機不存在或憑據失敗,它將具有非零的退出代碼。也許這很清楚,如果是這樣,就忽略評論。 –

+0

@gniourf_gniourf正在表達我的意思,除了我會使用'rsync'時期。我的經驗是'scp'不如'sftp'! ;-)當我不得不在多個操作系統之間進行「ftp」操作時,我有一個知道每個操作系統的ftp錯誤信息的功能並相應地執行了操作。 另外,在足夠的操作系統上沒有使用'rsync'來知道錯誤消息是否一致。我認爲應該是,但是......如果它必須是防彈的,假設最差,並且在開發過程中專門測試每個案例。祝你好運! – shellter

回答

2

根據意見(@gniourf_gniourf,@shelter,@Wintermute)我決定簡單地將工具切換到rsync。謝天謝地,語法不需要改變。

23是錯誤代碼時不存在文件,所以這裏是我結束了

rsync -q [email protected]$host:/etc/$file ./$host/conf/ 2>/tmp/Error 1>/dev/null 
if [[ $? -eq 23 ]]; then echo -e "$file not found on $host"; continue; fi 
0

我看到1找不到「找不到文件」,如果您需要區分不同的錯誤捕獲標準輸出,可以針對本地主機測試這些類型的東西。

if $err=`scp $host:$file 2>&1` 
then 
    echo "copied successfully 
else 
case "$err" in 
    *"file not found"*) 
    echo "$file Not Found on $host" 
    ;; 
    *"Could not resolve hostname"*) 
    echo "Host not found: $host" 
    ;; 
    "Permission denied "*) 
    echo "perm-denied! $host" 
    ;; 
    *) 
    echo "other scp error $err" 
    ;; 
esac 

如果您的不同語言環境具有不同的消息,則這不起作用。

+0

我的問題是試圖從'scp'獲得可靠的退出狀態,因爲我們都提到我不能依賴基於正則表達式的錯誤輸出。事實上,你列出的案例陳述(「找不到文件」)不會找到我所看到的錯誤陳述,即「沒有這樣的文件或目錄」。 – NoOutlet