Не стесняйтесь пропустить этот ответ, если хотите решить проблему с сертификатами. Этот ответ касается туннелирования ssh через брандмауэр, который, на мой взгляд, является лучшим решением для работы с брандмауэрами / прокси-серверами.
Существует лучший способ, чем использование доступа по протоколу http, а именно использование службы ssh, предлагаемой github на порту 443 сервера ssh.github.com.
Мы используем инструмент под названием штопор. Это доступно как для CygWin (через настройку с домашней страницы cygwin), так и для Linux с использованием вашего любимого инструмента упаковки. Для MacOSX это доступно из macports и варится по крайней мере.
Командная строка выглядит следующим образом:
$ corkscrew
Proxyhost и proxyport - это координаты прокси https. Targethost и targetport - это местоположение хоста для туннелирования. Authfile представляет собой текстовый файл с 1 строкой, содержащей имя пользователя и пароль прокси-сервера, разделенные двоеточием
, например:
abc:very_secret
Установка для использования «обычного» протокола ssh для связи git
Добавив это в ~/.ssh/config
, этот трюк можно использовать для обычных соединений ssh.
Host github.com
HostName ssh.github.com
Port 443
User git
ProxyCommand corkscrew %h %p ~/.ssh/proxy_auth
Теперь вы можете проверить его работоспособность, выполнив команду ssh-ging для gitproxy
pti@pti-laptop:~$ ssh github.com
PTY allocation request failed on channel 0
Hi ptillemans! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
pti@pti-laptop:~$
(Примечание: если вы никогда ранее не входили в github, ssh попросит добавить ключ сервера в файл известных хостов. Если вы параноик, рекомендуется проверить отпечаток RSA на тот, который указан на сайте github, куда вы загрузили свой ключ).
Небольшой вариант этого метода - это случай, когда вам нужен доступ к хранилищу с другим ключом, например, отделить вашу личную учетную запись от вашей профессиональной учетной записи.
#
# account dedicated for the ACME private github account
#
Host acme.github.com
User git
HostName ssh.github.com
Port 443
ProxyCommand corkscrew <3128> %h %p ~/.ssh/proxy_auth
IdentityFile ~/.ssh/id_dsa_acme
наслаждайтесь!
Мы используем его уже много лет как на Linux, Mac, так и на Windows.
Если вы хотите, вы можете узнать больше об этом в этом блоге
<?php
$backslash = '\\';
$pattern = <<< PATTERN
#(["'])(?:{$backslash}{$backslash}?+.)*?{$backslash}1#
PATTERN;
foreach(array(
"<?php \$s = 'Hi everyone, we\\'re ready now.'; ?>",
'<?php $s = "Hi everyone, we\\"re ready now."; ?>',
"xyz'a\\'bc\\d'123",
"x = 'My string ends with with a backslash\\\\';"
) as $subject) {
preg_match($pattern, $subject, $matches);
echo $subject , ' => ', $matches[0], "\n\n";
}
печатает
<?php $s = 'Hi everyone, we\'re ready now.'; ?> => 'Hi everyone, we\'re ready now.'
<?php $s = "Hi everyone, we\"re ready now."; ?> => "Hi everyone, we\"re ready now."
xyz'a\'bc\d'123 => 'a\'bc\d'
x = 'My string ends with with a backslash\\'; => 'My string ends with with a backslash\\'
Вот мое решение с тестовыми примерами:
/.*?'((?:\\\\|\\'|[^'])*+)'/
И мое (Perl, но я не использую никаких специфичных для Perl функций, о которых я не думаю) доказательство:
use strict;
use warnings;
my %tests = ();
$tests{'Case 1'} = <<'EOF';
$var = 'My string';
EOF
$tests{'Case 2'} = <<'EOF';
$var = 'My string has it\'s challenges';
EOF
$tests{'Case 3'} = <<'EOF';
$var = 'My string ends with a backslash\\';
EOF
foreach my $key (sort (keys %tests)) {
print "$key...\n";
if ($tests{$key} =~ m/.*?'((?:\\\\|\\'|[^'])*+)'/) {
print " ... '$1'\n";
} else {
print " ... NO MATCH\n";
}
}
Запуск этого показывает :
$ perl a.pl
Case 1...
... 'My string'
Case 2...
... 'My string has it\'s challenges'
Case 3...
... 'My string ends with a backslash\\'
Обратите внимание, что начальный подстановочный знак в начале не должен быть жадным. Затем я использую совпадения без возврата, чтобы проглотить \\ и \ ', а затем все остальное, что не является автономным символом кавычек.
Я думаю, что этот, вероятно, имитирует встроенный подход компилятора, что должно сделать его довольно пулеметным - доказательство.
/.*'([^'\\]|\\.)*'.*/
Часть в скобках ищет символы без апострофов / обратной косой черты и символы с экранированием обратной косой черты. Если можно экранировать только определенные символы, измените \\.
на \\ ['\\ az]
или как там.
Посредством отрицательного просмотра:
/
.*?' #Match until '
(
.*? #Lazy match & capture of everything after the first apostrophe
)
(?<!(?<!\\)\\)' #Match first apostrophe that isn't preceded by \, but accept \\
.* #Match remaining text
/
Regex reg = new Regex("(?<!\\\\)'(?<string>.*?)(?<!\\\\)'");