---
name: utils-fix-permissions
description: >-
Fix file permissions on a directory tree on an HPC cluster (Leonardo, Jupiter,
TACC, etc.) so other users can read your shared data, conda envs, or work
directories. Runs `scripts/permissions/fix_permissions.sh
` over SSH on
the target cluster — sets directories to 755, files to 644, then restores
execute bits on bin/ entries, ELF binaries, and shebang scripts, and ensures
all ancestor directories are traversable (o+x). Use when another user reports
"Permission denied" reading your files, after creating a new conda env or
shared data dir, or when a cross-user pipeline can't access your checkpoint/
eval/trace outputs.
---
# utils-fix-permissions
Set shared-readable permissions on an HPC directory tree.
## When to use
- Another user reports **"Permission denied"**.
- A shared conda env or data directory needs read access.
- A cross-user pipeline cannot read checkpoint, eval, or trace output.
- `rsync` or `scp` preserved 600/700 permissions.
## What it does
`scripts/permissions/fix_permissions.sh ` performs these passes:
| Pass | Action |
|---|---|
| 0 | Ensure all **ancestor directories** up to `/` are traversable (`o+x`) — only touches dirs you own |
| 1 | Set all **directories** to `755` (`rwxr-xr-x`) |
| 2 | Set all **files** to `644` (`rw-r--r--`) |
| 3 | Restore `755` on executables in **`bin/`** directories |
| 4 | Restore `755` on **ELF binaries** (detected by `\x7f ELF` magic header) |
| 5 | Restore `755` on **shell scripts with shebang** (`#!`) |
Files remain owner-writable; collaborators receive read and execute.
## How to invoke
SSH to the target cluster and run the script from the repo root:
```bash
# Leonardo example
ssh Leonardo 'cd $WORK/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh /leonardo_work/AIFAC_5C0_290/bfeuer00'
# TACC example (large tree — run on a compute node if login node is loaded)
ssh TACCVista 'cd $SCRATCH/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $SCRATCH/eval_jobs'
# Jupiter example
ssh Jupiter 'cd $DCFT && bash scripts/permissions/fix_permissions.sh /p/home/../../public'
```
### Large directories
For big trees, use an interactive compute node:
```bash
# TACC
ssh TACCVista 'srun -p gh-dev -N 1 -n 1 -t 08:00:00 --account=CCR24067 bash -c "cd $SCRATCH/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $SCRATCH/miniconda3"'
# Leonardo (idev or sbatch)
ssh Leonardo 'srun -p boost --account=AIFAC_5C0_290 --time=08:00:00 -N 1 bash -c "cd $WORK/OpenThoughts-Agent && bash scripts/permissions/fix_permissions.sh $WORK"'
```
## Gotchas
- Use `chmod -R g+w ` when shared editing is required.
- Rerun after `pip install` for a shared conda environment.
- Pass 0 changes only owned NFS directories.
- Safe to rerun; it is idempotent.