# nobodd-sh

Run shell-like commands against the file-system and/or FAT partitions within file-system image. This is intended for use in scripting the preparation of images for use with the nobodd-tftpd server.

## Synopsis

    usage: nobodd-sh [-h] [--version] [-v] [-q]
                     {help,cat,rm,rmdir,mkdir,touch,ls,cp,mv} ...

## Options

-h, --help

  Show this help message and exit

--version

  Show program’s version number and exit

-v, --verbose

  Print more output

-q, --quiet

  Print no output

## Sub-commands

The first mandatory passed to nobodd-sh is the sub-command to run. These are all named after the standard POSIX shell utilities they emulate, and all implement a similar (but much more limited) set of options. Notably, filenames passed to these utilities will be treated rather differently to their common shell counterparts:

### help

With no arguments, displays a list of nobodd-sh help commands. If a command name is given, displays the description and options for the named command.

    usage: nobodd-sh help [-h] [command]

command

  The command to display help for; valid commands are shown in the following sections

-h, --help

  Show this help message and exit

### cat

Concatenate content from the given files, writing it to stdout by default. If “-” is given as a filename, or if no filenames are specified, stdin is read. In order to permit output to a file within an image, `-o` is provided to specify an output other than stdout.

    usage: nobodd-sh cat [-h] [-o filename] [filenames ...]

filenames

  The input files

-h, --help

  Show this help message and exit

-o filename, --output filename

  The output file (default: stdout)

### cp

Copy the specified file over the target file, if only one source is given, or copy the specified files and directories into the target directory, if the target is a directory.

    usage: nobodd-sh cp [-h] filenames [filenames ...] dest

filenames

  The files or directories to copy

dest

  The directory to copy into or the file to replace

-h, --help

  Show this help message and exit

### ls

List information about the files, or the contents of the directories given. Entries will be sorted alphabetically, unless another ordering is explicitly specified. By default, hidden files (beginning with “.”) are excluded from the output, unless `-a` is provided.

    usage: nobodd-sh ls [-h] [-a] [-l] [--sort SORT] [-U] [-S] [-t] [-X]
                        filenames [filenames ...]

filenames

  The files or directories to list

-h, --help

  Show this help message and exit

-a, --all

  Do not ignore entries beginning with .

-l

  Show details beside listed entries

--sort SORT

  Sort on “name” (the default), “size”, “time”, or “none” to disable sorting

-U

  Disable sorting

-S

  Sort by file size (largest first)

-t

  Sort by modification time (newest first)

-X

  Sort by entry extension

### mkdir

Creates the directories specified, which must not exist either as directories or regular files.

    usage: nobodd-sh mkdir [-h] [-p] filenames [filenames ...]

filenames

  The directories to create

-h, --help

  Show this help message and exit

-p, --parents

  Create parent directories as required

### mv

Move the specified file over the target file, if only one source is given, or move the specified files and directories into the target directory, if the target is a directory.

    usage: nobodd-sh mv [-h] filenames [filenames ...] dest

filenames

  The files or directories to copy

dest

  The directory to move into or the file to replace

-h, --help

  Show this help message and exit

Warning

Unlike regular `mv` there is no guarantee of atomic operation, particularly with respect to files within images.

### rm

Removes the files specified. If `-r` is given, will recursively remove directories and their contents as well.

    usage: nobodd-sh rm [-h] [-r] [-f] filenames [filenames ...]

filenames

  The files or directories to remove

-h, --help

  Show this help message and exit

-r, -R, --recursive

  Remove directories and their contents recursively

-f, --force

  Do not error on non-existent arguments and never prompt

### rmdir

Removes the directories specified, which must be empty.

    usage: nobodd-sh rmdir [-h] filenames [filenames ...]

filenames

  The directories to remove

-h, --help

  Show this help message and exit

### touch

Update last modified timestamps, creating any files that do not already exist.

    usage: nobodd-sh touch [-h] filenames [filenames ...]

filenames

  The files to create or modify the timestamps of

-h, --help

  Show this help message and exit

## Usage

Filenames will be parsed as regular filenames unless they contain “:/” or “:N/” where N is a partition number. If so, the portion before “:” is treated as an image file, the N (if specified) as the partition within that image (the first auto-detected FAT partition is used if N is not specified), and the portion from “/” onwards as an absolute path within that partition. As such the application may be used to copy (or move) files to / from / within FAT file-systems within images.

For example:

- `foo.txt` will be interpreted as an ordinary file in the file-system

- `foo.img:/foo.txt` will be interpreted as the file `foo.txt` in the root of the first FAT partition found within the disk image `foo.img`

- `foo.img:10/foo.txt` will be interpreted as the file `foo.txt` in the root of the 10th partition found in the disk image `foo.img`

Please be aware that nobodd-sh does not perform file-locking [1]. Therefore it is possible, but definitely not advisable, to open the same partition in the same image in two parallel nobodd-sh processes. This is extremely likely to lead to corruption of the FAT file-system if both processes are writing to the partition. Even if one process is read-only and the other read-write, this is still not safe, as the reading process may read the wrong data, depending on what the writing process does.

## Examples

Query the current kernel command line in an image.

    $ nobodd-sh cat ~/images/ubuntu-26.04.img:1/current/cmdline.txt
    console=serial0,115200 multipath=off dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 panic=10 rootwait fixrtc

Copy the kernel command line to the local file-system, editing it with sed, and moving it back into the image:

    $ nobodd-sh cp ~/images/ubuntu-26.04.img:1/current/cmdline.txt ./
    $ sed -i -e 's/panic=10/panic=5/' cmdline.txt
    $ nobodd-sh mv cmdline.txt ~/images/ubuntu-26.04.img:1/current/

Doing the same with the `cat -o` option with a pipe from sed:

    $ nobodd-sh cp ~/images/ubuntu-26.04.img:1/current/cmdline.txt ./
    $ sed -i -e 's/panic=10/panic=5/' cmdline.txt | \
      nobodd-sh cat -o ~/images/ubuntu-26.04.img:1/current/cmdline.txt

Checking the content of the current bootloader assets in the image:

    $ nobodd-sh ls -l ~/images/ubuntu-26.04.img:/current/
    -r--r--r--  1 root root    32503 Oct 23 13:41 bcm2710-rpi-2-b.dtb
    -r--r--r--  1 root root    35330 Oct 23 13:41 bcm2710-rpi-3-b-plus.dtb
    -r--r--r--  1 root root    34695 Oct 23 13:41 bcm2710-rpi-3-b.dtb
    -r--r--r--  1 root root    33684 Oct 23 13:41 bcm2710-rpi-cm0.dtb
    -r--r--r--  1 root root    32266 Oct 23 13:41 bcm2710-rpi-cm3.dtb
    -r--r--r--  1 root root    33672 Oct 23 13:41 bcm2710-rpi-zero-2-w.dtb
    -r--r--r--  1 root root    33672 Oct 23 13:41 bcm2710-rpi-zero-2.dtb
    -r--r--r--  1 root root    56289 Oct 23 13:41 bcm2711-rpi-4-b.dtb
    -r--r--r--  1 root root    56293 Oct 23 13:41 bcm2711-rpi-400.dtb
    -r--r--r--  1 root root    39913 Oct 23 13:41 bcm2711-rpi-cm4-io.dtb
    -r--r--r--  1 root root    56810 Oct 23 13:41 bcm2711-rpi-cm4.dtb
    -r--r--r--  1 root root    53510 Oct 23 13:41 bcm2711-rpi-cm4s.dtb
    -r--r--r--  1 root root    78638 Oct 23 13:41 bcm2712-d-rpi-5-b.dtb
    -r--r--r--  1 root root    78642 Oct 23 13:41 bcm2712-rpi-5-b.dtb
    -r--r--r--  1 root root    78598 Oct 23 13:41 bcm2712-rpi-500.dtb
    -r--r--r--  1 root root    79591 Oct 23 13:41 bcm2712-rpi-cm5-cm4io.dtb
    -r--r--r--  1 root root    79657 Oct 23 13:41 bcm2712-rpi-cm5-cm5io.dtb
    -r--r--r--  1 root root    79632 Oct 23 13:41 bcm2712-rpi-cm5l-cm4io.dtb
    -r--r--r--  1 root root    79698 Oct 23 13:41 bcm2712-rpi-cm5l-cm5io.dtb
    -r--r--r--  1 root root    78646 Oct 23 13:41 bcm2712d0-rpi-5-b.dtb
    -r--r--r--  1 root root      132 Oct 23 13:41 cmdline.txt
    -r--r--r--  1 root root 78601311 Oct 23 13:41 initrd.img
    dr-xr-xr-x  2 root root        0 Jan  1  1970 overlays
    -r--r--r--  1 root root        5 Oct 23 13:41 state
    -r--r--r--  1 root root 13783000 Oct 23 13:41 vmlinuz

## See Also

nobodd-prep, nobodd-tftpd, nbd-server(1)

## Bugs

Please report bugs at: https://github.com/waveform80/nobodd/issues

[1]

For all the reasons that one should generally avoid file-locking on Linux; see On the Brokenness of File Locking for more