2013-02-05 100 views
29

我試圖使用scpbash中使用源文件名中的冒號(:)字符複製文件。我命令我使用的模糊版本是:如何在文件名中使用冒號scp文件?

scp file\:\ name.mp4 [email protected]:"/path/to/dest" 

我得到這個錯誤:

ssh: Could not resolve hostname Portal 2: Name or service not known 

我知道我可以只重命名該文件並刪除:,但我想知道是否有可能逃離結腸。

回答

51

不太一個bash逃避問題,這是scp治療x:爲[用戶@]主機前綴,請嘗試:

scp ./file:\ name.mp4 [email protected]:"/path/to/dest" 

使用相對(如./)或完全合格的路徑(/path/to/source)防止這種行爲 - 在:之前存在/導致OpenSSH停止檢查可能的host:[email protected]:前綴)。 OpenSSH的scp只有啓動的特殊情況下的文件名,允許這些工作沒有問題的冒號,它不支持在正常意義上轉義:,並且沒有其他有效主機名的概念,因此幾乎所有具有:的文件名都可以導致這一點。

(由於OpenSSH的年代[]封閉的IPv6地址簡單的解析,就可以成功scp文件包含:[開始,或者包含@[:之前,不包含]:,但這不是普遍有用;-)


下面的文字寫original question如何逃脫在bash冒號?它適用於這種情況,但不scp如無殼逸出量將幫助那裏。)

要回答這個問題有關如何逃脫:,你並不需要,但「\:」的作品。一個:用於地方:

  1. 空命令:,沒必要逃避,雖然可以,就像\e\c\h\o foo它的命令沒有影響(「沒有效果」並不完全正確,如果你逃跑一個或多個字符它會阻止一個別名相匹配)
  2. PATH(和其他人,CDPATHMAILPATH)轉義值沒有任何有用的效果(我一直無法從含有:的目錄在我的PATH運行一個程序,這有點出乎意料)
  3. 參數擴展${name:-x}多,name必須[a-zA-Z_][a-zA-Z0-9_],所以沒有必要逃避變量名稱,因爲沒有歧義,沒有必要在
  4. ? :三元只在變量和數字,無需操作參數擴展的其他變化逃脫隨後:逃跑
  5. ===~帶班像[[:digit:]]模式,你可以用\:逃走,但我在一個頭緒,可能永遠是有用的...
  6. 命令或函數名之內,無需要逃脫,\:沒有有用的效果

(需要注意的是空命令只是:,你可以有一個命令或功能命名,如「:foo」,它可以在沒有逃脫被調用,在這方面它是不同的,以#,其中一個名爲#foo命令將需要)

+1

同樣的問題影響'rsync'。幸運的是,同樣的解決方案 - 以'。/'作爲文件名前綴 - 也可以幫助您。 –

相關問題