Как сканировать предыдущие значения списка, чтобы добавить новое значение составного списка?

ssh следует традиции rsh, используя программу оболочки пользователя из файла пароля для выполнения команд.

Это означает, что мы можем решить эту проблему без какой-либо конфигурации ssh.

Если вы не хотите, чтобы у пользователя был доступ к оболочке, просто замените оболочку этого пользователя скриптом. Если вы посмотрите в /etc/passwd, вы увидите, что есть поле, которое каждому интерпретатору присваивает интерпретатор командной оболочки. Сценарий используется как оболочка как для их интерактивного входа ssh user@host, так и для команд ssh user@host command arg ....

Вот пример. Я создал пользователя foo, чья оболочка является скриптом. Сценарий печатает сообщение my arguments are:, за которым следуют его аргументы (каждый на отдельной строке и в угловых скобках) и завершается. В случае журнала нет аргументов. Вот что происходит:

webserver:~# ssh foo@localhost
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Если пользователь пытается запустить команду, это выглядит так:

webserver:~# ssh foo@localhost cat /etc/passwd
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>

Наша «оболочка» получает вызов стиля -c , с полной командой в качестве одного аргумента, точно так же, как /bin/sh получит ее.

Итак, как вы можете видеть, теперь мы можем продолжить разработку сценария, чтобы он распознал случай когда он был вызван с аргументом -c, а затем анализирует строку (скажем, путем сопоставления шаблонов). Те строки, которые разрешены, могут быть переданы в реальную оболочку путем рекурсивного вызова /bin/bash -c <string>. Случай отклонения может печатать сообщение об ошибке и заканчиваться (включая случай, когда отсутствует -c).

Вы должны быть осторожны, как вы это пишете. Я рекомендую писать только положительные совпадения, которые допускают только очень специфические вещи и запрещают все остальное.

Примечание: , если вы root, вы все равно можете войти в эту учетную запись, переопределив shell в команде su, как su -s /bin/bash foo. (Замените оболочку по выбору.) Не-root не может этого сделать.

Вот пример скрипта: ограничьте использование пользователем только ssh для доступа git к репозиториям в /git.

#!/bin/sh

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  printf "interactive login not permitted\n"
  exit 1
fi

set -- $2

if [ $# != 2 ] ; then
  printf "wrong number of arguments\n"
  exit 1
fi

case "$1" in
  ( git-upload-pack | git-receive-pack )
    ;; # continue execution
  ( * )
    printf "command not allowed\n"
    exit 1
    ;;
esac

# Canonicalize the path name: we don't want escape out of
# git via ../ path components.

gitpath=$(readlink -f "$2")  # GNU Coreutils specific

case "$gitpath" in
  ( /git/* )
     ;; # continue execution
  ( * )
    printf "access denied outside of /git\n"
    exit 1
    ;;
esac

if ! [ -e "$gitpath" ] ; then
   printf "that git repo doesn't exist\n"
   exit 1
fi

"$1" "$gitpath"

Конечно, мы полагаем, что в этих программах Git git-upload-pack и git-receive-pack нет дыр или экранов выходов, которые предоставят пользователям доступ к системе.

присуще такой схеме ограничения. Пользователь аутентифицируется для выполнения кода в определенном домене безопасности, и мы блокируем ограничение для ограничения этого домена на субдомен. Например, если вы разрешаете пользователю запускать команду vim для определенного файла для ее редактирования, пользователь может просто получить оболочку с :!sh[Enter].

6
задан 15002941 1 March 2019 в 23:55
поделиться

1 ответ

Вам нужно только поддерживать текущее состояние для обоих компонентов по мере продвижения вперед по временной шкале.

from functools import reduce

timeLine     = []
workingOrNot = []

states     = [ (item[0],item[1][:2],item[1][2:]) for item in a ]
combined = dict()
for time,component,state in states:
    combined[component] = state
    timeLine.append(time)
    components = "".join(sorted("".join(s) for s in combined.items()))
    workingOrNot.append(components)

обратите внимание, что это было бы проще, если бы ваши идентификаторы компонентов и рабочие состояния были отдельными полями (это, по сути, то, что я должен был сделать перед обработкой данных)

0
ответ дан Alain T. 1 March 2019 в 23:55
поделиться