SSH2 не работает на новом сервере

Мы сменили хостинговые компании, и там, где работал ssh2, он больше не работает. У нас включено ssh2 на новом сервере вместе с включенным allow_url_fopen.

Единственная разница, которую я вижу, заключается в том, что старый сервер использовал PHP 5.4.45, а новый сервер использует PHP 5.6.28.

Однако теперь я получаю следующую ошибку. Could not open remote file: ssh2.sftp://Resource id #337/my/directory/file.txt

Вот пример моего кода:

$remote_host = "myhostinfohere";
$remote_port = 22;
$remote_user = "myuser";
$remote_pass = "mypassword";
$remote_dir = "/my/directory/";
$remote_file = 'file.txt';

try {
    $remote_conn = ssh2_connect($remote_host, $remote_port);    
} catch (Exception $e) {
    die("could not connect to ".$remote_host);
}

try {
    ssh2_auth_password($remote_conn, $remote_user, $remote_pass);
} catch (Exception $e) {
    die("Password failed on ".$remote_host);
}

$sftp = ssh2_sftp($remote_conn);

$fetch_string = "ssh2.sftp://$sftp" . $remote_dir . $remote_file;

//If I add this it says it doesn't exists for some reason even though I can see the file if I log in remotely.
$fileExists = file_exists($fetch_string);
if (!$fileExists) { 
    die('File does not exist');
}

$stream = fopen($fetch_string, 'r');

if (!$stream) {
    die("Could not open remote file: " . $fetch_string . "\n");
}

Опять же, этот же код работает на старом сервере, но не на новом сервере. Что мне не хватает? Я могу легко скопировать файл на свой сервер с помощью ssh2_scp_recv(), который отлично работает, поэтому я не уверен, что происходит с функцией fopen().


person MagentoMan    schedule 15.12.2016    source источник
comment
можете ли вы вручную аутентифицироваться с использованием того же пользователя/пароля на новом сервере? существует ли /my/directory/file.txt на новом сервере? Есть ли у него соответствующие разрешения?   -  person ivanivan    schedule 15.12.2016
comment
Я могу вручную аутентифицироваться, и соединение действительно работает. Когда я говорю новый сервер, я имею в виду, где находится скрипт, который используется для вызова другого сервера. Другой сервер, на котором существует файл, вообще не изменился. Просто сервер, на котором размещен вышеуказанный скрипт.   -  person MagentoMan    schedule 15.12.2016
comment
отключите брандмауэр и посмотрите на эффект (сервер, на котором находится скрипт SSH). о, вы уже можете успешно выполнить SSH-запрос, верно? Если это так, то это может быть проблема с правами доступа к файлу, как упоминал @ivanivan.   -  person webDev    schedule 15.12.2016
comment
Какой сервер, тот, на котором размещен вышеуказанный скрипт? К сожалению, я не могу отключить брандмауэр на сервере, содержащем файл.   -  person MagentoMan    schedule 15.12.2016
comment
сервер, на котором находится ваш SSH-скрипт (скрипт выше) ...   -  person webDev    schedule 15.12.2016
comment
У меня возникли проблемы с его отключением, но я запустил его, выполнил скрипт и не увидел никаких ошибок. sudo tail -f /var/log/messages |grep FIREWALL   -  person MagentoMan    schedule 15.12.2016


Ответы (5)


После нескольких часов пробования разных вариантов я наконец наткнулся на это. http://php.net/manual/en/wrappers.ssh2.php

Я изменил это: $fetch_string = "ssh2.sftp://$sftp" . $remote_dir . $remote_file;

На это: $fetch_string = "ssh2.sftp://user:[email protected]" . $remote_dir . $remote_file;

И вуаля, функция fopen() заработала.

Я не уверен, что в более новых версиях они просто устарели от функции ssh2_sftp() или это просто ошибка, подобная упомянутой @billynoah, потому что приведенная выше ссылка даже не использовала ее.

Я знаю, сколько боли это было так, надеюсь, это поможет кому-то еще!

person MagentoMan    schedule 15.12.2016
comment
это довольно круто - я должен попробовать установить php7 / wordpress и посмотреть, поможет ли это. - person billynoah; 16.12.2016
comment
это должно быть помечено как правильный ответ, каким бы странным ни казалось решение - была такая же проблема после перехода с 5.4 на 5.6.30-что-то - ни один из методов ssh2_ * не работал, единственным решением было использовать полный URL-адрес в fopen . - person Cristi; 05.12.2018

Здесь $fetch_string = "ssh2.sftp://$sftp". $remote_dir . $удаленный_файл;

используйте intval($sftp) вместо $sftp

person Chaitenya    schedule 30.03.2017
comment
Это решение работает для меня. Благодаря bugs.php.net/bug.php?id=73597 - person Chaitenya; 30.03.2017

Скорее всего, это связано с этой ошибкой в ​​расширении ssh2, с которой я недавно столкнулся:

https://bugs.php.net/bug.php?id=71376

И что нарушает функциональность обновления ssh2 в Wordpress:

https://core.trac.wordpress.org/ticket/35517

person billynoah    schedule 15.12.2016
comment
Очень интересно. Благодарю вас! Я не видел этого до сих пор. Позвольте мне продолжить копать. - person MagentoMan; 15.12.2016
comment
Я только что убедился, что могу использовать ssh2_scp_recv() для копирования файла на свой сервер, хотя предпочитаю использовать fopen(). Любые идеи? - person MagentoMan; 16.12.2016

Я также столкнулся с той же проблемой, и я много боролся. Для меня это уже исправлено.
Вот что я сделал:
Моя версия PHP: 5.6.25
Скачал последнюю версию php_ssh2.dll с: https://phpfashion.com/php-ssh2-dll-for-php-5-6-and-7-0 (php_ssh2.dll для PHP 5.6 x64)
Заменена php_ssh2.dll в следующем расположении: "C:\ wamp64\bin\php\php5.6.25\ext" и перезапустил все мои службы.

person Ranjit    schedule 07.06.2017

Убедитесь, что служба sftp включена на сервере (Powershell).

person David Lefkon    schedule 09.03.2017