Я могу обойти это ограничение с помощью одной маленькой проблемы/побочного эффекта.
Установка параметров UserKnownHostsFile=/dev/null
и StrictHostKeyChecking=no
, вы можете обмануть SSH, фактически не сохраняя или требуя проверки ключа хоста.
Установка StrictHostKeyChecking
no no позволяет подключиться к серверу, не зная или не проверив его ключ; и с использованием /dev/null
для UserKnownHostsFile
просто читает и ничего не пишет, поэтому никакие значения никогда не считываются из сохраненных.
Предостережение состояло в том, что SSH по-прежнему пытается создать каталог .ssh
и выходит из строя, но сбой приводит к предупреждению и продолжит соединение. Предупреждение будет включено в ваш выход (если вы не подавите предупреждения).
Вот пример. Примечание. В этом примере я не настроил аутентификацию, поэтому попытаюсь использовать аутентификацию пароля и выйти из строя, но поскольку вы используете идентификатор, вы должны иметь возможность подключиться просто отлично.
<?php
$ssh_command = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "
."-p 2223 [email protected]";
exec("$ssh_command ls 2>&1", $out);
var_dump($out);
// output when called from browser running as daemon(1)
array(5) {
[0]=>
string(44) "Could not create directory '/usr/sbin/.ssh'."
[1]=>
string(110) "Warning: Permanently added '[host.localdomain]:2223,[192.168.88.20]:2223' (RSA) to the list of known hosts."
[2]=>
string(36) "Permission denied, please try again."
[3]=>
string(36) "Permission denied, please try again."
[4]=>
string(82) "Received disconnect from 192.168.88.20: 2: Too many authentication failures for user"
}
Ваш выход, скорее всего, включать только первое предупреждение о невозможности создать каталог .ssh
, а затем предупреждение о постоянно добавляя хост в список известных хостов (/dev/null
), а затем на выходе из вашей команды; поэтому вам нужно будет проверить, была ли первая строка этой предупреждающей, и сдвинуть ее из массива $out
.
Другое примечание: Это открывает возможность нападений «человек в середине» или взлома DNS/IP, чтобы попытаться подключиться к серверу-изгои.
См. Эту статью от SSH Host Key Protection от Symantec.
Я озадачен. У вас есть причины, кроме вкуса? Стоит ли разделять SSH в сервисе, запущенном под другой учетной записью пользователя, которая принимает конкретные запросы и дает ответы на ваш процесс Apache? – minopret
Основная причина, по которой я не хотел использовать библиотеку PHP SSH2, заключалась в том, что я вообще не хотел иметь дело с PECL. Думаю, решение в принятом ответе является хорошим. – Rafe