我想用別的東西替換linux命令中的空間。 例如:Linux中的轉義空間命令
echo "test" ---> echo\040"test"
我知道\ 040無法正常工作,但我正在尋找一個合適的替代品。
我想用別的東西替換linux命令中的空間。 例如:Linux中的轉義空間命令
echo "test" ---> echo\040"test"
我知道\ 040無法正常工作,但我正在尋找一個合適的替代品。
感謝chepner的洞察力,現在我確定只要您需要傳遞一個參數(因爲您必須將命令與參數分隔開一個空格),這是不可能的。但是,如果你不這樣做(即,如果參數總是相同的話),你可以創建一個腳本或函數來執行包含空格的代碼,這些代碼可以在不使用空間的情況下被調用。
一般來說,你不能這樣做。 shell解析器的工作原理大致如下:
你的問題是,你想改變在第1步中如何識別單詞;你不能這樣做。
在某些情況下,您可以使用eval
執行預解析命令。例如:
cmd="echo,foo"
IFS=,
eval $cmd
此輸出foo
因爲當無引號$cmd
膨脹時,它字分裂,echo
和foo
後產生兩個空格分隔單詞。然後由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
,要麼執行單個參數,否則腳本會輸出錯誤消息。
我有有限的服務,我只能通過有限的關鍵字參數。例如ping x.x.x.x我試過了,我發現它容易受到混合輸入的影響。例如ping x.x.x.x&ls將執行ping並列出當前目錄。關於ping x.x.x.x&cat var/log/...我是一個筆測試者,我想完成我的觀察,我需要確保這個漏洞有多危險。例如用戶是否可以修改或添加和執行文件?用戶(入侵者)必須將命令更改爲無空格命令,因爲它似乎是命令解析器對空間敏感。 – Giac
我不知道這是否是您所期望的
$cat j
echo "test"
新行
$ cat j|sed -e 's/\s/\xC/'g
echo
"test"
更換空間,您可以嘗試其他空白比空間。標籤,CR,LF,...
如果直接運行在bash,你可以使用定義的shell變量:
echo$IFS"test"
或被C類的字符串逃過你的命令,並運行一個:
$(cat<<<$'echo\x20test')
完美!第二個很棒... – Giac
我只是想知道爲什麼? –
什麼是上下文?一般來說,不能改變解析器用於初始解析命令行的內容。 – chepner
@LucM我有一個有限的服務,我能夠通過參數只有有限的關鍵字。例如ping x.x.x.x我試過了,發現它容易受到混合輸入的影響。例如ping x.x.x.x&ls將執行ping並列出當前目錄。我是筆測試人員,我想完成我的觀察,我需要確保這個漏洞有多大危險。例如用戶是否可以修改或添加和執行文件?用戶(入侵者)必須將命令更改爲無空格命令,因爲它似乎是命令解析器對空間敏感。 – Giac