Как запретить расширению Bash передавать в качестве аргумента файлы, начинающиеся с «-»?

Я думаю, что фокус здесь в том, что вам нужно заставить все три компонента (OpenSSL, ngHTTP и cURL) использовать свежесобранный OpenSSL. Самый простой способ - использовать RPATH, а это -Wl,-rpath,/usr/local/lib, показанный в ударе.

Сборка OpenSSL

OpenSSL не поддерживает CFLAGS, поэтому вам нужно добавить -Wl,-rpath,/usr/local/lib в строку configure. Это объясняет такие флаги, как ec_nistp_64_gcc_128.

Также смотрите Компиляция и установка на вики OpenSSL.

$ wget https://www.openssl.org/source/openssl-1.1.0b.tar.gz
$ tar xzf openssl-1.1.0b.tar.gz

$ cd openssl-1.1.0b
$ ./Configure linux-x86_64 shared no-ssl2 no-ssl3 no-comp enable-ec_nistp_64_gcc_128 -Wl,-rpath,/usr/local/lib
Configuring OpenSSL version 1.1.0b (0x0x1010002fL)
***** Deprecated options: no-ssl2
...
SIXTY_FOUR_BIT_LONG mode
Configured for linux-x86_64.

$ make -j 4
...
$ sudo make install
...

$ /usr/local/bin/openssl version
OpenSSL 1.1.0b  26 Sep 2016

$ ldd /usr/local/bin/openssl 
    linux-vdso.so.1 =>  (0x00007ffcd27e0000)
    libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x00007fe8f8740000)
    libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x00007fe8f8294000)
    ...

CFLAGS и CXXFLAGS

Теперь, когда новый OpenSSL доступен, вам нужны остальные компоненты для его использования. Небольшая проблема ngHTTP использует gcc и g++, поэтому вам нужно настроить CFLAGS и CXXFLAGS.

Лично я не связываюсь с CPPFLAGS, который является флагами для препроцессора языка Си. Это работа драйвера компилятора - передавать их препроцессору, когда это необходимо.

$ export CFLAGS="-I/usr/local/include/ -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lssl -lcrypto"
$ export CXXFLAGS="-I/usr/local/include/ -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lssl -lcrypto"

Сборка nghttp2

Особым пунктом здесь является установка CFLAGS и CXXFLAGS.

$ wget https://github.com/nghttp2/nghttp2/releases/download/v1.16.0/nghttp2-1.16.0.tar.gz
$ tar xzf nghttp2-1.16.0.tar.gz
$ cd nghttp2-1.16.0

$ CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" ./configure
...
    Compiler:
      C compiler:     gcc
      CFLAGS:         -I/usr/local/include/ -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lssl -lcrypto
      LDFLAGS:        
      C++ compiler:   g++
      CXXFLAGS:       -I/usr/local/include/ -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lssl -lcrypto
...
    Libs:
      OpenSSL:        yes (CFLAGS='-I/usr/local/include' LIBS='-L/usr/local/lib -lssl -lcrypto')
    ...

$ make -j 4
...
$ sudo make install
...

Libraries have been installed in:
   /usr/local/lib
...

Build cURL

Здесь нет ничего особенного. cURL тоже будет использовать CFLAGS.

$ wget https://curl.haxx.se/download/curl-7.51.0.tar.gz
$ tar xzf curl-7.51.0.tar.gz

$ cd curl-7.51.0
$ ./configure --help | egrep '(ssl|tls|nghttp2)'
  --enable-tls-srp        Enable TLS-SRP authentication
  --disable-tls-srp       Disable TLS-SRP authentication
  --with-winssl           enable Windows native SSL/TLS
  --without-winssl        disable Windows native SSL/TLS
  --with-darwinssl        enable Apple OS native SSL/TLS
  --without-darwinssl     disable Apple OS native SSL/TLS
  --with-ssl=PATH         Where to look for OpenSSL, PATH points to the SSL
                          installation (default: /usr/local/ssl); when
  --without-ssl           disable OpenSSL
  --with-gnutls=PATH      where to look for GnuTLS, PATH points to the
  --without-gnutls        disable GnuTLS detection
  --with-polarssl=PATH    where to look for PolarSSL, PATH points to the
  --without-polarssl      disable PolarSSL detection
  --with-mbedtls=PATH     where to look for mbedTLS, PATH points to the
  --without-mbedtls       disable mbedTLS detection
  --with-cyassl=PATH      where to look for CyaSSL, PATH points to the
  --without-cyassl        disable CyaSSL detection
  --with-axtls=PATH       Where to look for axTLS, PATH points to the axTLS
  --without-axtls         disable axTLS
  --with-nghttp2=PATH     Enable nghttp2 usage
  --without-nghttp2       Disable nghttp2 usage

