Как насчет команды, как показано ниже:
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
их не нашел.
Довольно плохой способ сделать это с низким -разрешением — проверить наличие переменных сеанса 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
Вы можете проверить, совпадает ли имя процесса родительского 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
)