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]
.
Вам нужно только поддерживать текущее состояние для обоих компонентов по мере продвижения вперед по временной шкале.
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)
обратите внимание, что это было бы проще, если бы ваши идентификаторы компонентов и рабочие состояния были отдельными полями (это, по сути, то, что я должен был сделать перед обработкой данных)