123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- =====================================
- Run shell commands from your instance
- =====================================
- Command line engines are custom engines that run commands in the shell of the
- host. In this article you can learn how to create a command engine and how to
- customize the result display.
- The command
- ===========
- When specifyng commands, you must make sure the commands are available on the
- searx host. Searx will not install anything for you. Also, make sure that the
- ``searx`` user on your host is allowed to run the selected command and has
- access to the required files.
- Access control
- ==============
- Be careful when creating command engines if you are running a public
- instance. Do not expose any sensitive information. You can restrict access by
- configuring a list of access tokens under tokens in your ``settings.yml``.
- Available settings
- ==================
- * ``command``: A comma separated list of the elements of the command. A special
- token ``{{QUERY}}`` tells searx where to put the search terms of the
- user. Example: ``['ls', '-l', '-h', '{{QUERY}}']``
- * ``query_type``: The expected type of user search terms. Possible values:
- ``path`` and ``enum``. ``path`` checks if the uesr provided path is inside the
- working directory. If not the query is not executed. ``enum`` is a list of
- allowed search terms. If the user submits something which is not included in
- the list, the query returns an error.
- * ``delimiter``: A dict containing a delimiter char and the "titles" of each
- element in keys.
- * ``parse_regex``: A dict containing the regular expressions for each result
- key.
- * ``query_enum``: A list containing allowed search terms if ``query_type`` is
- set to ``enum``.
- * ``working_dir``: The directory where the command has to be executed. Default:
- ``.``
- * ``result_separator``: The character that separates results. Default: ``\n``
- Customize the result template
- =============================
- There is a default result template for displaying key-value pairs coming from
- command engines. If you want something more tailored to your result types, you
- can design your own template.
- Searx relies on `Jinja2 <https://jinja.palletsprojects.com/>`_ for
- templating. If you are familiar with Jinja, you will not have any issues
- creating templates. You can access the result attributes with ``{{
- result.attribute_name }}``.
- In the example below the result has two attributes: ``header`` and ``content``.
- To customize their diplay, you need the following template (you must define
- these classes yourself):
- .. code:: html
- <div class="result">
- <div class="result-header">
- {{ result.header }}
- </div>
- <div class="result-content">
- {{ result.content }}
- </div>
- </div>
- Then put your template under ``searx/templates/{theme-name}/result_templates``
- named ``your-template-name.html``. You can select your custom template with the
- option ``result_template``.
- .. code:: yaml
- - name: your engine name
- engine: command
- result_template: your-template-name.html
- Examples
- ========
- Find files by name
- ------------------
- The first example is to find files on your searx host. It uses the command
- `find` available on most Linux distributions. It expects a path type query. The
- path in the search request must be inside the ``working_dir``.
- The results are displayed with the default `key-value.html` template. A result
- is displayed in a single row table with the key "line".
- .. code:: yaml
- - name : find
- engine : command
- command : ['find', '.', '-name', '{{QUERY}}']
- query_type : path
- shortcut : fnd
- tokens : []
- disabled : True
- delimiter :
- chars : ' '
- keys : ['line']
- Find files by contents
- -----------------------
- In the second example, we define an engine that searches in the contents of the
- files under the ``working_dir``. The search type is not defined, so the user can
- input any string they want. To restrict the input, you can set the ``query_type``
- to ``enum`` and only allow a set of search terms to protect
- yourself. Alternatively, make the engine private, so no one malevolent accesses
- the engine.
- .. code:: yaml
- - name : regex search in files
- engine : command
- command : ['grep', '{{QUERY}}']
- shortcut : gr
- tokens : []
- disabled : True
- delimiter :
- chars : ' '
- keys : ['line']
|