Можно ли выполнить команду ssh, не создавая каталог .ssh? - PullRequest
3 голосов
/ 24 февраля 2012

Я пытаюсь запустить команду на удаленном сервере через SSH из сценария PHP. Вот фрагмент:

    $ssh_command = "ssh -F keys/config -o UserKnownHostsFile=keys/known_hosts -i keys/deployment_key -p $ssh_port $r
    $git_fetch = "git --git-dir=$remote_path/.git --work-tree=$remote_path fetch 2>&1";
    exec("$ssh_command '$git_fetch' 2>&1", $out);

Сценарий работает нормально, если я запускаю его из командной строки, потому что он запускается как пользователь с обычной оболочкой входа в систему и собственным каталогом .ssh. Когда я пытаюсь запустить скрипт через веб-интерфейс, он завершается неудачно, потому что SSH не может создать свой каталог .ssh в домашнем каталоге пользователя Apache.

Можно ли использовать SSH без каталога .ssh или есть другая альтернатива для запуска SSH от имени пользователя Apache? Я бы предпочел не создавать папку .ssh для пользователя Apache.

Ответы [ 6 ]

3 голосов
/ 26 февраля 2012

Я бы сделал это с phpseclib, чистой реализацией PHP SSH :

<?php
include('Net/SSH2.php');

$key = new Crypt_RSA();
//$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', $key)) {
    exit('Login Failed');
}

echo $ssh->read('username@username:~$');
$ssh->write("ls -la\n");
echo $ssh->read('username@username:~$');
?>

Единственное, что я могу себе представить, когда люди говорят, что PHP SSH библиотека - это расширение PECL. Я лично рекомендовал бы не использовать это, поскольку это довольно плохо написано. Тот факт, что его трудно установить и плохо поддерживается, требует наличия открытых и закрытых ключей. Для phpseclib требуется только закрытый ключ. Это имеет смысл, потому что закрытые ключи обычно содержат открытый ключ, встроенный в них. Расширение PECL SSH2 требует, чтобы его извлекали отдельно, что глупо.

phpseclib также поддерживает гораздо больше форматов, чем библиотека PECL SSH2. phpseclib поддерживает формат ключей PuTTY, ключи XML-подписей и т. д.

3 голосов
/ 24 февраля 2012

Я могу обойти это ограничение с помощью одной небольшой проблемы / побочного эффекта.

Устанавливая параметры UserKnownHostsFile=/dev/null и StrictHostKeyChecking=no, вы можете обмануть SSH, фактически не сохраняя или не требуя проверкиключ хоста.

Установка StrictHostKeyChecking в no разрешает соединение с сервером без предварительного знания или проверки его ключа;и использование /dev/null для UserKnownHostsFile просто читает и записывает ничего, поэтому никакие значения никогда не читаются из сохраненных.

Предостережение заключалось в том, что SSH все еще пытается создать каталог .ssh и терпит неудачу, но ошибкавыводит предупреждение и будет продолжено соединение.Предупреждение будет включено в ваш вывод (если вы не должны были подавлять предупреждения).

Вот пример.Примечание. В этом примере я не настроил никакой аутентификации, поэтому он попытается использовать аутентификацию пароля и потерпит неудачу, но, поскольку вы используете идентификацию, у вас должно получиться отличное соединение.

<?php
$ssh_command = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "
              ."-p 2223 user@host.localdomain";

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 от Symantec.

0 голосов
/ 27 февраля 2012

Вы можете контролировать, куда ~ / .ssh попадет, используя переменную окружения HOME. Таким образом, вы можете быть уверены, что это не каталог, который обслуживает Apache.

0 голосов
/ 24 февраля 2012

Проблема в том, что первое, что ищет SSH, - это файл конфигурации пользователя. Вы можете использовать флаг -F , чтобы указать местоположение вашего собственного файла конфигурации, который должен решить проблему, хотя я сейчас тороплюсь к работе, поэтому я не проверил это дважды , Вам нужно будет указать местоположение других вещей, таких как файлы идентификации и т. Д., Внутри него, разум. Файл должен иметь правильное владение и разрешения, иначе SSH будет жаловаться.

Тем не менее, использование библиотеки SSH, такой как SSH2, является гораздо лучшим решением для обшивки, если это вообще возможно.

0 голосов
/ 24 февраля 2012

Решение:

НЕ ДЕЛАЙТЕ ЭТОГО.Я годами не использовал PHP, но на любом современном языке программирования общего назначения это был бы огромный WTF.Я заметил, что один пользователь связался с использованием библиотеки PHP SSH2 ... это будет путь, IMHO.

Прыжок в оболочку для выполнения команды должен происходить ТОЛЬКО при создании побочного эффекта, когда результат несущественен.Если вы полагаетесь на это для чего-то важного или если результат команды должен каким-либо образом изменять состояние программы, вам нужно либо найти внутреннюю библиотеку, чтобы справиться с этим, либо расширить язык, чтобы сделать это должным образом через соответствующий Cбиблиотеки.В противном случае вы настраиваете себя на мир боли.

0 голосов
/ 24 февраля 2012

Нет, вам нужен .ssh в доме пользователя при использовании клиента OpenSSH. Этого нельзя избежать - это должна быть функция безопасности, поскольку она содержит встроенные настройки. Просто держите пустой фиктивный каталог - клиент туда не напишет - но вы должны иметь для этого соответствующие разрешения пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...