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'也可以。IE,

 $ 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 -xand 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 模式(即,具有 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);
于 2012-07-17T16:10:19.647 回答
0

在我看来,问题出在你的 $PATH 上。系统上的一些用户将拥有. (当前目录)在他们的 $PATH 和其他人不会。如果输入 ./h31111.bash 有效,那么这就是你的问题。您可以使用相对或绝对路径指定文件,也可以添加 . 到该用户的 $PATH ,但永远不要为 root 这样做

于 2012-07-17T17:13:34.143 回答