Встречайте утилиту maybe — простой инструмент, который позволяет исследовать команды и узнавать, во всех подробностях, как именно они будут взаимодействовать с файловой системой компьютера при их реальном использовании. При этом исследуемая программа или команда, в режиме испытаний, никакого влияния на систему не оказывает. Вы сами, ознакомившись с отчётом по ней, решите — запускать её по-настоящему или нет.
Как работает maybe?
Разработчик программы рассказывает о ней следующее: «Maybe выполняет процессы под управлением ptrace, с помощью библиотеки python-ptrace. Когда программа перехватывает системный вызов, который приводит к изменениям в файловой системе, она записывает этот вызов в журнал, затем модифицирует регистры процессора для того, чтобы перенаправить вызов на недействительный ID системного вызова (то есть, по сути, превращая этот вызов в пустую операцию). Далее, она устанавливает значение, которое возвращает эта пустая операция, таким образом, что оно указывает на успешное завершение исходного вызова. В результате процесс уверен в том, что всё то, что он пытается сделать, действительно происходит, в то время как в реальности не происходит ничего.»
Тут стоит отметить, что следует проявлять большую осторожность при использовании maybe в любых системах, отказ которых может привести к тяжёлым последствиям. Дело в том, что эта утилита пока ещё блокирует не особенно много системных вызовов, как результат, её использование может привести к сбоям в работе компьютера.
Установка maybe
Прежде чем устанавливать
maybe
, проверьте, установлен ли в вашей системе менеджер пакетов pip
. Если это не так — ниже приведены команды для установки pip
в различных дистрибутивах Linux.В Arch Linux и в других системах, построенных на базе этого дистрибутива, таких, как Antergos и Manjaro Linux,
pip
можно установить так:sudo pacman -S python-pip
В RHEL и CentOS вам поможет следующая последовательность команд:
sudo yum install epel-release
sudo yum install python-pip
В Fedora это можно сделать так:
sudo dnf install epel-release
sudo dnf install python-p
Вот соответствующая команда для Debian, Ubuntu и Linux Mint:
sudo apt-get install python-pip
В SUSE и OpenSUSE используйте следующую команду:
sudo zypper install python-pip
После установки
pip
установите maybe
:sudo pip install maybe
Работа с maybe
Пользоваться
maybe
очень просто. Просто добавьте maybe
перед командой, которую вы хотите исследовать. Вот как это выглядит:$ maybe rm -r ostechnix/
Как видите, я собираюсь удалить папку
ostechnix
и хочу узнать, что произойдёт в моей системе, если будет выполнена вышеприведённая команда. Вот что сообщает об этом maybe
:maybe has prevented rm -r ostechnix/ from performing 5 file system operations:
delete /home/sk/inboxer-0.4.0-x86_64.AppImage
delete /home/sk/Docker.pdf
delete /home/sk/Idhayathai Oru Nodi.mp3
delete /home/sk/dThmLbB334_1398236878432.jpg
delete /home/sk/ostechnix
Do you want to rerun rm -r ostechnix/ and permit these operations? [y/N] y
Оказалось, что команда
rm -r ostechnix/
выполнила бы 5 операций с файловой системой, о чём и сообщила maybe
. Теперь я могу решить, надо ли мне выполнять эти операции или нет. По мне — так это просто замечательная возможность.Вот ещё пример. Я хочу установить Inboxer — настольный клиент для Gmail. Вот что удалось выяснить о соответствующей операции с помощью
maybe
:$ maybe ./inboxer-0.4.0-x86_64.AppImage
fuse: bad mount point `/tmp/.mount_inboxemDzuGV': No such file or directory
squashfuse 0.1.100 (c) 2012 Dave Vasilevsky
Usage: /home/sk/Downloads/inboxer-0.4.0-x86_64.AppImage [options] ARCHIVE MOUNTPOINT
FUSE options:
-d -o debug enable debug output (implies -f)
-f foreground operation
-s disable multi-threaded operation
open dir error: No such file or directory
maybe has prevented ./inboxer-0.4.0-x86_64.AppImage from performing 1 file system operations:
create directory /tmp/.mount_inboxemDzuGV
Do you want to rerun ./inboxer-0.4.0-x86_64.AppImage and permit these operations? [y/N]
Если в ходе исследования некоей команды не удаётся обнаружить операций с файловой системой,
maybe
выведет нечто похожее на это:$ maybe sudo pacman -Syu
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
Тут я попытался исследовать команду обновления моей Arch Linux, а
maybe
не обнаружила операций с файловой системой и не вывела никаких сообщений о таких операциях.Итоги
Как видите, всё тут просто и понятно. Мне команда
maybe
очень понравилась, это как раз то, что я какое-то время искал. Теперь я могу без особых сложностей узнать, что будет делать команда или программа до её реального запуска. Надеюсь, maybe
пригодится и вам.Уважаемые читатели! Какие сценарии использования maybe вы видите? В материале упомянуто о том, что maybe — утилита, которая пока не вполне готова к использованию на ответственных системах. Знаете ли вы что-то подобное, но подходящее для запуска на таких системах?
Комментарии (16)
Pilat
08.12.2017 14:05Интересно, если взять VirtualBox (или что-то подобное), запустить inotifywait и до кучи tcpdump, мы увидим больше чем предлагаемый скрипт?
Хотя и так понятно, что если программа думает что записала что-то на диск, а на самом деле не записала, то работать она будет не так как предполагается в нормальных условиях.
izzholtik
08.12.2017 14:42Подтверждаю, софтина
криваяимеет ограниченную область применения.
echo '123' > test.txt
cat test.txt
$ ./test.sh
123
$ maybe test.sh
cat: test.txt: No such file or directoryPilat
08.12.2017 15:06а в Вашем скрипте нет даже флагов
set -eu
а с ними вообще скрипт быстренько вылетит. В общем получилась утилита, может и полезная для чего-то, только теперь надо придумать для чего :)
UncleAndy
08.12.2017 14:46Напомнило мне старую досовскую утилиту под названием, если я правильно помню, «condom». :) Делала вид что на дискеты все записывается, а в реальности ничего не писала. :)
berez
08.12.2017 15:55+1вывод maybemaybe has prevented rm -r ostechnix/ from performing 5 file system operations:
delete /home/sk/inboxer-0.4.0-x86_64.AppImage
delete /home/sk/Docker.pdf
delete /home/sk/Idhayathai Oru Nodi.mp3
delete /home/sk/dThmLbB334_1398236878432.jpg
delete /home/sk/ostechnixEvgen52
08.12.2017 16:23Возможно, это rm из недоверенного места, который автор и захотел проверить с помощью maybe, прежде чем запускать?) Теперь он увидел, что этот rm удалит совсем не то, что он просит, значит его запускать не надо, это вирус)
Shambler0
08.12.2017 21:37Возможно,
/home/sk/ostechnix
— на самом деле символическая ссылка на/home/sk
, а скрипт использует что-то вродеcd -P
чтобы показать фактические пути файлов?
Смысл в том, что может показаться, что команда очистит какую-то ненужную папку, а на самом деле будут удалены файлы из домашнего каталога пользователя.
ronkajitsu
09.12.2017 13:30На версии 0.3.0-1 из репов Ubuntu аналогично:
Пример вызова maybe[~]: mkdir test1 [~]: cd test1 [test1]: mkdir test2 [test1]: mkdir test3 [test1]: mkdir test3/test4 [test1]: tree . +-- test2 L-- test3 L-- test4 [test1]: maybe rm -rf test3/ maybe has prevented rm -rf test3/ from performing 2 file system operations: delete /home/ronkajitsu/test1/test4 delete /home/ronkajitsu/test1/test3 Do you want to rerun rm -rf test3/ and permit these operations? [y/N]
pansa
08.12.2017 20:28Если запускать не какие-нибудь вирусы, эксплуатирующие уязвимости ядра, то что мешает запускать утилиту в докере под strace? Вместо maybe.
Evolving_Code
08.12.2017 21:37Если я правильно понял, то maybe работает как интерпретатор команд bash скрипт, но вот вопрос. Как эта программа эмулирует/симулирует передачу адреса? В самой себе или посылая её в консоль и создавая иллюзию действия с последующим получением ответа. Просто уж слишком сильно костылями пахнет.
aamonster
08.12.2017 23:33+1Бесполезная хрень. Тут уже показали, как она сломается. Итого, скрипт, который захочется проверить, сломается на третьей строчке на чём-нибудь безобидном, а когда вы его выполните целиком — грохнет вам все данные.
Нужна нормальная песочница — чтобы не просто не выдавались сообщения об ошибках, но и результаты вызовов были доступны.
kmeaw
08.12.2017 23:43Вероятно,
maybe sudo pacman -Syu
не сработала потому, что sudo — suid-ный бинарник, а их трассировать с помощью ptrace обычный пользователь не может.
Стоит попробоватьsudo maybe pacman -Syu
.
Sayonji
09.12.2017 03:56По заголовку почему-то подумал, что сейчас будем проблему остановки решать на баше.
nchaly
Интересно, что будет, если скрестить ее с докером.