“try” te permite ejecutar un comando e inspeccionar sus efectos antes de cambiar tu sistema en vivo. try utiliza los espacios de nombres de Linux (a través de unshare) y el sistema de archivos de unión overlayfs.
Por favor, ten en cuenta que “try
” es un prototipo y no un sandbox completo, y no debe ser usado para ejecutar comandos en los que no confíes ya en tu sistema, (por ejemplo, los dispositivos en /dev están montados en el sandbox, y las llamadas de red están todas permitidas). Por favor, no intentes ningún comando que elimine todo en /dev o escriba ceros en tus discos.
Dependencias
try se basa en las siguientes dependencias
- util-linux
En los casos en los que overlayfs no funcione en montajes anidados, necesitarás mergerfs o unionfs. try debería ser capaz de autodetectarlos, pero puedes especificar la ruta a mergerfs o unionfs con -U
(p.e. try -U ~/.local/bin/unionfs
)
https://github.com/trapexit/mergerfs
https://github.com/rpodgorny/unionfs-fuse
Para ejecutar el conjunto de pruebas de try (test/run_tests.sh), necesitarás
- bash
- expect
try ha sido probado en las siguientes distribuciones:
- Ubuntu 20.04 LTS o posterior
- Debian 12
- Fedora 38
- Centos 9 Stream 5.14.0-325.el9
- Arch 6.1.33-1-lts
- Alpine 6.1.34-1-lts
- Rocky 9 5.14.0-284.11.1.el9_2
- SteamOS 3.4.8 5.13.0-valve36-1-neptune
Instalación
Sólo necesitas el script de prueba, que puedes descargar clonando este repositorio:
$ git clone https://github.com/binpash/try.git
Arch Linux
try está presente en AUR, puedes instalarlo con tu AUR helper preferido:
yay -S try
o manualmente:
git clone https://aur.archlinux.org/try.git
cd try
makepkg -sic
Ejemplo de Uso
try es un comando de orden superior, como xargs, exec, nohup o find. Por ejemplo, para instalar un paquete mediante pip3, puedes invocar try de la siguiente manera:
$ try pip3 install libdash
... # output continued below
Por defecto, try te pedirá que confirmes los cambios realizados al final de su ejecución.
...
Defaulting to user installation because normal site-packages is not writeable
Collecting libdash
Downloading libdash-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (254 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 254.6/254.6 KB 2.1 MB/s eta 0:00:00
Installing collected packages: libdash
Successfully installed libdash-0.3.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Changes detected in the following files:
/tmp/tmp.zHCkY9jtIT/upperdir/home/gliargovas/.local/lib/python3.10/site-packages/libdash/ast.py (modified/added)
/tmp/tmp.zHCkY9jtIT/upperdir/home/gliargovas/.local/lib/python3.10/site-packages/libdash/_dash.py (modified/added)
/tmp/tmp.zHCkY9jtIT/upperdir/home/gliargovas/.local/lib/python3.10/site-packages/libdash/__init__.py (modified/added)
/tmp/tmp.zHCkY9jtIT/upperdir/home/gliargovas/.local/lib/python3.10/site-packages/libdash/__pycache__/printer.cpython-310.pyc (modified/added)
/tmp/tmp.zHCkY9jtIT/upperdir/home/gliargovas/.local/lib/python3.10/site-packages/libdash/__pycache__/ast.cpython-310.pyc (modified/added)
<snip>
Commit these changes? [y/N] y
A veces, es posible que desees pre-ejecutar un comando y confirmar su resultado en un momento posterior. Ejecutar try -n
imprimirá el directorio superpuesto en STDOUT sin confirmar el resultado.
$ try -n "curl https://sh.rustup.rs | sh"
/tmp/tmp.uCThKq7LBK
Como alternativa, puedes especificar tu propio directorio de superposición existente utilizando la opción -D
:
$ mkdir rustup-sandbox
$ try -D rustup-sandbox "curl https://sh.rustup.rs | sh"
$ ls rustup-sandbox
temproot upperdir workdir
Como puedes ver en la salida anterior, try
ha creado un entorno de superposición en el directorio rustup-sandbox
.
Inspeccionando manualmente upperdir se revelan los cambios realizados en los ficheros dentro de la superposición durante la ejecución del comando anterior con try:
~/try/rustup-sandbox/upperdir$ du -hs .
1.2G .
Puedes inspeccionar los cambios realizados dentro de un directorio de superposición dado usando try
:
$ try summary rustup-sandbox/ | head
Changes detected in the following files:
rustup-sandbox//upperdir/home/ubuntu/.profile (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.bashrc (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.rustup/update-hashes/stable-x86_64-unknown-linux-gnu (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.rustup/settings.toml (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/libstd-8389830094602f5a.so (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/etc/lldb_commands (modified/added)
rustup-sandbox//upperdir/home/ubuntu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/etc/gdb_lookup.py (modified/added)
También puedes elegir confirmar el contenido del directorio superpuesto:
$ try commit rustup-sandbox
También puedes ejecutar try explore
para abrir tu shell actual en try, o /try explore /tmp/tmp.X6OQb5tJwr
para explorar un sandbox existente.
https://github.com/binpash/try