Simple shell interpreter. More...
Simple shell interpreter.
Access to the shell grants access to the system that may exercise any power the firmware can exercise. While some commands only provide limited access to the system, and it is best practice for commands to validate their input, there is no expectation of security of the system when an attacker gains access to the shell.
Enable the shell
module e.g. by adding the following snippet to your applications Makefile
.
And run the shell using shell_run_forever e.g. from the main
thread after everything is set up. This call will never return.
The commands help
and help_json
are builtins that print the list of available commands: The former prints a human readable table and is always available, the latter requires module shell_builtin_cmd_help_json
to be used and will give the same info machine readable.
Modules | |
Shell commands | |
Shell compile time configurations | |
Files | |
file | shell.h |
Shell interface definition. | |
Data Structures | |
struct | shell_command_t |
A single command in the list of the supported commands. More... | |
struct | shell_command_xfa_t |
A single command in the list of the supported commands. More... | |
Macros | |
#define | SHELL_DEFAULT_BUFSIZE (128) |
Default shell buffer size (maximum line length shell can handle) | |
#define | SHELL_COMMAND(cmd, help, func) |
Define shell command. | |
Typedefs | |
typedef int(* | shell_command_handler_t) (int argc, char **argv) |
Prototype of a shell callback handler. | |
typedef struct shell_command_t | shell_command_t |
A single command in the list of the supported commands. | |
Functions | |
void | shell_post_readline_hook (void) |
Optional hook after readline has triggered. | |
void | shell_pre_command_hook (int argc, char **argv) |
Optional hook before shell command is called. | |
void | shell_post_command_hook (int ret, int argc, char **argv) |
Optional hook after shell command is called. | |
void | shell_run_once (const shell_command_t *commands, char *line_buf, int len) |
Start a shell and exit once EOF is reached. | |
static void | shell_run_forever (const shell_command_t *commands, char *line_buf, int len) |
Start a shell and restart it if it exits. | |
static void | shell_run (const shell_command_t *commands, char *line_buf, int len) |
Back-porting alias for shell_run_forever. | |
int | shell_handle_input_line (const shell_command_t *commands, char *line) |
Parse and run a line of text as a shell command with arguments. | |
int | shell_parse_file (const shell_command_t *commands, const char *filename, unsigned *line_nr) |
Read shell commands from a file and run them. | |
#define SHELL_COMMAND | ( | cmd, | |
help, | |||
func | |||
) |
Define shell command.
extern "C"
function implemented in C++.This macro is a helper for defining a shell command and adding it to the shell commands XFA (cross file array).
Shell commands added using this macros will be sorted after builtins and commands passed via parameter to shell_run_once()
. If a command with the same name exists in any of those, they will make a command added via this macro inaccassible.
Commands added with this macro will be sorted alphanumerically by name
.
Example:
#define SHELL_DEFAULT_BUFSIZE (128) |
Default shell buffer size (maximum line length shell can handle)
isrpipe_t stdin_isrpipe
) does not support backpressure and overflows silently. As a consequence, commands through such terminals appear to be truncated at STDIO_RX_BUFSIZE bytes (defaulting to 64) unless the command is sent in parts (on many terminals, by pressing Ctrl-D half way through the command).For example, this affects systems with direct USB stdio (STDIO over CDC ACM (usbus)) with the default terminal pyterm
.
typedef int(* shell_command_handler_t) (int argc, char **argv) |
Prototype of a shell callback handler.
The functions supplied to shell_run() must use this signature. It is designed to mimic the function signature of main()
. For this reason, the argument list is terminated with a NULL
, i.e argv[argc] == NULL
(which is an ANSI-C requirement, and a detail that newlib's getopt()
implementation relies on). The function name is passed in argv[0]
.
Escape sequences are removed before the function is called.
The called function may edit argv
and the contained strings, but it must be taken care of not to leave the boundaries of the array. This functionality is another property that many getopt()
implementations rely on to provide their so-called "permute" feature extension.
[in] | argc | Number of arguments supplied to the function invocation. |
[in] | argv | The supplied argument list. |
typedef struct shell_command_t shell_command_t |
A single command in the list of the supported commands.
The list of commands is NULL terminated, i.e. the last element must be { NULL, NULL, NULL }
.
int shell_handle_input_line | ( | const shell_command_t * | commands, |
char * | line | ||
) |
Parse and run a line of text as a shell command with arguments.
[in] | commands | ptr to array of command structs |
[in] | line | The input line to parse |
int shell_parse_file | ( | const shell_command_t * | commands, |
const char * | filename, | ||
unsigned * | line_nr | ||
) |
Read shell commands from a file and run them.
vfs
module.[in] | commands | ptr to array of command structs |
[in] | filename | file to read shell commands from |
[out] | line_nr | line on which an error occurred, may be NULL |
void shell_post_command_hook | ( | int | ret, |
int | argc, | ||
char ** | argv | ||
) |
Optional hook after shell command is called.
User implemented function gets called before a valid shell command will be called.
shell_hooks
module.[in] | ret | Return value of the shell command. |
[in] | argc | Number of arguments supplied to the function invocation. |
[in] | argv | The supplied argument list. |
void shell_post_readline_hook | ( | void | ) |
Optional hook after readline has triggered.
User implemented function gets called after the shell readline is complete.
shell_hooks
module. void shell_pre_command_hook | ( | int | argc, |
char ** | argv | ||
) |
Optional hook before shell command is called.
User implemented function gets called before a valid shell command will be called.
shell_hooks
module.[in] | argc | Number of arguments supplied to the function invocation. |
[in] | argv | The supplied argument list. |
|
inlinestatic |
Back-porting alias for shell_run_forever.
[in] | commands | ptr to array of command structs |
[in] | line_buf | Buffer that will be used for reading a line |
[in] | len | nr of bytes that fit in line_buf |
|
inlinestatic |
Start a shell and restart it if it exits.
If `CONFIG_SHELL_SHUTDOWN_ON_EXIT` is set (e.g. on native) the shell will instead shut down RIOT once EOF is reached.
[in] | commands | ptr to array of command structs |
[in] | line_buf | Buffer that will be used for reading a line |
[in] | len | nr of bytes that fit in line_buf |
void shell_run_once | ( | const shell_command_t * | commands, |
char * | line_buf, | ||
int | len | ||
) |
Start a shell and exit once EOF is reached.
[in] | commands | ptr to array of command structs |
[in] | line_buf | Buffer that will be used for reading a line |
[in] | len | nr of bytes that fit in line_buf |