2015-11-05 98 views
0

我想用別的東西替換linux命令中的空間。 例如:Linux中的轉義空間命令

echo "test"  --->  echo\040"test" 

我知道\ 040無法正常工作,但我正在尋找一個合適的替代品。

+0

我只是想知道爲什麼? –

+1

什麼是上下文?一般來說,不能改變解析器用於初始解析命令行的內容。 – chepner

+0

@LucM我有一個有限的服務,我能夠通過參數只有有限的關鍵字。例如ping x.x.x.x我試過了,發現它容易受到混合輸入的影響。例如ping x.x.x.x&ls將執行ping並列出當前目錄。我是筆測試人員,我想完成我的觀察,我需要確保這個漏洞有多大危險。例如用戶是否可以修改或添加和執行文件?用戶(入侵者)必須將命令更改爲無空格命令,因爲它似乎是命令解析器對空間敏感。 – Giac

回答

0

感謝chepner的洞察力,現在我確定只要您需要傳遞一個參數(因爲您必須將命令與參數分隔開一個空格),這是不可能的。但是,如果你不這樣做(即,如果參數總是相同的話),你可以創建一個腳本或函數來執行包含空格的代碼,這些代碼可以在不使用空間的情況下被調用。

+0

是的,這已經有一個空間!我需要一個不包含任何空間的替代品! – Giac

+0

哦!然後Mark Plotnik的評論是適合你的。我會重做我的答案,以擴展它。 – Aaron

+0

不,Mark的評論在這種情況下不起作用:試着'IFS =,'後面加'echo,foo'。你會得到一個「找不到命令」的錯誤,而不是打印「foo」。 – chepner

1

一般來說,你不能這樣做。 shell解析器的工作原理大致如下:

  1. 根據單獨的空格(空格和製表符)將行拆分爲單詞。
  2. 對每個初始單詞應用擴展。
  3. 確定要運行並執行的命令。

你的問題是,你想改變在第1步中如何識別單詞;你不能這樣做。


在某些情況下,您可以使用eval執行預解析命令。例如:

cmd="echo,foo" 
IFS=, 
eval $cmd 

此輸出foo因爲當無引號$cmd膨脹時,它字分裂,echofoo後產生兩個空格分隔單詞。然後由eval執行,產生期望的結果。然而,它是強烈建議你不要在實踐中寫這樣的代碼,因爲它很容易執行代碼,你不打算與eval


對於你給的例子(用戶輸入ping x.x.x.x),你應該做這樣的事情。不要將輸入作爲代碼執行,而應將其視爲執行腳本提供的代碼的請求。

read cmd argument 
case $cmd in 
    ping) ping "$argument" ;; 
    *) printf 'Unrecognized command "%s"\n' "$cmd" >&2 ;; 
esac 

現在,沒有任意的執行。無論用戶輸入什麼內容,腳本要麼執行ping,要麼執行單個參數,否則腳本會輸出錯誤消息。

+0

我有有限的服務,我只能通過有限的關鍵字參數。例如ping x.x.x.x我試過了,我發現它容易受到混合輸入的影響。例如ping x.x.x.x&ls將執行ping並列出當前目錄。關於ping x.x.x.x&cat Giac

0

我不知道這是否是您所期望的

$cat j 
echo "test" 

新行

$ cat j|sed -e 's/\s/\xC/'g 
echo 
    "test" 
1

更換空間,您可以嘗試其他空白比空間。標籤,CR,LF,...

如果直接運行在bash,你可以使用定義的shell變量:

echo$IFS"test" 

或被C類的字符串逃過你的命令,並運行一個:

$(cat<<<$'echo\x20test') 
+0

完美!第二個很棒... – Giac