Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法请求伪终端_Php_Phpseclib_Pty_Ssh2 Sftp - Fatal编程技术网

Php 无法请求伪终端

Php 无法请求伪终端,php,phpseclib,pty,ssh2-sftp,Php,Phpseclib,Pty,Ssh2 Sftp,我正在尝试连接到SFTP服务器。代码如下: set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); require_once('Crypt/RSA.php'); require_once('Net/SSH2.php'); require_once('Net/SFTP.php'); $ssh = new Net_SFTP('some.server.com', '22000'); if (!$s

我正在尝试连接到SFTP服务器。代码如下:

  set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
  require_once('Crypt/RSA.php');
  require_once('Net/SSH2.php');
  require_once('Net/SFTP.php');
  $ssh = new Net_SFTP('some.server.com', '22000');
  if (!$ssh->login('my_login', 'my_password')) {
     $log->lwrite('SSh Login Failed');
  }
  $dir = "output/";
  $files = glob($dir . "*.*");

  foreach($files as $file)
  {
    $fileName = substr($file,strrpos($file,"/")+1);
    if (substr($file,-4) == ".asc"){
        $output = $ssh->put('dir/'.$fileName,$file,FTP_ASCII); // FTP_BINARY
    }
  }
我百分之百确信,主机、密码和登录是正确的。因为我可以通过WinSCP使用此输入访问服务器。然而,我得到的回应是:

注意:无法在第2195行的***/Net/SSH2.php中请求伪终端

注意:第2303行的***/Net/SSH2.php中的连接过早关闭

这是我第一次遇到这样的通知。我已经试着在这里找到答案,但我什么也没找到,所以我不得不问

顺便说一句,当我通过WinSCP连接时,sftp服务器每隔2-30秒就会断开我的连接,错误为:

网络错误:软件导致连接中止

我可以从日志中说,我得到了

NET_SSH2_MSG_USERAUTH_SUCCESS

之后会显示欢迎消息(当地时间、实验ftp服务器等)。但在那之后,我得到:

NET_SSH2_MSG_DISCONNECT
那么,谁能告诉我为什么会这样?提前感谢:-)

附言:我无法控制要连接的sftp服务器


编辑: 这是导致问题的线路:

!$ssh->login('my_login', 'my_password')
正如我所说:登录、主机、端口和密码都是100%正确的

EDIT2:提取的日志
00000000 SSH-2.0-mod_sftp
00000010  /0.9.9..
->
00000000 SSH-2.0-phpsecli
00000010 b_1.0(openssl,
00000020 bcmath)。。
NET\u SSH2\u MSG\u KEXINIT(自上次起:0.0148,网络:0s)
00000000……]H.0fFwBZ
00000010…~diffie hellm
000000 20 an-group1-sha1,d
000000 30伊菲·赫尔曼gr
000000 40 oup14-sha1,diffi
00000050电子赫尔曼集团-
00000060交换-sha1,di
00000070菲耶尔曼格罗
00000080 up-exchange-sha2
000000 90 56…ssh rsa,ss
000000 A0 h-dss…ARC4
000000 B0 256,arcfour128,a
000000 C0 es128中心,aes192
000000 D0-中心,aes256中心,
000000 E0 twofish128中心,t
000000 F0 wofish192中心,tw
00000100 ofish256 ctr,aes
00000 110 128 cbc,aes192-c
西元前120年00000,西元前256年
100000 130支128支cbc,两支
00000 140鱼192 cbc,两层
00000150 ish256 cbc,twofi
00000160 sh cbc,河豚-
00000170中心,河豚cbc
00000180,3des中心,3des-c
公元前00000年190月……阿科福尔256
000001a0,arcfour128,aes1
00000 1B0 28 ctr,aes192 ct
000001c0 r,aes256中心,两个
00000 1d0鱼128中心,两层
000001e0 ish192中心,twofi
00000 1F0 sh256中心,aes128
00000200-cbc,aes192 cbc,
00000 210 aes256 cbc,twofi
00000220 sh128 cbc,twofis
00000230 h192 cbc,双鱼
00000 240 256 cbc,双鱼-
00000250 cbc,河豚中心
00000260,河豚cbc,3d
00000 270 es中心,3des cbc。
00000280..9hmac-sha2-256
00000290,hmac-sha1-96,hm
000002A0AC-sha1,hmac-md5
000002b0-96,hmac-md5…9
000002c0 hmac-sha2-256,hm
000002D0AC-sha1-96,hmac-
000002e0 sha1,hmac-md5-96
000002f0,hmac-md5…非
00000300东……无。。。。。。。
00000310  ......
->NET_SSH2_MSG_KEXDH_INIT(自上次起:0.0936,网络:0.0001s)
一些数据(不确定共享是否安全)
NET\u SSH2\u MSG\u NEWKEYS(自上次起:0.0169,网络:0.0002s)
网络请求(自上次起:0.0332,网络:0s)
00000000…ssh userauth
NET\u SSH2\u MSG\u USERAUTH\u请求(自上次:0.0004,网络:0.0002s)
00000000…用户名。。。。
00000010 ssh连接。。
00000020..密码..p
00000030 assword
网络\u SSH2\u消息\u频道\u打开(自上次:0.0003,网络:0.0001s)
00000000…会话。。。。。
00000010  .....@.
净SSH2消息通道请求(自上次起:0.0003,网络:0.0001s)
00000000…….子系统
000000 1000万…平方英尺
.....
->网络断开(自上次:0.0006,网络:0.0004s)
00000000  ............

