Я использую CentOS6.x с yum -3.2.29 -81, curl/libcurl 7.19.7 -53 и имею ту же проблему. У меня есть серверы yum за брандмауэром, и я хочу использовать yum поверх настройки прокси-сервера SOCKS5 с использованием ssh. В идеале я хочу сделать это, не требуя tsocks, proxychains или любых других утилит «socksification».
Я устанавливаю соединение SOCKS5 с помощью:
ssh -D 40000 dmz-server
Я порылся в исходниках yum python и увидел, что они используют pycurl, который обертывает libcurl (также обратите внимание, что все переменные среды прокси --http _proxy, HTTP _PROXY, все _proxy, ВСЕ _ПРОКСИ и т. д. --были изначально не определены ). Кроме того, я убедился, что ~/.curlrc был пуст, поэтому результаты моего теста не испортились.
Я хотел посмотреть, смогу ли я заставить curl разговаривать через прокси socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
успешно вернул удаленную веб-страницу, так что это был хороший знак, --показывающий, что libcurl может использовать прокси-серверы SOCKS5. Однако определение переменной окружения
http_proxy=socks5://127.0.0.1:40000
не хватило:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
не удалось.
В этот момент я переключился на использование тестовой программы Python test.py:
import pycurl
import sys
sys.stderr.write("Testing %s\n" % pycurl.version)
c = pycurl.Curl()
c.setopt(c.URL, 'http://some-server/some-url')
c.setopt(c.WRITEFUNCTION, sys.stdout.write)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()
c.close()
Теперь бегом
./test.py
не удастся получить, но работает
http_proxy=socks5://127.0.0.1:40000./test.py
будет успешно получать http ://какой-то -сервер/некоторый -url . Так что мне кажется, что эта (по общему признанию древняя )комбинация yum/libcurl, поставляемая с CentOS6, неправильно устанавливает тип прокси в libcurl. Я думаю, что происходит то, что PROXYTYPE по умолчанию использует стандартный HTTP-прокси вместо идентификации socks5 :// схемы в URL-адресе, указанном в переменной окружения http _proxy .
В любом случае,следующий патч к /usr/lib/python2.6/site -packages/urlgrabber/grabber.py помог мне получить доступ к http :// репозиториям yum через прокси-сервер SOCKS5. Внутри PyCurlFileObject #_установите _opts (self, opts={} ), добавьте:
if self.scheme == 'http':
proxy = os.getenv('http_proxy') or os.getenv('HTTP_PROXY') or os.getenv('all_proxy') or os.getenv('ALL_PROXY')
if proxy and proxy.find("socks5://") != -1:
self.curl_obj.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
вокруг строки 1205, прямо перед
# ssl options
if self.scheme == 'https':
С этим изменением
http_proxy=socks5://127.0.0.1:40000 yum install
успешно подключается ко всем моим репозиториям http :// yum по другую сторону брандмауэра через ssh-прокси SOCKS5.
Конечно, можно экспортировать переменную окружения http _proxy внутри оболочки, чтобы не указывать ее перед каждым вызовом yum .
Не печатать пунктирные линии перед первой строкой, даже если число в первой строке не равно нулю:
$ cat tst.awk
BEGIN { FS="[<>]+" }
{
curr = $(NF-1)
if ( NR > 1 ) {
for (i=prev+1; i<curr; i++) {
print "-----"
}
}
print
prev = curr
}
$ awk -f tst.awk file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
Вероятно, это далеко не эффективно...
$ tr '<' '\t' < testfile | tr '>' ' ' \
| awk '{ while (NR + shift <= $2) { print "-----"; shift++ }; print }' \
| tr '\t' '<' \
| tr ' ' '>'
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
Во-первых, я использую tr
, чтобы получить из файла две разделенные табуляцией -поля.
Во-вторых, я снова использую tr
для замены '>' пробелом, потому что в противном случае моя команда awk завершится ошибкой :-/
Окружающие -профессионалы, вероятно, сейчас посмеются:-)
В-третьих, командаawk
-сравнит количество обработанных строк со вторым полем. Если количество строк меньше, будет напечатан маркер и увеличение shift
, которое добавляется к количеству строк в предыдущем сравнении.
Четвертое и пятое :Я отменяю изменения, сделанные ранее с помощью tr
.
Я черпал вдохновение изhttps://unix.stackexchange.com/a/190707/364705
Я не awk
парень, но это тоже похоже на это. Я всегда открыт для улучшений:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Сначала мы устанавливаем разделитель полей в соответствии с символами <
и >
, поэтому каждая строка разбивается на эти символы. Например, первая строка будет назначена на $1=A
и $2=0
.
Затем мы устанавливаем переменную num=0
. Мы используем его как счетчик строк :Если номер текущей строки $2
больше счетчика строк, выведите ----
, увеличивайте счетчик, повторяйте до тех пор, пока оба значения не сравняются. Затем выведите $1<$2>
и увеличьте счетчик.