【问题标题】:Unable to request pseudo-terminal无法请求伪终端
【发布时间】:2016-01-14 10:21:27
【问题描述】:

我正在尝试连接到 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
    }
  }

我 100% 确定主机、密码和登录名是正确的。因为我可以通过 WinSCP 用这个输入访问服务器。然而,这是我得到的回应:

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

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

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

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

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

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

NET_SSH2_MSG_USERAUTH_SUCCESS

还有

NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION and NET_SSH2_MSG_CHANNEL_EXTENDED_DATA

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

NET_SSH2_MSG_DISCONNECT

请问,谁能告诉我为什么会这样?提前谢谢你:-)

P.S:我无法控制我尝试连接的 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_SSH2_MSG_KEXINIT (since last: 0.1568, network: 0.0003s)
00000000  p.p ._!...I.$p}.
00000010  ....ecdh-sha2-ni
00000020  stp256,ecdh-sha2
00000030  -nistp384,ecdh-s
00000040  ha2-nistp521,dif
00000050  fie-hellman-grou
00000060  p-exchange-sha25
00000070  6,diffie-hellman
00000080  -group-exchange-
00000090  sha1,diffie-hell
000000a0  man-group14-sha1
000000b0  ,diffie-hellman-
000000c0  group1-sha1,rsa1
000000d0  024-sha1....ssh-
000000e0  rsa,ssh-dss....a
000000f0  es256-ctr,aes192
00000100  -ctr,aes128-ctr,
00000110  aes256-cbc,aes19
00000120  2-cbc,aes128-cbc
00000130  ,blowfish-ctr,bl
00000140  owfish-cbc,cast1
00000150  28-cbc,arcfour25
00000160  6,arcfour128,3de
00000170  s-ctr,3des-cbc..
00000180  ..aes256-ctr,aes
00000190  192-ctr,aes128-c
000001a0  tr,aes256-cbc,ae
000001b0  s192-cbc,aes128-
000001c0  cbc,blowfish-ctr
000001d0  ,blowfish-cbc,ca
000001e0  st128-cbc,arcfou
000001f0  r256,arcfour128,
00000200  3des-ctr,3des-cb
00000210  c...jhmac-sha2-2
00000220  56,hmac-sha2-512
00000230  ,hmac-sha1,hmac-
00000240  sha1-96,hmac-md5
00000250  ,hmac-md5-96,hma
00000260  c-ripemd160,umac
00000270  -64@openssh.com.
00000280  ..jhmac-sha2-256
00000290  ,hmac-sha2-512,h
000002a0  mac-sha1,hmac-sh
000002b0  a1-96,hmac-md5,h
000002c0  mac-md5-96,hmac-
000002d0  ripemd160,umac-6
000002e0  4@openssh.com...
000002f0  .none....none...
00000300  ..........

-> NET_SSH2_MSG_KEXINIT (since last: 0.0148, network: 0s)
00000000  .......]H.0fFwBZ
00000010  ...~diffie-hellm
00000020  an-group1-sha1,d
00000030  iffie-hellman-gr
00000040  oup14-sha1,diffi
00000050  e-hellman-group-
00000060  exchange-sha1,di
00000070  ffie-hellman-gro
00000080  up-exchange-sha2
00000090  56....ssh-rsa,ss
000000a0  h-dss....arcfour
000000b0  256,arcfour128,a
000000c0  es128-ctr,aes192
000000d0  -ctr,aes256-ctr,
000000e0  twofish128-ctr,t
000000f0  wofish192-ctr,tw
00000100  ofish256-ctr,aes
00000110  128-cbc,aes192-c
00000120  bc,aes256-cbc,tw
00000130  ofish128-cbc,two
00000140  fish192-cbc,twof
00000150  ish256-cbc,twofi
00000160  sh-cbc,blowfish-
00000170  ctr,blowfish-cbc
00000180  ,3des-ctr,3des-c
00000190  bc....arcfour256
000001a0  ,arcfour128,aes1
000001b0  28-ctr,aes192-ct
000001c0  r,aes256-ctr,two
000001d0  fish128-ctr,twof
000001e0  ish192-ctr,twofi
000001f0  sh256-ctr,aes128
00000200  -cbc,aes192-cbc,
00000210  aes256-cbc,twofi
00000220  sh128-cbc,twofis
00000230  h192-cbc,twofish
00000240  256-cbc,twofish-
00000250  cbc,blowfish-ctr
00000260  ,blowfish-cbc,3d
00000270  es-ctr,3des-cbc.
00000280  ..9hmac-sha2-256
00000290  ,hmac-sha1-96,hm
000002a0  ac-sha1,hmac-md5
000002b0  -96,hmac-md5...9
000002c0  hmac-sha2-256,hm
000002d0  ac-sha1-96,hmac-
000002e0  sha1,hmac-md5-96
000002f0  ,hmac-md5....non
00000300  e....none.......
00000310  ......

-> NET_SSH2_MSG_KEXDH_INIT (since last: 0.0936, network: 0.0001s)
some data (not sure if safe to share)

<- NET_SSH2_MSG_KEXDH_REPLY (since last: 0.0228, network: 0.0228s)
some data (not sure if safe to share)

-> NET_SSH2_MSG_NEWKEYS (since last: 0.0169, network: 0.0002s)


<- NET_SSH2_MSG_NEWKEYS (since last: 0.0001, network: 0s)


-> NET_SSH2_MSG_SERVICE_REQUEST (since last: 0.0332, network: 0s)
00000000  ....ssh-userauth