因此,在您的帖子中,您提到了一个“注意:无法在***/Net/SSH2.php第2195行请求伪终端”错误。第2195行发出该错误的最新版本phpseclib为0.3.0:

0.3.0于2012年年中发布。从那以后,出现了0.3.1、0.3.5、0.3.6、0.3.7、0.3.8、0.3.9和1.0.0版本

因此,我建议您做的第一件事是升级您正在使用的phpseclib版本


当前版本的phpseclib无法在登录时发出“无法请求伪终端”错误。即使是0.3.0,我也会感到惊讶,但我也不想钻研它的古老版本的代码。1.0.0是BC和0.3.0,所以我只使用该版本。如果您在升级后仍有错误,请返回此处。

由于我无法使此脚本正常工作(仍然不理解为什么它突然停止工作),我更改了代码,使其使用,然后它突然开始工作。以下是实际工作的脚本:

  $connection = ssh2_connect('ftp.server.com', port);
  ssh2_auth_password($connection, 'login', 'password');
  $sftp = ssh2_sftp($connection);

  $dir = "/";
  $files = glob($dir . "*.*");

  foreach($files as $file){
    $fileName = substr($file,strrpos($file,"/")+1);
    if (substr($file,-4) == ".asc"){
        ssh2_scp_send($connection, $file, 'dir/'.$fileName); 
    }
  }
我仍然想知道发生了什么,或者是什么可能导致这个错误。 我希望上面的脚本能帮助任何遇到与我相同错误的人。

我也有同样的问题。 在一些调试之后,我发现当目标服务器的sudoers配置中启用了
requirety
选项时,就会抛出错误
无法请求伪终端。通过禁用这个无用的选项,类突然开始工作

因此,如果希望脚本正常工作,只需在登录后发出以下命令:

$ssh->enablePTY();
或者,您可以在目标服务器中禁用此无用选项。 如果需要跨多台服务器快速禁用,只需运行以下代码:

sudo  sed -e '/requiretty/ s/^#*/#/' -i.bak '/etc/sudoers'

我发现这很奇怪,因为创建SSH2类是为了通过对终端进行情感化来设置一个功能齐全的SSH2客户机。相反,大多数最新的linux发行版似乎能够识别它只是一个没有终端的外壳。

登录失败时不会发生“无法请求伪终端”错误-它发生在您尝试初始化PTY时,通过
exec()
+
enablePTY()
或尝试执行
read()操作时
/
write()
。所以,基本上,我认为您可能还没有发布完整的代码。如果你能把它贴出来,那会很有帮助的。谢谢您好,您是对的,我刚刚编辑了这篇文章并添加了我使用的其余代码。希望它能提供更多关于问题所在的信息。@neuberti-ju
$ssh->enablePTY();
sudo  sed -e '/requiretty/ s/^#*/#/' -i.bak '/etc/sudoers'