Безопасные интерпретаторы TCL работают с expect
. Для иллюстрации я создал два сценария: unsafe.exp
, представляющий файл, представленный пользователем, и safe.exp
, который использует безопасный интерпретатор для запуска unsafe.exp
. Вот код unsafe.exp
:
#!/usr/bin/expect
spawn whoami
expect {
"user" { send_user "safe success\n" }
"root" { send_user "unsafe success\n" }
}
Запуск unsafe.exp
от имени root
приводит к
# expect unsafe.exp
spawn whoami
root
unsafe success
Теперь safe.exp
предотвратит использование пользователем опасных команд, таких как spawn
, в то же время предоставив доступ к важным функциям, таким как send
и expect
. Вот код:
#!/usr/bin/expect
# create a safe interpreter
interp create -safe untrusted
# provide it with essetial expect functions
interp alias untrusted send_user {} send_user
interp alias untrusted send {} send
interp alias untrusted expect {} expect
interp alias untrusted interact {} interact
# censor the "spawn" function
# not providing it would be just as safe, but scripts using it would fail
proc safe_spawn {args} {
puts "censored spawn"
}
interp alias untrusted spawn {} safe_spawn
# create a safe process to interact with
spawn sudo -u user whoami
# run unsafe.exp
untrusted invokehidden source unsafe.exp
Запуск safe.exp
от имени пользователя root приводит к
# expect safe.exp
spawn sudo -u user whoami
censored spawn
user
safe success
mv *?"$now" "$now/."
гарантирует, что ваш только что созданный каталог не выбран для перемещения, требуя наличия хотя бы одного символа (?
) перед меткой времени.
Команда find
может фильтровать по типам файлов, а также по именам файлов.
now=$(date '+%Y_%m_%d')
find . -name "*$now" -type f -print0 | xargs -0 mv -t $now/
хотя, возможно, вам нужно подумать о том, есть ли какие-либо странности в именах файлов (например, другие каталоги, содержащие строку даты), прежде чем запускать это на большой партии.