/usr/bin/env вопросы относительно строки хижины pecularities

Согласно документу не поддерживается загрузка и импорт сертификата после ввода пользователем имени пользователя и пароля. Первые два шага всегда:

Клиент отправляет запрос аутентификации по каналу SSL / TLS. Во время рукопожатия SSL / TLS сервер и клиент обмениваются своими сертификатами x.509 / v3

< / blockquote>

Поэтому конфигурация в standalone.xml должна быть только «ЗАПРОШЕНА». Без реального понимания я изменил его на «ТРЕБУЕМЫЙ», который всегда запрашивает сертификат клиента. Если у клиента нет этого, это терпит неудачу. С «REQUESTED» сертификат клиента является необязательным.

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    ....
    <server name="default-server">
        <https-listener name="default"
                        socket-binding="https"
                        security-realm="ssl-realm"
                        verify-client="REQUESTED"/>
    </server>
</subsystem>
6
задан pi. 9 December 2008 в 11:58
поделиться

2 ответа

В первую очередь, необходимо очень редко использовать $* и необходимо почти всегда использовать "$@" вместо этого. Существует много вопросов здесь по ПОЭТОМУ, которые объясняют входы и выходы почему.

Второй - env команда имеет два основного использования. Нужно распечатать текущую среду; другой должен полностью управлять средой команды, когда она выполняется. Третье использование, которое Вы демонстрируете, должно изменить среду, но откровенно нет никакой потребности в том - оболочки довольно способны к обработке этого для Вас.

Режим 1:

env

Режим 2:

env -i HOME=$HOME PATH=$PREPENDPATH:$PATH ... command args

Эта версия отменяет все наследованные переменные среды и выполнения command с точно средой установлен опциями ENVVAR=value.

Третий режим - исправление среды - менее важно, потому что можно сделать тот штраф с регулярными (цивилизованными) оболочками. (Который означает "не оболочку C" - снова, существуют другие вопросы на ТАК с ответами, которые объясняют это.), Например, Вы могли отлично сделать:

#!/bin/bash
export PATH=${PREPENDPATH:?}:$PATH
exec python "$@"

Это настаивает это $PREPENDPATH установлен на непустую строку в среде и затем предварительно ожидает его к $PATH, и экспортирует новую установку PATH. Затем с помощью то, который новый ПУТЬ, это выполняет python программа с соответствующими аргументами. exec заменяет сценарий оболочки python. Обратите внимание, что это очень отличается от:

#!/bin/bash
PATH=${PREPENDPATH:?}:$PATH exec python "$@"

Поверхностно, это - то же. Однако это выполнится python найденный на существующем ранее ПУТИ, хотя с новым значением ПУТИ в среде процесса. Так, в примере Вы закончили бы тем, что выполнили Python от /usr/bin а не тот от /home/pi/prepend/bin.

В Вашей ситуации я, вероятно, не использовал бы env и просто использовал бы соответствующий вариант сценария с явным экспортом.

env команда необычна, потому что она не распознает, что двойной тире разделяет опции от остальной части команды. Это частично, потому что это не выбирает много вариантов, и частично потому что не ясно, должны ли опции ENVVAR=value прибыть прежде или после двойного тире.

У меня на самом деле есть ряд сценариев для выполнения (различные версии) сервер базы данных. Эти сценарии действительно используют env (и набор программ собственной разработки) для управления средой сервера:

#!/bin/ksh
#
# @(#)$Id: boot.black_19.sh,v 1.3 2008/06/25 15:44:44 jleffler Exp $
#
# Boot server black_19 - IDS 11.50.FC1

IXD=/usr/informix/11.50.FC1
IXS=black_19
cd $IXD || exit 1

IXF=$IXD/do.not.start.$IXS
if [ -f $IXF ]
then
    echo "$0: will not start server $IXS because file $IXF exists" 1>&2
    exit 1
fi

ONINIT=$IXD/bin/oninit.$IXS
if [ ! -f $ONINIT ]
then ONINIT=$IXD/bin/oninit
fi

tmpdir=$IXD/tmp
DAEMONIZE=/work1/jleffler/bin/daemonize
stdout=$tmpdir/$IXS.stdout
stderr=$tmpdir/$IXS.stderr

if [ ! -d $tmpdir ]
then asroot -u informix -g informix -C -- mkdir -p $tmpdir
fi

# Specialized programs carried to extremes:
#   * asroot sets UID and GID values and then executes
#   * env, which sets the environment precisely and then executes
#   * daemonize, which makes the process into a daemon and then executes
#   * oninit, which is what we really wanted to run in the first place!
# NB: daemonize defaults stdin to /dev/null and could set umask but
#     oninit dinks with it all the time so there is no real point.
# NB: daemonize should not be necessary, but oninit doesn't close its
#     controlling terminal and therefore causes cron-jobs that restart
#     it to hang, and interactive shells that started it to hang, and
#     tracing programs.
# ??? Anyone want to integrate truss into this sequence?

asroot -u informix -g informix -C -a dbaao -a dbsso -- \
    env -i HOME=$IXD \
        INFORMIXDIR=$IXD \
        INFORMIXSERVER=$IXS \
        INFORMIXCONCSMCFG=$IXD/etc/concsm.$IXS \
        IFX_LISTEN_TIMEOUT=3 \
        ONCONFIG=onconfig.$IXS \
        PATH=/usr/bin:$IXD/bin \
        SHELL=/usr/bin/ksh \
        TZ=UTC0 \
    $DAEMONIZE -act -d $IXD -o $stdout -e $stderr -- \
    $ONINIT "$@"

case "$*" in
(*v*) track-oninit-v $stdout;;
esac
6
ответ дан 10 December 2019 в 00:45
поделиться

Необходимо тщательно прочитать статью Википедии о хижине.

Когда Ваша система видит, что магическое число соответствует хижине, это делает execve на данном пути после хижины и дает сам сценарий как аргумент.

Ваш сценарий перестал работать, потому что файл Вы даете (/usr/bin/env.1) не исполняемый файл, но начинает себя хижиной....

Идеально, Вы могли разрешить его использование... env на Вашем сценарии с этой строкой как хижина:

#!/usr/bin/env /usr/bin/env.1 python

Это не будет работать, хотя на Linux, поскольку это рассматривает"/usr/bin/env.1 python"как путь (это не разделяет аргументы),

Таким образом, единственный способ, которым я вижу, состоит в том, чтобы записать Ваш env.1 в C

Править: кажется, что никто не верит мне ^^, таким образом, я записал простое и грязное env.1.c:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


const  char* prependpath = "/your/prepend/path/here:";

int main(int argc, char** argv){
  int args_len = argc + 1;
  char* args[args_len];
  const char* env = "/usr/bin/env";
  int i;

  /* arguments: the same */
  args[0] = env;
  for(i=1; i<argc; i++)
    args[i] = argv[i];
  args[argc] = NULL;

  /* environment */
  char* p = getenv("PATH");
  char* newpath = (char*) malloc(strlen(p)
                 + strlen(prependpath));
  sprintf(newpath, "%s%s", prependpath, p);
  setenv("PATH", newpath, 1);

  execv(env, args);
  return 0;
}
4
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

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