【问题标题】:PHPSecLib: Executing scp on remote server to another remote server terminates early?PHPSecLib:在远程服务器上执行 scp 到另一个远程服务器提前终止?
【发布时间】:2015-12-02 15:47:24
【问题描述】:

我正在尝试使用 PHPSecLib 通过 PHP 在两个远程服务器之间复制文件。

在 domain.tld 和 domain2.tld 之间存在 SSH 密钥,并且从 domain.tld 本地执行此 SCP 工作正常。

我的代码的精简版:

echo "Copying file... ";
$ssh = new Net_SSH2('domain.tld');
$ssh->enableQuietMode();
$ssh->login('user','pass');

$ssh->exec("scp /home/file.tar.gz root@domain2.tld:/home/file.tar.gz");
if($ssh->getExitStatus())
    exit("Failed at line: ".__LINE__);

echo "Done!\n";

在上面的示例中,脚本将在 5 秒后完成,并回显“完成!”最后,但是复制还没有完成,还要运行大约 2 分钟。

不幸的是,我希望远程处理以这种方式复制的文件,因此需要等待它完成。

我也使用 PHPSecLib Net_SCP 进行了调查,不幸的是,这无法执行远程 -> 远程复制,我需要避免使用本地服务器作为复制过程的中介(由于距离/带宽限制)。

我尝试使用 $ssh->read() 和 $ssh->write() 重写上述内容,但是由于对这些程序的工作原理了解有限,我没有成功。

有人能帮我解释一下这个问题吗?

【问题讨论】:

  • 如果你手动ssh到第一台服务器,并执行scp命令,它是在后台还是前台运行scp?有点远射!
  • 您可以尝试使用callback 功能吗? phpseclib.sourceforge.net/ssh/examples.html
  • 使用文档中指定的回调,没有回显。
  • 另外,scp 在前台运行。它在目标服务器的 stderr 上显示一行,说明“stdin: is not a tty”,然后显示(假设)基于诅咒的进度条完成。

标签: php ssh copy scp phpseclib


【解决方案1】:

我自己回答了这个问题。 事实证明,如果在默认值内没有收到 STDOUT,Net_SSH2 将自动使 exec 超时。 答案是在 exec 语句之前调用$ssh->setTimeout(60000)(或其他同样荒谬的数字)。

【讨论】:

  • 您也可以通过$ssh->setTimeout(0) 一起禁用超时。
【解决方案2】:

您是否使用公钥验证?如果您使用密码验证,那么您需要一个交互式提示。或者你也可以使用 sourcefile 属性。

我刚刚尝试使用公钥身份验证,效果很好。

【讨论】:

  • 我正在使用公钥认证。
  • 该死的,忘记输入自动帖子了。如原始问题所述,文件 被复制 ,我的问题是脚本在 scp 继续时跳过了 exec 命令(甚至终止)。我在下面的回答中解决了这个问题。
猜你喜欢
  • 2014-11-18
  • 2019-02-12
  • 2017-11-15
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2014-01-04
  • 2016-12-09
相关资源
最近更新 更多