2012-04-25 123 views
1

私は特定のユーザーとして実行しようとしているシェルスクリプトを持っています。私も試してみましたバイナリファイルエラーを実行できません

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

su - jetty sh runProgram.sh 

そして、私がまだ

su - jetty sh ./runProgram.sh 

私はコンソールからこのコマンドを実行しようとすると、私は言ってエラーを取得:私のコマンドは次のようになります同じエラーが発生します..

私がこれを行うと動作します:

sh runProgram.sh 

しかし、このシェルスクリプトは特定のユーザーによって実行されることを意図しています。どのようにこの作業を得るための任意のアドバイス?

+0

スクリプトの絶対パスを指定するとどうなりますか? su - jetty sh /where/ever/runProgram.sh – aaberg

答えて

4

suのマニュアル(info coreutils 'su invocation')によると、それはデフォルトでシェルを実行します

su - jetty -c sh runProgram.sh 
1

を試してみて、そしてsuへの引数は、シェルへの引数として渡されます。 ...それがすべてだ...だから

su - jetty sh ./runprogram.sh 
/bin/sh *arguments_to_su* を、それは別のユーザ(「実効ユーザID」)としてそれをしない: su本質的にやっている:

含意は、単純に、これはあります

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

に似ている...とsuによって呼び出された最初の/bin/shは、プログラム0123を実行しようとしているので、シェルは、エラーを報告しますをシェルスクリプトとして使用し、./runprogram.shを引数として使用します。しかし、sh自体はシェルスクリプトではなく、バイナリです(その仕事はシェルスクリプトを実行することです)。あなたは、単にこれを実行した場合

su - jetty ./runprogram.sh 

はその後 suコマンドが有効なユーザーIDとして、引数としてプログラム ./runprogram.sh、および桟橋で /bin/shを呼び出しますし、すべてがうまくなければなりません。 ... su -を実行しているので、シェルをログインシェルにしてユーザのホームディレクトリに変更しているので、うまくいくべきです(SHOULD)。 runprogram.shがホームディレクトリにない場合は、エラーが発生します。再び、 su変更実効ユーザIDの後に、それはこれをしようと桟橋ために、ので...

su - jetty cp file1 file2 

を::

これは単にでcpのコマンドを実行し、たとえば実行することはできません、また、なぜある

/bin/sh cp file1 file2 

...およびcpはシェルスクリプトではありません。しかし、この場合は-cオプションが機能します。あなたがsuを言っているので、あなたは、シェルに-cオプションを指定して/bin/shを実行したいこと:

su - jetty -c "cp file1 file2" 

が仕事をしていません。文字列全体がシェルに渡されるので、次の引数は無視されるので、コマンドを引用する必要があることに注意してください。

最後に、以前のポスターの回答はLinuxでは私にとってはうまくいきませんでした。コマンド文字列全体を引用する必要があります。

関連する問題