Как вы прокси через сервер ssh (socks…), используя php CURL? - PullRequest
5 голосов
/ 05 февраля 2010

Я хочу использовать ssh, примерно так:

ssh -D 9999 username@ip-address-of-ssh-server

Но в php CURL, но я не понимаю, как это можно сделать?

Я заметил «CURLPROXY_SOCKS5» как тип на сайте php, но думаю, что это не сработает, так как на самом деле это не носки, это ssh…

Я сейчас использую этот код:

curl_setopt($ch, CURLOPT_PROXY, ‘ip:port'); 

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

Ответы [ 5 ]

4 голосов
/ 21 февраля 2010

Вы можете использовать как libssh2, так и curl из скрипта PHP.

  • Сначала вам нужно получить библиотеку ssh2 с сайта PECL. Кроме того, пакет PEAR также поддерживает SSH2.
  • После установки вы можете прочитать документацию ssh2 по настройке туннеля.
  • В вашем скрипте вы можете настроить туннель.
  • После настройки туннеля в скрипте вы можете указать прокси CURL.
  • Выполните операцию CURL.
  • Освободите туннельный ресурс и закройте соединение в вашем скрипте.

Я не эксперт по PHP, но вот пример:

<?php
$connection = ssh2_connect(ip-address-of-ssh-server, 22);
ssh2_auth_pubkey_file($connection, 'username', 'id_dsa.pub', 'id_dsa');
$tunnel = ssh2_tunnel($connection, '127.0.0.1', 9999);
curl_setopt($ch, CURLOPT_PROXY, ‘127.0.0.1:9999'); 
// perform curl operations

// The connection and tunnel will die at the and of the session.
?>

Самый простой вариант

Другой вариант, который следует рассмотреть, это использование sftp (ftp over ssh) вместо CURL ... это, вероятно, рекомендуемый способ безопасного копирования файла с одного сервера на другой в PHP ...

Еще более простой пример:

<?php
$connection = ssh2_connect(ip-address-of-ssh-server, 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>
2 голосов
/ 05 февраля 2010

в соответствии с manpage -D создает прокси socks.

-D [bind_address:]port
             Specifies a local ``dynamic'' application-level port forwarding.
             This works by allocating a socket to listen to port on the local
             side, optionally bound to the specified bind_address.  Whenever a
             connection is made to this port, the connection is forwarded over
             the secure channel, and the application protocol is then used to
             determine where to connect to from the remote machine.  Currently
             the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
             as a SOCKS server.  Only root can forward privileged ports.  Dy-
             namic port forwardings can also be specified in the configuration
             file.
0 голосов
/ 19 февраля 2010

Чтобы открыть туннель SSH только на время выполнения сценария, вам, вероятно, потребуется использовать PHP-вилки . В одном процессе откройте туннель SSH (-D - вам нужно проделать определенную работу, чтобы убедиться, что вы не сталкиваетесь здесь на портах), а в другом процессе использовать CURL с конфигурацией прокси socks. Когда передача завершена, подайте сигнал на ssh fork, чтобы прервать соединение, чтобы разорвать соединение.

Имейте в виду, что пока туннель открыт, другие пользователи на том же компьютере могут также использовать прокси-сервер на этом порту, если они хотят. Имея это в виду, может быть лучше использовать флаг -L 1234: remotehost: 80 и просто получить URL http://localhost:1234/some/uri

Если что-то пойдет не так, вы можете найти потерянные туннели SSH на вашем сервере, поэтому я бы назвал это несколько хрупким.

0 голосов
/ 17 февраля 2010

См. Мой комментарий к предложенному Qwerty решению. Я думаю, что вы смотрите в неправильном направлении, чтобы попытаться решить этот вопрос. Вместо этого вы должны просто использовать cURL и создать персональный сертификат для себя. Вы говорите, что хотите использовать SSH для безопасности, но почему бы не сертификат?

Этот сайт позволит вам легко создать http://www.cacert.org/

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

0 голосов
/ 14 февраля 2010

Вы можете использовать модуль ssh2 и функцию ssh2_tunnel для создания туннеля ssh через удаленный сервер.Доступные примеры: http://www.php.net/manual/en/function.ssh2-tunnel.php

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