0

ユーザー apache として bash スクリプトを実行しようとしています。そして、それは次のようにスローします

[apache@denison public]$ ll
total 32
drwxr-xr-x 2 apache apache 4096 Jul 17 08:14 css
-rw-r--r-- 1 apache apache 4820 Jul 17 10:04 h3111142_58_2012-07-17_16-03-58.php
-rwxrwxrwx 1 apache apache   95 Jul 17 10:04 h31111.bash
drwxr-xr-x 2 apache apache 4096 Jul 17 08:14 images
-rw-r--r-- 1 apache apache  754 Jul 17 08:13 index.php
drwxr-xr-x 2 apache apache 4096 Jul 17 08:14 javascript
drwxr-xr-x 5 apache apache 4096 Jul 17 08:14 jquery-ui-1.8.21.custom
[apache@denison public]$ bash h31111.bash
: command not found :

ファイルの内容は次のとおりです。

#!/bin/bash

/usr/bin/php /opt/eposdatatransfer/public/h3111142_58_2012-07-17_16-03-58.php 

PHPスクリプトは正常に実行され、結果は以下のとおりです

[apache@denison public]$ /bin/bash h31111.bash
: command not found:
[apache@denison public]$ chmod +x h31111.bash
[apache@denison public]$ ./h31111.bash
./h31111.bash: Command not found.
[apache@denison public]$ php h3111142_58_2012-07-17_16-03-58.php

ファイルの作成:

$batchFile = $this->session->username . "_" . $index . "_" . $date . ".sh";
            $handle = fopen($batchFile, 'w');
            $data = "#!/bin/bash
/usr/bin/php /opt/eposdatatransfer/public/$file 
";
            /*
rm -rf /opt/eposdatatransfer/public/$file
rm -rf /opt/eposdatatransfer/public/$batchFile*";*/
            fwrite($handle, $data);
            fclose($handle);

batchfile は bash スクリプトで、file は php ファイルです。これらは、webapp でのユーザー入力に基づいて自動的に作成されます。私の webapp は Linux で動作します。

4

4 に答える 4

2

Windowsマシンからスクリプトをアップロードし、行末から改行を削除しなかったと思います。これにより、#! これは、めったに存在しない #!/some/interpreter^M を検索するためです。

キャリッジ リターンがある場合は、fromdos または次のコマンドを使用して削除できます。

tr -d '\015' < /path/to/script > /tmp/script; chmod 755 /tmp/script; mv /tmp/script /path/to/script
于 2012-07-17T17:06:27.010 に答える
1

でスクリプトを実行しようとするとどうなりますか

 $ /bin/bash h31111.bash

これを試してください(スクリプトファイルの名前が「h31111.bash」であると仮定します):

 $ chmod +x h31111.bash

それを実行するには

 $ ./h31111.bash

また、コマンドの正しいパスがあると確信していますphpか? 何をwhich php報告しますか?

--

@jordanm が実行を提案したコマンドの出力に基づいて正しく示唆しているように、ファイルに対してコマンドfileを実行する必要がありdos2unixます。インストールされていない場合は、これtr -d '\r'も機能します。すなわち、

 $ tr -d '\r' h31111.bash > tmp.bash
 $ mv tmp.bash h31111.bash

これで準備完了です。

Ubuntu の一部のバージョンでは、これらのユーティリティ (dos2unix など) がインストールされていません。詳細については、このページを参照してください。

于 2012-07-17T16:00:53.350 に答える
0

どこで失敗しているのかわからないので、調べてみましょう。

まず、プログラムを実行できますか?

./h31111.bash

これは、次のコマンドで呼び出すのと同じです。

/bin/bash h31111.bash

上記の場合と同じエラーメッセージが表示される場合は、スクリプトの内容に問題がある可能性があります。bashスクリプトのどこで問題が発生したかを把握するには、とを使用できset -xます set -v

set -x拡張 set -vが表示され、読み取られる前に行が表示されます

したがって、スクリプトの内容を次のように変更します。

#!/bin/bash
set -x
set -v
/usr/bin/php /opt/eposdatatransfer/public/h3111142_58_2012-07-17_16-03-58.php

おそらく経験によってのみ学ぶ別の可能性は、ファイルがMSDOSモードになっていることです(つまり、LFだけでなくCR LFがあります)。これは、(SFTPではなく)FTPをまだ使用していてASCIIモードの場合によく発生します。転送モードをバイナリに設定して、すべてを正常に機能させることができる場合があります。そうでない場合は、いくつかのオプションがあります。次の行のいずれかが機能するはずです。

dos2unix /path/to/your/file
sed -i 's/\r//g' /path/to/your/file
tr -d '\r' < /path/to/your/file > /path/to/temp/file && mv /path/to/temp/file /path/to/your/file

Vimでは:set ff=unix、ファイルを保存してフォーマットを変更することもできます。

PHPにあるものを見てみましょう:

$handle = fopen($batchFile, 'w');
$data = "#!/bin/bash
/usr/bin/php /opt/eposdatatransfer/public/$file 
";

複数行の文字列があるため、埋め込まれるCR LF文字は、PHPファイルがWindows形式かUnix形式かによって異なります。そのファイルをWindows形式に切り替えることができれば、問題はありません。しかし、それは将来壊れやすいように思われるので、私はもう少し不安定なものを選びます:

$handle = fopen($batchFile, 'w');
fwrite($handle, "#!/bin/bash\n");
fwrite($handle, "/usr/bin/php /opt/eposdatatransfer/public/$file\n");
fclose($handle);
于 2012-07-17T16:10:19.647 に答える
0

問題はあなたの $PATH にあるようです。システム上の一部のユーザーは. (現在のディレクトリ) は $PATH にあり、その他はそうではありません。./h31111.bash と入力するとうまくいく場合は、それが問題です。相対パスまたは絶対パスでファイルを指定するか、. そのユーザーの $PATH に追加しますが、 root に対しては決して実行しないでください

于 2012-07-17T17:13:34.143 に答える