diff --git a/ogcp/templates/actions/script_output.html b/ogcp/templates/actions/script_output.html
new file mode 100644
index 0000000..c7ffdcb
--- /dev/null
+++ b/ogcp/templates/actions/script_output.html
@@ -0,0 +1,74 @@
+{% extends 'commands.html' %}
+{% import "bootstrap/wtf.html" as wtf %}
+{% import "macros.html" as macros %}
+
+{% set sidebar_state = 'disabled' %}
+{% set btn_back = true %}
+
+{% block nav_client %} active {% endblock %}
+{% block nav_script_output %} active {% endblock %}
+{% block content %}
+
+
+ {{ _('Script output') }}
+
+
+{{ macros.cmd_selected_clients(selected_clients) }}
+
+
+
+
+
+
+ {% for client in client_data %}
+
+
+
+
+
{{ client['output'] }}
+
+
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/ogcp/templates/commands.html b/ogcp/templates/commands.html
index eab9f29..7a63c38 100644
--- a/ogcp/templates/commands.html
+++ b/ogcp/templates/commands.html
@@ -94,6 +94,8 @@
diff --git a/ogcp/views.py b/ogcp/views.py
index 109957a..45a0f73 100644
--- a/ogcp/views.py
+++ b/ogcp/views.py
@@ -1881,6 +1881,48 @@ def action_run_script():
selected_clients=selected_clients,
scopes=scopes)
+@app.route('/action/script/output', methods=['GET'])
+@login_required
+def action_script_display_output():
+ ips = parse_elements(request.args.to_dict())
+
+ if not validate_elements(ips):
+ return redirect(url_for('commands'))
+
+ server = get_server_from_clients(ips)
+
+ r = server.get('/shell/output', payload={'clients': list(ips)})
+ if not r:
+ return ogserver_down('commands')
+ if r.status_code != requests.codes.ok:
+ return ogserver_error('commands')
+
+ client_data = r.json()['clients']
+
+ for client in client_data:
+ if not 'output' in client:
+ client['output'] = _('No output')
+
+ if not 'retcode' in client:
+ client['retcode'] = 0
+
+ if not 'cmd' in client:
+ client['cmd'] = ['Null']
+
+ if not 'tstamp' in client:
+ client['tstamp'] = _('No time available')
+ else:
+ timestamp_utc = datetime.datetime.utcfromtimestamp(client['tstamp'])
+ client['tstamp'] = timestamp_utc.strftime('%Y-%m-%d %H:%M:%S')
+
+ client_data.sort(key=lambda x:x['tstamp'], reverse=True)
+
+ scopes, clients = get_scopes(set(ips))
+ selected_clients = list(get_selected_clients(scopes['scope']).items())
+ return render_template('actions/script_output.html',
+ selected_clients=selected_clients,
+ scopes=scopes, client_data=client_data)
+
def get_clients_modes(ips, server):
modes = {}
for ip in ips: