2012-09-13 54 views
1

我通過SSH將動態shell命令傳遞給使用ssh2庫的PHP服務器。我傳遞的命令是(注意,這僅僅是一個例子,命令是動態的和用戶生成的)。使用特殊字符通過SSH傳遞shell命令

$command = 'ls -al 
free -m'; 

注意換行,這是必需的,因爲用戶可以鍵入用換行和標籤完整的bash腳本。於是,我做了以下構建實際的命令是互斥的庫來執行:

$command = str_replace("'", "\'", $command); 
$command = 'echo $\'' . $command . '\' | bash'; 

這導致了最後的命令:

echo $'ls -al 
free -m' | bash 

上面的命令在shell直接執行罰款,但是當我用SSH2從PHP執行它,我越來越:

ls: invalid option -- 
Try `ls --help' for more information. 

所以我就想,好吧,必須有一些特殊字符或美元符號沒有被轉義,所以我所做的:

print_r(bin2hex($command)); 

這導致:

6563686f2024276c73202d616c0d0a66726565202d6d27207c2062617368 

六角轉換成ASCII碼返回正確的命令(如以上精確地)雖然。

任何想法可能會造成這種情況?

回答

0

該錯誤來自bash,而不是PHP。

當我在shell中嘗試你的命令時,我得到了同樣的錯誤。

但是你爲什麼要用這種令人費解的方式運行bash?

取而代之的是使用proc_open(),使用bash作爲命令,然後將其輸入stdin文件句柄中的用戶輸入。

如果你需要的是如何使用它的一個例子:https://stackoverflow.com/a/2390755/664364

PS。我希望你知道你在做什麼,允許用戶以web服務器用戶身份運行任意命令!

+0

解釋爲什麼這樣設置是個漫長的故事。除了安全。真的,當你複製並粘貼'$ command'的內容時,你會得到一個bash錯誤?我不在CentOS中。 – Justin

+0

我的確如此。雖然錯誤是不同的。我得到'ls:無效選項 - 'e'' – Ariel

+0

我編輯了張貼,請閱讀頂部以查看更好的解釋。 – Justin