Php 无法请求伪终端
我正在尝试连接到SFTP服务器。代码如下: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
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'