$ ./configure --with-ssl=/usr/local --with-nghttp2=/usr/local
checking whether to enable maintainer-specific portions of Makefiles... no
checking whether make supports nested variables... yes
...
checking for egrep... /bin/grep -E
checking for ar... /usr/bin/ar
configure: using CFLAGS: -I/usr/local/include/ -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lssl -lcrypto
...
configure: Configured to build curl/libcurl:

  curl version:     7.51.0
  Host setup:       x86_64-pc-linux-gnu
  Install prefix:   /usr/local
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     no      (--with-zlib)
  GSS-API support:  no      (--with-gssapi)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  IPv6 support:     enabled
  Unix sockets support: enabled
  IDN support:      no      (--with-{libidn2,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/ssl/certs/ca-certificates.crt
  ca cert path:     no
  ca fallback:      no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  PSL support:      no      (libpsl not found)
  HTTP2 support:    enabled (nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP

$ make -j 4
...
$ sudo make install
...

Проверка библиотек

После всех обручей проверьте все. Особенно важен RPATH, чтобы не тратить время на LD_LIBRARY_PATH. -Wl,-rpath,/usr/local/lib гарантирует, что путь с нужными разделяемыми объектами будет набран в исполняемом файле.

$ which curl
/usr/local/bin/curl

$ ldd /usr/local/bin/curl
    linux-vdso.so.1 =>  (0x00007ffcd0ffd000)
    libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x00007f86ad8a4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f86ad4c4000)
    libnghttp2.so.14 => /usr/local/lib/libnghttp2.so.14 (0x00007f86ad293000)
    libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x00007f86ad025000)
    libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x00007f86acb79000)
    /lib64/ld-linux-x86-64.so.2 (0x0000560d3d474000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f86ac95b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f86ac757000)

Наконец:

$ /usr/local/bin/curl -V
curl 7.51.0 (x86_64-pc-linux-gnu) libcurl/7.51.0 OpenSSL/1.1.0b nghttp2/1.16.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL TLS-SRP HTTP2 UnixSockets 

Вы можете очистить:

$ cd ..
$ rm -rf curl-7.51.0* nghttp2-1.16.0* openssl-1.1.0b*
...

14
17.05.2019, 14:32
2 ответа

Во-первых, обратите внимание, что интерпретация аргументов, начинающихся с тире, зависит от запускаемой программы, grepили другой. Оболочка не имеет прямого способа управлять им.

Если вы хотите обрабатывать такие файлы (, а не игнорировать их полностью ), grep, как и большинство программ, распознает --как указание на конец опций, поэтому

grep -r -e "stuff" -- *

сделает то, что вы хотите. -eприсутствует в том случае, если stuffтакже начинается с -.

Кроме того, вы также можете использовать:

grep -r -e "stuff" ./*

Последнее также позволит избежать проблемы, если в текущем каталоге есть файл с именем -. Даже после разделителя --grepинтерпретирует -как стандартный ввод, а ./-— это файл с именем -в текущем каталоге.

43
27.01.2020, 19:50

Чтобы запретить расширению Bash передавать файлы, начинающиеся с «-» , вы можете использовать:

echo [!-]*

Работает переносимо в большинстве оболочек или, специфично для ksh, bash, zsh:

echo !(-*)

Например :в каталоге с этими файлами

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

Отображает только (при условии, что extglobактивен):

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

Но если вы хотите обработать все файлы, сообщая grep, чтобы он не интерпретировал файлы, указанные с помощью -как опции, просто добавьте./:

grep -r "stuff"./*

Или, если есть гарантия, что среди перечисленных файлов не существует файла с именем точно -, (grep будет интерпретировать одинокий -как , прочитанный со стандартного ввода ), вы можете использовать:

grep -r -- "stuff" *
8
27.01.2020, 19:50

Теги

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