Bash
bash 腳本的 SCP 錯誤,源路徑中有空格
當然我錯過了一些簡單的東西,但這讓我發瘋。我正在嘗試將遠端文件 SCP 到目前本地目錄。遠端路徑中有空格。我需要它在腳本中執行並將路徑放入變數中,因為它是從文件中讀取的。
問題是,無論我如何嘗試逃避它,我仍然會收到“找不到文件或目錄”錯誤。我將
-v
選項放在scp
命令上,如果我複制並粘貼它,它發送的命令就可以工作,但是當我在那裡有變數時,它就會爆炸。請注意,如果我寫出路徑,它可以正常工作,但是當我嘗試將路徑放入變數時會中斷。僅轉義硬編碼字元串有很多類似的問題,但是我找不到在文件路徑中使用帶有空格的變數的任何內容。
文件路徑為:
/home/myUser/databases/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip
執行
scp
詳細時,該行將sending command
列印以下內容:scp -f /home/myUser/databases/SONIC\\ BOATS\\ LTD./database-1.11-2019-12-30-09-40.zip .
如果我將該行粘貼到我的腳本中並執行它,那麼它就可以工作。那麼為什麼當它在帶有變數的腳本中執行時它不起作用呢?
我的變數列印如下:
DB_ARC_FILENAME:
/home/myUser/databases/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip
ESC_DB_ARC_FILENAME
/home/myUser/databases/SONIC\ BOATS\ LTD./database-19.11-2019-12-30-09-40.zip
還有我的腳本程式碼片段:
while read DB_ARC_FILENAME do # Escape spaces in the files name ESC_DB_ARC_FILENAME=${DB_ARC_FILENAME//\ /\\\ } # Copy the database file to the local system scp -v foobar@xx.xx.xx.xx:"$ESC_DB_ARC_FILENAME" . ... done < uploadedDatabaseFileList
這是我執行它時得到的輸出:
debug1: Sending command: scp -v -f /home/myUser/databases/SONIC\\ BOATS\\ LRD./database-1.11-2019-12-30-09-40.zip debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0 : No such file or directoryer/databases/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip debug1: channel 0: free: client-session, nchannels 1 : No such file or directoryes/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip debug1: fd 0 clearing O_NONBLOCK debug1: fd 1 clearing O_NONBLOCK Transferred: sent 2836, received 2704 bytes, in 0.8 seconds Bytes per second: sent 3678.9, received 3507.7 debug1: Exit status 1
您的逃生模式不太正確。改用這個,它在每次出現的空格前加上一個反斜杠:
ESC_DB_ARC_FILENAME="${DB_ARC_FILENAME// /\\ }"
測試場景(中
$HOME
):file='the date.txt' date > "$file" scp -vp localhost:"$file" td; ls -l td; rm -f td # Fails scp -vp localhost:"${file// /\\ }" td; ls -l td; rm -f td # Succeeds
知道了。此錯誤消息將其洩露:
: No such file or directoryes/SONIC BOATS LTD./database-1.11-2019-12-30-09-40.zip
您正在使用在 Windows 機器上生成的源數據文件。結尾的 CR 被視為文件名的一部分,當然您的源文件沒有這樣的字元。