无法请求伪终端
Unable to request pseudo-terminal
我正在尝试连接到 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 使用此输入访问服务器。然而,这是我得到的回应:
Notice: Unable to request pseudo-terminal in ***/Net/SSH2.php on line 2195
Notice: Connection closed prematurely in ***/Net/SSH2.php on line 2303
第一次遇到这样的通知。我已经尝试在这里找到答案,但我什么也没找到所以我不得不问。
顺便说一下,每 2-30 秒 sftp 当我通过 WinSCP 连接时出现错误,服务器断开我的连接:
Network error: Software caused connection abort
我可以从日志中说,我得到了
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 ............
所以在您的 post 中您提到了一个 "Notice: Unable to request pseudo-terminal in ***/Net/SSH2.php on line 2195" 错误。在第 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 无法在登录时发出 "Unable to request pseudo-terminal" 错误。如果连 0.3.0 都可以,我会感到惊讶,但我也不想深入研究它的一个古老版本的代码。 1.0.0 是 BC 和 0.3.0,所以我只使用那个版本。如果升级后还是报错post回到这里
因为我无法使这个脚本工作(仍然不明白为什么它突然停止工作)我更改了代码所以它使用 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);
}
}
我仍然想知道发生了什么或可能导致该错误的原因。
我希望上面的脚本能帮助任何遇到与我相同错误的人。
我遇到了同样的问题。
经过一些调试后,我发现在目标服务器的 sudoers 配置中启用 requiretty
选项时,会抛出错误 Unable to request pseudo-terminal
。通过禁用这个无用的选项,class 突然开始工作。
因此,如果您想让您的脚本工作,只需在登录后发出此命令:
$ssh->enablePTY();
或者您可以在目标服务器中禁用这个无用的选项。
如果您需要在多个服务器上快速禁用,只需 运行 这段代码:
sudo sed -e '/requiretty/ s/^#*/#/' -i.bak '/etc/sudoers'
我觉得这很奇怪,因为创建 SSH2 class 是为了通过模拟终端来设置功能齐全的 SSH2 客户端。相反,似乎大多数最新的 linux 发行版都能够识别它只是一个无终端的 shell.
我正在尝试连接到 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 使用此输入访问服务器。然而,这是我得到的回应:
Notice: Unable to request pseudo-terminal in ***/Net/SSH2.php on line 2195
Notice: Connection closed prematurely in ***/Net/SSH2.php on line 2303
第一次遇到这样的通知。我已经尝试在这里找到答案,但我什么也没找到所以我不得不问。
顺便说一下,每 2-30 秒 sftp 当我通过 WinSCP 连接时出现错误,服务器断开我的连接:
Network error: Software caused connection abort
我可以从日志中说,我得到了
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 ............
所以在您的 post 中您提到了一个 "Notice: Unable to request pseudo-terminal in ***/Net/SSH2.php on line 2195" 错误。在第 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 无法在登录时发出 "Unable to request pseudo-terminal" 错误。如果连 0.3.0 都可以,我会感到惊讶,但我也不想深入研究它的一个古老版本的代码。 1.0.0 是 BC 和 0.3.0,所以我只使用那个版本。如果升级后还是报错post回到这里
因为我无法使这个脚本工作(仍然不明白为什么它突然停止工作)我更改了代码所以它使用 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);
}
}
我仍然想知道发生了什么或可能导致该错误的原因。 我希望上面的脚本能帮助任何遇到与我相同错误的人。
我遇到了同样的问题。
经过一些调试后,我发现在目标服务器的 sudoers 配置中启用 requiretty
选项时,会抛出错误 Unable to request pseudo-terminal
。通过禁用这个无用的选项,class 突然开始工作。
因此,如果您想让您的脚本工作,只需在登录后发出此命令:
$ssh->enablePTY();
或者您可以在目标服务器中禁用这个无用的选项。 如果您需要在多个服务器上快速禁用,只需 运行 这段代码:
sudo sed -e '/requiretty/ s/^#*/#/' -i.bak '/etc/sudoers'
我觉得这很奇怪,因为创建 SSH2 class 是为了通过模拟终端来设置功能齐全的 SSH2 客户端。相反,似乎大多数最新的 linux 发行版都能够识别它只是一个无终端的 shell.