PHP SSH2:超过30秒的最大执行时间

I have a portable version of Apache and php7 on windows phpseclib1.0.7 . I wanted to expand the lib in order to utilize ssh. using the stock script from the website for testing

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('-Redacted-');
if (!$ssh->login('-Redacted-', '-Redacted-')) {
    exit('Login Failed');
}

echo $ssh->read('username@username:~$');
$ssh->write("sudo ls -la
");
$output = $ssh->read('#[pP]assword[^:]*:|username@username:~\$#', 
NET_SSH2_READ_REGEX);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
    $ssh->write("password
");
    echo $ssh->read('username@username:~$');
}
?>

Even with the lack of information it should throw an error but instead it gives me

PHP Fatal error:  Maximum execution time of 30 seconds exceeded in 
C:\Users\-Redacted-\Desktop\Apache2.2\htdocs\Net\SSH2.php on line 2358

Here is the SSH2.php starting at line 2351

if (isset($this->keyboard_requests_responses)) {
for ($i = 0; $i < $num_prompts; $i++) {
if (strlen($response) < 4) {
return false;
}
extract(unpack('Nlength', $this->_string_shift($response, 4)));
// prompt - ie. "Password: "; must not be empty
Line 2358----  $prompt = $this->_string_shift($response, $length);
//$echo = $this->_string_shift($response) != chr(0);
foreach ($this->keyboard_requests_responses as $key => $value) {
if (substr($prompt, 0, strlen($key)) == $key) {
$responses[] = $value;
break;
}
}
}
}

does anyone have any ideas on how to fix?

doukun1450
doukun1450 2413行:github.com/phpseclib/phpseclib/blob/1.0.7/phpseclib/Net/...
大约 3 年之前 回复
dousaoxiancy199896
dousaoxiancy199896 在第2413行,有这样的说法:“也许phpseclib应该在x请求/响应之后强制关闭连接?除非这样做,否则可能会有无限循环的请求/响应。我认为这是问题。密码失败所以phpseclib所以phpseclib正在尝试使用键盘交互式身份验证。但服务器没有响应NET_SSH2_MSG_USERAUTH_FAILURE或NET_SSH2_MSG_USERAUTH_SUCCESS-它一遍又一遍地响应NET_SSH2_MSG_USERAUTH_INFO_REQUEST,所以phpseclib正在循环。我会看看我是否可以放入PR来改变这个。
大约 3 年之前 回复
dongmuyan5638
dongmuyan5638 phpseclib1.0.7-----第2358行$prompt=$this->_string_shift($response,$length);
大约 3 年之前 回复
douvcpx6526
douvcpx6526 两件事情会有所帮助。(1)你在运行什么版本的phpseclib?我不知道第2358行是什么,我检查了1.0.0-1.0.7并没有找到它可以超时的2358行。另外,(2)你可以发布日志文件吗?您可以通过在文件顶部执行define('NET_SSH2_LOGGING',2)然后再使用$ssh->getLog()来获取它。由于目前尚不清楚它是什么线路超时,我试图在尝试获取日志之前首先解决这个问题。就像也许回应'THISFAR';在每个$ssh->read()之后或者看看哪一个被调用...
大约 3 年之前 回复
dqce48404
dqce48404 putty适用于远程主机。
大约 3 年之前 回复
dongrao9454
dongrao9454 你确定你的服务器ssh打开了吗?
大约 3 年之前 回复
doulu1867
doulu1867 你能ping远程主机吗?
大约 3 年之前 回复

1个回答

I think you can't reach www.domain.tld, first of all, you have to be sure that www.domain.tld is reachable from your system. you can wrap your code in a try-catch block to get an error

<?php
include('Net/SSH2.php');
try{
 $ssh = new Net_SSH2('-redacted-');
 if (!$ssh->login('-redacted-', '-redacted-')) {
     exit('Login Failed');
      }

 echo $ssh->read('username@username:~$');
 $ssh->write("sudo ls -la
");
 $output = $ssh->read('#[pP]assword[^:]*:|username@username:~\$#', 
 NET_SSH2_READ_REGEX);
 echo $output;
 if (preg_match('#[pP]assword[^:]*:#', $output)) {
     $ssh->write("password
");
     echo $ssh->read('username@username:~$');
 }catch(\Exception $ex){echo "You got an error".$ex->getMessage();}
?>

if your are sure that host is reachable you can expand maximum timout like this :

ini_set('max_execution_time', 300);

if you are sure that your host is correct you can check that your host ssh port is open and work correclty?

dqingn8836
dqingn8836 - 看到PuTTY日志会很有趣 - 你可以通过PuTTY - > Session - > Logging并检查“SSH packets”单选按钮来获取它们。 然后像往常一样连接。 我知道问题是什么(除其他外,涉及您使用错误的PW登录),但日志将有助于确认这一点。
大约 3 年之前 回复
dqc2017
dqc2017 我留下了信息通用,因为我不允许给出连接细节。 我可以腻子主人好。
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问