<- NET_SSH2_MSG_SERVICE_ACCEPT (since last: 0.026, network: 0.0259s)
00000000  ....ssh-userauth

-> NET_SSH2_MSG_USERAUTH_REQUEST (since last: 0.0004, network: 0.0002s)
00000000  ....username....
00000010  ssh-connection..
00000020  ..password.....p
00000030  assword

<- NET_SSH2_MSG_USERAUTH_SUCCESS (since last: 0.1056, network: 0.1052s)


-> NET_SSH2_MSG_CHANNEL_OPEN (since last: 0.0003, network: 0.0001s)
00000000  ....session.....
00000010  .....@.

<- NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION (since last: 0.0114, network: 0.0001s)
00000000  ................

-> NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0.0003, network: 0.0001s)
00000000  ........subsyste
00000010  m.....sftp

<- NET_SSH2_MSG_CHANNEL_EXTENDED_DATA (since last: 0.018, network: 0.0005s)
00000000  ............Welc
00000010  ome, archive use
00000020  r some-server@
00000030  somevps.nameserve
00000040  r.sk !....The lo
00000050  cal time is: Thu
00000060  Jan 21 09:25:45
00000070  2016....This is
00000080  an experimental
00000090  FTP server.  If
000000a0  you have any un
000000b0  usual problems,.
000000c0  .please report t
000000d0  hem via e-mail t
000000e0  o .someemail.sk
000000f0  >.....

-> NET_SSH2_MSG_DISCONNECT (since last: 0.0006, network: 0.0004s)
00000000  ............

【问题讨论】:

  • 登录失败时不会发生“无法请求伪终端”错误 - 当您尝试通过 exec() + enablePTY() 或尝试初始化 PTY 时会发生此错误做read()/write()。所以,基本上,我想你可能还没有发布你的完整代码。如果你能发布它会很有帮助。谢谢!
  • 您好,您是对的,我刚刚编辑了帖子并添加了我使用的其余代码。希望它能提供更多关于问题所在的信息。
  • @neubert 我刚刚调试了代码,发现这是生成通知的行:!$ssh->login('my_login', 'my_password')。我也会把它放到我的问题的编辑中。

标签: php phpseclib pty ssh2-sftp


【解决方案1】:

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

https://github.com/phpseclib/phpseclib/blob/0.3.0/phpseclib/Net/SSH2.php#L2195

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 是 0.3.0 的 BC,所以我只使用那个版本。如果您升级后仍然有错误,请回到这里。

【讨论】:

  • 您好,我已将 phpseclib 升级到 1.0.1 版。它没有解决问题,只是从同一行代码更改为错误:注意:无法完成频道请求。我试图用谷歌搜索,但找不到任何适合我的解决方案,所以我回来了为您的帮助:-)
  • @Redrif - 如果你能发布日志,那会很有帮助。您可以通过在文件顶部执行define('NET_SSH2_LOGGING', 2) 来获取它们,然后在收到错误后执行echo $ssh-&gt;getLog()。将输出复制/粘贴到 pastebin.com 并在此处发布链接。
  • 好吧,根据您发布的内容,服务器似乎不支持 SFTP。您可以使用任何其他 SFTP 客户端登录吗?例如。 WinSCP 还是 PuTTY 的 pscp?也就是说......在这个阶段,日志可以完全安全地发布。密码替换为“密码”(如果您使用密码验证)。公钥不会被替换,但是公钥又被设计为 /public/ ,所以无论如何这都不是问题。当然,如果有人通过 SFTP 上传文件,您可以从 SSH2 日志中提取文件,但从您发布的内容来看,您似乎还没有达到可以这样做的程度。
  • 看起来你已经去掉了中间的列。该列几乎包含与第三列相同的信息,但它显示的是十六进制编码。但是,有些字符在第三列中被替换为 .。例如。新行、控制字符等。并非所有 ASCII 字符都是可打印的,因此是第二列。 NET_SSH2_MSG_KEXDH_INIT 数据包也可以安全共享。他们正在做 diffie-hellman 密钥交换。窃听者可以看到它的方方面面,但仍然无法猜出双方同意的“秘密”。这就是它的魔力。
  • 更多信息:en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange 基本上,双方可以就对称密钥达成一致,这就是为什么 SSH 被称为 SSH 而不是 SH 或 telnet。但话虽如此,对于诊断您的问题而言,这并不是很重要 - 我只是为了澄清一个误解而提到这一点。
【解决方案2】:

我有同样的问题。 经过一些调试,我发现在目标服务器的 sudoers 配置中启用了requiretty 选项时,会出现错误Unable to request pseudo-terminal。通过禁用这个无用的选项,类突然开始工作。

所以如果你想让你的脚本工作,只需在登录后发出这个命令:

$ssh->enablePTY();

或者你可以在目标服务器中禁用这个无用的选项。 如果您需要在多个服务器上快速禁用,只需运行以下代码:

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

我觉得这很奇怪,因为创建了 SSH2 类是为了通过模拟终端来设置功能齐全的 SSH2 客户端。相反,似乎大多数最新的 linux 发行版都能够识别它只是一个无终端的 shell。

【讨论】:

    【解决方案3】:

    由于我无法使这个脚本工作(仍然不明白为什么它突然停止工作)我更改了代码,所以它使用ssh2 pecl extension,它突然开始工作了。这是实际工作的脚本:

      $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); 
        }
      }
    

    我仍然想知道发生了什么或可能导致该错误的原因。 我希望上面的脚本能帮助任何遇到与我相同的错误的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      相关资源
      最近更新 更多