Есть ли способ определить, был ли запущен удаленный сценарий из локальной или удаленной оболочки?

Как насчет команды, как показано ниже:

 grep -Fvf <(find * -type f \( -name "2017-07-02-00" $(printf " -o -name %s" 2017-07-02-{01..23}) \)) \
           <(printf "%s\n" 2017-07-02-{00..23})
ls
2017-07-02-01  2017-07-02-06  2017-07-02-08  2017-07-02-14  2017-07-02-19
2017-07-02-04  2017-07-02-07  2017-07-02-11  2017-07-02-15  2017-07-02-22

Вывод после выполнения команды:

2017-07-02-00
2017-07-02-02
2017-07-02-03
2017-07-02-05
2017-07-02-09
2017-07-02-10
2017-07-02-12
2017-07-02-13
2017-07-02-16
2017-07-02-17
2017-07-02-18
2017-07-02-20
2017-07-02-21
2017-07-02-23

Выше мы генерируем все возможные 24 файла, используя printfи передаем их в findего -nameпараметр, который printfтакже помогает ей, затем с помощью команды grepмы печатаем, что эти файлы существуют в наш образец , но findих не нашел.

0
19.09.2019, 19:37
2 ответа

Довольно плохой способ сделать это с низким -разрешением — проверить наличие переменных сеанса SSH:

SSH_CLIENT='10.10.11.11 48052 22'
SSH_CONNECTION='10.10.11.11 48052 10.20.30.40 22'
SSH_TTY=/dev/pts/2

Однако ненадежный пользователь на удаленной машине может легко подделать такие переменные, а затем запустить скрипт.

Лучший способ, который я могу придумать, чтобы гарантировать, что сценарий не может быть запущен в собственной оболочке на удаленной машине, — это не хранить сценарий на удаленной машине. Вместо этого сохраните его локально на машине, с которой выssh-загружаете :

.
ssh user@host bash < /local/path/to/script.sh
1
28.01.2020, 02:22

Вы можете проверить, совпадает ли имя процесса родительского pid скрипта sshd.

напр. где-то в начале сценария (сразу после строки #!— хорошее место):

#!/bin/bash

if [ "$(ps h -o comm -p "$PPID")" != "sshd" ] ; then 
  echo "This script can only be run directly from ssh." > /dev/stderr
  exit 1
fi

Здесь используется встроенная в bash -переменная "$PPID", доступная только для чтения. Он автоматически определяется в каждом экземпляре bash.

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

Кроме того, имена процессов легко подделываются. Было бы легко написать скрипт-оболочку, который перед запуском скрипта задавал бы имя процесса sshd.


Если вы обеспокоены тем, что другие пользователи могут запускать ваш сценарий, рассматривали ли вы возможность установить разрешения для сценария таким образом, чтобы только владелец сценария мог читать или выполнять его? (напр.chmod 700 /path/to/script)

2
28.01.2020, 02:22

Теги

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