Я пытаюсь подключиться к серверу 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
Это первый раз, когда я столкнулся с таким уведомлением. Я уже пытался найти ответ здесь, но ничего не нашел, поэтому мне пришлось спросить.
Кстати, каждые 2-30 секунд сервер sftp отключает меня, когда я подключаюсь через WinSCP с ошибкой:
Ошибка сети: программное обеспечение вызвало разрыв соединения
Я могу сказать из журнала, что я получаю
NET_SSH2_MSG_USERAUTH_SUCCESS
также
NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION and NET_SSH2_MSG_CHANNEL_EXTENDED_DATA
после чего появляется приветственное сообщение (местное время, экспериментальный FTP-сервер и т. д.). Но после этого я получаю:
NET_SSH2_MSG_DISCONNECT
Так, пожалуйста, кто-нибудь может сказать мне, почему это происходит? Заранее спасибо 🙂
П.С .: У меня нет контроля над сервером sftp, к которому я пытаюсь подключиться.
Это строка, которая вызывает проблему:
!$ssh->login('my_login', 'my_password')
И как я уже сказал: логин, хост, порт и пароль на 100% верны.
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 [email protected].
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 [email protected]...
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 ............
Таким образом, в вашем посте вы упоминаете ошибку «Уведомление: невозможно запросить псевдотерминал в *** / Net / SSH2.php на линии 2195». Последняя версия phpseclib, которая выдает эту ошибку в строке 2195: 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 — это BC с 0.3.0, так что я бы просто использовал эту версию. Если у вас все еще есть ошибка после обновления, вернитесь сюда.
Так как я не смог заставить этот скрипт работать (до сих пор не понимаю, почему он вдруг перестал работать), я изменил код, чтобы он использовал расширение ssh2 pecl и это внезапно начало работать. Вот скрипт, который на самом деле работает:
$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);
}
}
Я все еще хотел бы знать, что случилось или что могло вызвать эту ошибку.
Я надеюсь, что приведенный выше скрипт поможет любому, кто допустил ту же ошибку, что и я.
Я была такая же проблема.
После некоторой отладки я обнаружил, что ошибка Unable to request pseudo-terminal
бросается, когда requiretty
опция включена в конфигурации sudoers целевого сервера. Отключив эту бесполезную опцию, класс неожиданно начинает работать.
Так что если вы хотите, чтобы ваш скрипт работал, просто введите следующую команду после входа в систему:
$ssh->enablePTY();
Или вы можете отключить эту бесполезную опцию на целевом сервере.
Если вам нужно быстро отключить на многих серверах, просто запустите этот кусок кода:
sudo sed -e '/requiretty/ s/^#*/#/' -i.bak '/etc/sudoers'
Мне показалось это странным, потому что класс SSH2 был создан для того, чтобы настроить полнофункциональный клиент SSH2 путем эмуляции терминала. Вместо этого кажется, что большинство современных дистрибутивов Linux способны распознать, что это всего лишь оболочка без терминала.