根據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上不適用於我,它需要引用整個命令字符串。
如果您指定腳本的絕對路徑,該怎麼辦? su - jetty sh /where/ever/runProgram.sh – aaberg 2012-04-25 21:46:23