以用户apache运行bash脚本时找不到命令

时间:2012-07-17 15:59:11

标签: linux apache bash

我正在尝试以用户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脚本,文件是php文件。这些根据webapp中的用户输入自动获取。我的webapp在linux上运行。

4 个答案:

答案 0 :(得分:2)

我猜你从windows机器上传了脚本,并没有从行尾删除回车。这导致了#!机制(大多数脚本的第一行)失败,因为它搜索#!/ some / interpreter ^ M,这很少存在。

如果你有回车,你可以使用fromdos或者

来剥离回车
tr -d '\015' < /path/to/script > /tmp/script; chmod 755 /tmp/script; mv /tmp/script /path/to/script

答案 1 :(得分: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)没有安装,有关此信息,请参阅this page

答案 2 :(得分:0)

由于你不确定失败的地方,我们试着找出答案。

首先,你能执行该程序吗?

./h31111.bash

这应该相当于用:

调用它
/bin/bash h31111.bash

如果上面给出了相同的错误消息,那么脚本内容可能会出现问题。要确定bash脚本中哪些内容出错,您可以使用set -xset -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模式(即,具有CR LF而不仅仅是LF)。如果您仍然使用FTP(而不是SFTP)和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);

答案 3 :(得分:0)

在我看来问题是你的$ PATH。系统中的某些用户将在$ PATH中使用(当前目录),而其他用户则不会。如果输入./h31111.bash有效,那就是你的问题。您可以使用相对路径或绝对路径指定文件,也可以添加。到该用户的$ PATH 但从未对root用户