Как добавить какой-либо символ (или просто добавить новую строку), если числа в тексте не являются непрерывными

Я использую 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 .

7
02.09.2019, 17:42
3 ответа

Не печатать пунктирные линии перед первой строкой, даже если число в первой строке не равно нулю:

$ 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>
1
27.01.2020, 20:14

Вероятно, это далеко не эффективно...

$ 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

4
27.01.2020, 20:14

Я не 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>и увеличьте счетчик.

2
27.01.2020, 20:14

Теги

Похожие вопросы