1

当我尝试在我的 debian 上从 php5 执行程序时,网页冻结并且程序什么也不做。当我从命令行调用它时,此脚本有效。安全模式被禁用。Echo stdout 不起作用(因为冻结)。我在谷歌阅读了一些关于 www 权限的答案,但如果这里有人有一个快速简单的回应......

如何调试这个?

php 调用

exec("expect scripts/sshtest.exp $module");

脚本代码(我在这里找到http://bash.cyberciti.biz/security/expect-ssh-login-script/

#!/usr/bin/expect -f
# set Variables
set module [lrange $argv 0 0]
set timeout -1
# rsync 
spawn rsync -aCb --progress --delete --backup-dir=/var/www/blabla.com/rsyncBackups/BackupedFilesFromServer23_on_  /var/www/blabla/$module  -e ssh root@10.10.10.10:/root/$module
match_max 1000000
# Look for passwod prompt
expect "*?assword:*"
# Send password 
send -- "THEPASSWORD\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
4

8 回答 8

1

尝试

passthru("expect scripts/sshtest.exp $module 2>&1");

2>&1重定向stderrstdout和使用而passthru不是exec将为您提供所有输出。

于 2009-06-22T11:20:40.223 回答
1

为什么要使用期望?设置 rsync 以使用公钥/私钥(请参阅http://troy.jdmz.net/rsync/index.html),您不必使用 expect 来输入密码。

于 2009-06-29T12:36:26.053 回答
1

我遇到了同样的问题,这让我发疯了。我参加聚会有点晚了,但我想我会发布解决我问题的解决方案,以防其他人遇到这个线程并遇到同样的问题。

我的症状和OP一样。我会运行 PHP 脚本,它会通过 shell_execute 启动 Expect 脚本,然后它会永远挂起。问题原来是由于 Expect 脚本运行时向 apache 用户询问的以下问题:

无法确定主机'xx.xx.xx.xx(xx.xx.xx.xx)'的真实性。RSA 密钥指纹为 xxxxx。您确定要继续连接(是/否)?

当我从命令行运行脚本时,我不会想到这个问题,因为我相信如果主机添加到主机列表中,这个问题只会被问一次。

为了解决这个问题,我在输入密码的位置之前添加了这段代码:

expect "*you sure you want to continue*"
send -- "yes\r"

这导致了这个(我让我的 PHP 脚本返回了 Expect 脚本的所有输出):

无法确定主机'xx.xx.xx.xx(xx.xx.xx.xx)'的真实性。RSA 密钥指纹为 xxxxx。您确定要继续连接(是/否)?是 未能将主机添加到已知主机列表 (/var/www/.ssh/known_hosts)。

但是,紧接着密码提示出现并且密码输入正确。从那时起,Expect 脚本运行良好。

于 2010-12-15T02:44:18.123 回答
0
  1. 如果您使用 exec 而不是 passthru,请按以下方式执行: exec("/bin/bash -c 'command' > logfile_to_read_or_include_next");

  2. 如果你想用衍生的进程弄乱你的系统:

编写一个 perl/c 脚本,它将处理您的请求。

#!/usr/bin/perl -w
use HTTP::Daemon;
use HTTP::Status;
use strict;
  my $d = HTTP::Daemon->new(LocalPort => 10050) || die;
  print "Please contact me at: <URL:", $d->url, ">\n";
  while (my $c = $d->accept) {
      while (my $r = $c->get_request) {
          if ($r->method eq 'GET' and $r->uri->path =~/addRequest-(.*)$/) {
                # variable $1 now has your request.
                 my $rq = $1; # wash me!
                # assign it a #ID, 
                 my $id = "id".time().rand(100);
                 &run_in_another_thread($rq,$id);
              $c->send_responce($id);
          } elsif ($r->method eq 'GET' and $r->uri->path =~/seeRequest-(.*)$/) {
             $c->send_responce( &get_result_for_id($1) );
          }
          else {
              $c->send_error(RC_FORBIDDEN)
          }
      }
      $c->close;
      undef($c);
  }
}

sub run_in_another_thread {
 my ($rq,$id) = @_;
 my $evil = threads->create( sub { qx"/bin/bash -c '$rq' > logfile_$id.log" # start process
  }->detach();
}

sub get_result_for_id {
 my ($id) = @_;
 return qx"cat logfile_$id.log";
}

接下来,从您的代码中获取 127.0.0.1/addRequest-expect,然后瞧..

于 2010-09-12T21:41:27.623 回答
0

你在运行 mod___php 还是 suPHP?
mod_php 以 Apache 用户身份运行脚本,因此尝试 su 到 apache 用户,然后从 shell“php scriptname.php”运行 php 脚本并查看它是否正常工作。
如果您使用 suPHP,则 su 到您设置 apache 以调整这些脚本的用户,因此使用相同的“php scriptname.php”并检查输出。

于 2009-06-29T12:48:28.887 回答
0

另一个常见的问题是,当您运行命令时,您与 apache 运行命令时的用户不同。通常,出于安全原因,用户 apache 的运行设置非常有限。

例如。apache 用户可能没有安装正确的路径。使用期望的绝对路径,而不是相对路径。您可以通过运行“which expect”来找到它。

尝试“su”到 apache 运行的同一用户(在 apache conf 文件中查找“用户”命令或简单地浏览“ps aux”)并运行该命令,看看你得到了什么错误。

于 2009-06-29T12:27:17.383 回答
0

PHP 用于执行命令的“用户”或“组”可能没有足够的权限来执行脚本中的一个 cmd(甚至期望自己)。您是否尝试过使用sudo以与您测试过的用户相同的身份运行脚本?

于 2009-06-29T12:27:34.730 回答
0

在输入下一个命令之前要等待足够长的时间,并且所有变量都是正确的。Greg 关于使用 2>&1 的指示为我省去了很多麻烦。

尝试运行

passthru("expect -d scripts/sshtest.exp $module");

-d 将在期望中挽救您的生命。

于 2010-09-12T21:27:43.917 回答