2012-04-25 53 views
1

我有一個shell腳本,我試圖以特定用戶身份運行。我的命令是這樣的:無法執行二進制文件錯誤

su - jetty sh ./runProgram.sh 

當我試圖通過控制檯來運行這個命令我得到一個錯誤說:

/bin/sh: /bin/sh: cannot execute binary file 

我也試過:

su - jetty sh runProgram.sh 

我仍然得到相同的錯誤..

它是否工作,如果我這樣做:

sh runProgram.sh 

但是這個shell腳本是由特定用戶運行的。任何關於如何得到這個工作的建議?

+0

如果您指定腳本的絕對路徑,該怎麼辦? su - jetty sh /where/ever/runProgram.sh – aaberg 2012-04-25 21:46:23

回答

4

嘗試

su - jetty -c sh runProgram.sh 
1

根據su的文檔(info coreutils 'su invocation'),默認情況下將執行shell和參數su被作爲參數傳遞給外殼通過。

言外之意很簡單:su在本質上是這樣做的: /bin/sh*arguments_to_su* 但確實它作爲其他用戶(以下簡稱「有效用戶ID」)......這一切......所以

su - jetty sh ./runprogram.sh 

類似於

(become the user jetty via login or su) 
/bin/sh sh ./runprogram.sh 

...和外殼會報告錯誤,因爲第一個/bin/sh,通過su叫,試圖運行該程序sh作爲shell腳本,以./runprogram.sh作爲參數。但是sh本身不是一個shell腳本,它是一個二進制文件(它的工作就是運行shell腳本)。

如果你簡單地做到這一點:

su - jetty ./runprogram.sh 

然後su命令將調用/bin/sh與程序./runprogram.sh作爲參數,並作爲碼頭的有效用戶ID,都應該很好。 ...應該是好的,因爲你正在做一個su -你正在使shell成爲一個登錄shell並更改爲用戶的主目錄。如果runprogram.sh不在主目錄中,您將收到錯誤消息。

這就是爲什麼,也無法運行,例如通過簡單地運行cp命令:

su - jetty cp file1 file2 

...因爲,再經過su改變有效用戶ID碼頭,它會嘗試這樣的:

/bin/sh cp file1 file2 

...和cp不是shell腳本。但-c選項在這種情況下工作;因爲你告訴su要使用-c選項以shell中運行/bin/sh

su - jetty -c "cp file1 file2" 

做這項工作。請注意,您必須引用該命令,因爲整個字符串被傳遞給shell,並且(我相信)以下任何參數都被忽略。

最後,上一張海報的答案在Linux上不適用於我,它需要引用整個命令字符串。

相關問題