当前位置: 首页 > 软件库 > Web应用开发 > Web框架 >

shell-history

Visualize your shell usage with Highcharts!
授权协议 ISC License
开发语言 Python
所属分类 Web应用开发、 Web框架
软件类型 开源软件
地区 不详
投 递 者 令狐昌胤
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Shell History

Inspired by bamos/zsh-history-analysis.

Visualize your usage of Bash/Zsh through a web appthanks to Flask and Highcharts!

Duration Length Type
Exit code Hourly Daily
Over time Markov chain Top commands

Post your charts ideas in this issue!

Requirements

Shell History requires Python 3.6 or above.

To install Python 3.6, I recommend using pyenv.
# install pyenv
git clone https://github.com/pyenv/pyenv ~/.pyenv

# setup pyenv (you should also put these three lines in .bashrc or similar)
export PATH="${HOME}/.pyenv/bin:${PATH}"
export PYENV_ROOT="${HOME}/.pyenv"
eval "$(pyenv init -)"

# install Python 3.6
pyenv install 3.6.12

# make it available globally
pyenv global system 3.6.12

Installation

With pip:

python3.6 -m pip install shellhistory

With pipx:

python3.6 -m pip install --user pipx

pipx install --python python3.6 shellhistory

Setup

shellhistory needs a lot of info to be able to display various charts.The basic shell history is not enough. In order to generate the necessaryinformation, you have to enable the shell extension.

At shell startup, in .bashrc or .zshrc, put the following:

# only load it for interactive shells
if [[ $- == *i* ]] && command -v shellhistory-location &>/dev/null; then
    . $(shellhistory-location)
    shellhistory enable
fi

... and now use your shell normally!

If you want to stop shellhistory, simply run shellhistory disable.

Note: for performance reasons, you can also use the static,absolute path to the source file.Indeed, calling shellhistory-location spawns a Python processwhich can slow down your shell startup.Get the path once with shellhistory-location, and use . <ABS_PATH>.In my case it's . ~/.local/pipx/venvs/shellhistory/lib/python3.6/site-packages/shellhistory/shellhistory.sh.

Usage

Launch the web app with shellhistory-web.Now go to http://localhost:5000/ and enjoy!

You will need Internet connection since assets are not bundled.

Some technical info

How it works

When you enter a command, shellhistory will compute valuesbefore and after the command execution.In Bash, it uses a trap on DEBUG and the PROMPT_COMMAND variable(man bash for more information).For Zsh, it uses the preexec_functions and precmd_functions arrays(anyone knows where to find the official documentation for these?Some information in man zshmisc).

Before the command is executed, we start a timer, compute the command type,and store the current working directory and the command itself.

After the command has finished, we store the return code, and stop the timer.

History file format

Fields saved along commands are start and stop timestamps, hostname, username,uuid (generated), tty, process' parents, shell, shell level, command type,return code, and working directory (path), in the following format::start:stop:uuid:parents:host:user:tty:path��level:type:code:command.

  • multi-line commands are prepended with a semi-colon ; instead of a colon :,starting at second line
  • start and stop timestamps are in microseconds since epoch
  • process' parents and working directory are encoded in base64 to avoiddelimiter corruption.

Example (multi-line command):

:1510588139930150:1510588139936608:40701d9b-1807-4a3e-994b-dde68692aa14:L2Jpbi9iYXNoCi91c3IvYmluL3B5dGhvbiAvdXNyL2Jpbi94LXRlcm1pbmFsLWVtdWxhdG9yCi91c3IvYmluL29wZW5ib3ggLS1zdGFydHVwIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvb3BlbmJveC1hdXRvc3RhcnQgT1BFTkJPWApsaWdodGRtIC0tc2Vzc2lvbi1jaGlsZCAxMiAyMQovdXNyL3NiaW4vbGlnaHRkbQovc2Jpbi9pbml0Cg==:myhost:pawamoy:/dev/pts/1:L21lZGlhL3Bhd2Ftb3kvRGF0YS9naXQvc2hlbGxoaXN0Cg==:/bin/bash:1:builtin:0:echo "a
;b
;c" | wc -c

Note: later we could use CSV formatting, quotingstrings and doubling double-quotes in those if any.It would make the file more readable for humans,and easily importable in other programs.See issue 26.

The previous example would look like this:

1510588139930150,1510588139936608,40701d9b-1807-4a3e-994b-dde68692aa14,"/bin/bash
/usr/bin/python /usr/bin/x-terminal-emulator
/usr/bin/openbox --startup /usr/lib/x86_64-linux-gnu/openbox-autostart OPENBOX
lightdm --session-child 12 21
/usr/sbin/lightdm
/sbin/init",myhost,pawamoy,/dev/pts/1,"/media/pawamoy/Data/git/shellhist",/bin/bash,1,builtin,0,"echo ""a
b
c"" | wc -c"

How we get the values

Start and stop time are obtained with date '+%s%N', return code is passeddirectly with $?, working directory is obtained with $PWD and commandtype with type for Bash and whence for Zsh.

Values for UUID, parents, hostname, and TTY are computed only once, whenshellhistory.sh is sourced. Indeed they do not change during usage of the currentshell process. Hostname and TTY are obtained through commands hostname andtty. UUID is generated with command uuidgen. Also note that UUIDis exported in subshells so we know which shell is a subprocess of another, andso we are able to group shell processes by "sessions", a session being an openedterminal (be it a tab, window, pane or else). Parents are obtained with afunction that iteratively greps ps result with PIDs (see shellhistory.sh).

Values for user, shell, and level are simply obtained through environmentvariables: $USER, $SHELL (though its use here is incorrect:see issue 24),and $SHLVL (also see issue 25).

The last command is obtained with the command fc.Using fc allows shellhistory to have the same behavior as your history:

  • if commands starting with spaces are ignored, they will be ignoredin shellhistory as well.
  • same for duplicates (entering ls two or more timessaves only the first instance). Note however that if you type the same commandas the previous one in an other terminal, it will still be appended,unless you manage to synchronize your history between terminals,which is another story.

Additionally, if you enter an empty line,or hit Control-C before enter, nothing will be appended either.The trick behind this is to check the command number in the current history(see shellhistory.sh for technical details).

  • 查看当前系统历史命令方式: 1.可以按一下上\下方向键,命令行就会显示相对于当前命令的上一条或下一条历史记录. 2.和方向键相同功能的就是组合键Ctrl+ p (前面执行过的命令),Ctrl +n(后面执行过的命令). 3.上面两个都是相对于当前命令查询上一条或者下一条命令的历史记录.如果搜索命令历史记录,就用Ctrl+ r 组合键进入历史记录搜寻状态,然后,键盘每按一个字母,当前命令行就会搜索出

  • 一、什么是Shell? 1.1. 接口(Interface) 操作系统为用户提供两种接口: CLI(Command Line Interface) 命令接口:用户通过使用命令来规划和控制作业的执行,或者对系统进行管理。 API(Application Programming Interface):应用程序接口:通过编程方式请求操作系统服务。 Shell 是命令行解释器,其实一个用C 语言写的程序,

  • 目标: 1.实现简单shell命令,并识别是否带有&(后台执行); 2.实现历史记录功能,并能使用!+num执行第num条命令,!!执行上一条命令。 实现思路: 1.接收命令(字符串),并分割为命令+参数形式: 可以使用库函数strtok()分割,strtok()详情; 使用字符指针数组args存储,注意最后置为NULL p = strtok(str," "); while(p){ args

  • history history命令 用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。 该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。 历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量

  • 概述 这里作者和大家一起学习Spark 中的history-server,那他到底是什么呢?该如何去学习呢? 我们可以带着下面几个问题进行详细的学习于思考: 1. history-server产生背景 2. history-server的作用 3. 如何配置和使用 4. history-server重要参数 5. sc.stop的重要性 6. REST API 1 history-server产生

  • 虽然大多数时候,我们的操作都在Neo4j自带的BI界面完成。但是Neo4j同样提供了一个命令行工具,在跑批和系统集成的时候会经常用到。另外,在shell里面执行cypher会比BI效率高,缺点就是不能可视化,不过可以导出到本地。 Neo4j的命令行工具是 cypher-shell ,在 NEO4J_HOME/bin 目录下。默认情况下可以直接通过 ./cypher-shell 输入用户名和密码后进

  • Linux命令 - history命令   Linux中 history 命令主要用于显示历史指令记录内容, 下达历史纪录中的指令。读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。 1.语法: history [参数] 2.功能:   查看已经执行过历史命令。如想查询某个用户在系统上

  • 一、作用 用于显示历史记录和执行过的指令命令。 二、语法 history (选项)(参数) 参数 含义 示例 n 显示最近的n条记录 history 20 -a 将历史命令缓冲区中命令写入历史命令文件中 -c 将目前的shell中的所有 history 内容全部消除 history -c -r 将历史命令文件中的命令读入当前历史命令缓冲区 -w 将当前历史命令缓冲区命令写入历史命令文件中 h

 相关资料
  • Shell排序是一种高效的排序算法,基于插入排序算法。 该算法避免了大的移位,如插入排序的情况,如果较小的值是最右边的并且必须移动到最左边。 该算法对广泛传播的元素使用插入排序,首先对它们进行排序,然后对间距较小的元素进行排序。 该间距称为interval 。 此间隔基于Knuth的公式计算为 - Knuth的公式 h = h * 3 + 1 where − h is interval wi

  • shell 模块提供了集成其他桌面客户端的关联功能. 在用户默认浏览器中打开URL的示例: var shell = require('shell'); shell.openExternal('https://github.com'); Methods shell 模块包含以下函数: shell.showItemInFolder(fullPath) fullPath String 打开文件所在文

  • 使用默认应用程序管理文件和 url。 进程: Main, Renderer shell 模块提供与桌面集成相关的功能。 在用户的默认浏览器中打开 URL 的示例: const { shell } = require('electron') shell.openExternal('https://github.com') Manage files and URLs using their defau

  • Erlang shell用于测试表达式。 因此,在实际测试应用程序本身之前,可以非常轻松地在shell中进行测试。 以下示例展示了如何在shell中使用加法表达式。 这里需要注意的是表达式需要以点(。)分隔符结束。 执行命令后,shell会打印另一个提示符,这次是命令编号2(因为每次输入新命令时命令编号都会增加)。 以下函数是Erlang shell中最常用的函数。 b() - 打印当前变量绑定。

  • 可能您早已能够熟练的使用 GUI(图形用户界面),例如您可以使用鼠标双击一个图标,来打开或者执行它。 我们来看这个过程: 您使用鼠标定位桌面上的一个程序图标,按下左键两次。系统读取鼠标指针的位置,并且判断该位置下图标的涵义,根据预设的双击动作,运行程序或者打开文件。 这一套 GUI 系统,便是一种 Shell,它的作用是实现人机交互。如果我们不能够控制电脑,那么电脑还不如电视机好玩,不是么?电视机

  • 使用默认应用程序管理文件和 url。 Process: Main, Renderer (只能在非沙盒下使用) shell 模块提供与桌面集成相关的功能。 在用户的默认浏览器中打开 URL 的示例: const { shell } = require('electron') shell.openExternal('https://github.com') 注意: 虽然 shell 模块可以在渲染

  • Centos运维常用工具 前言 本工具集包含有系统内核参数优化,ssh证书登录,网卡聚合,mongodb/mysql数据库安装,网络监控以及J2EE开发常用工具安装。以上工具集均为centos中常用的配置与工具,经过本人上一份工作,运维20多台分布式服务器,安装过50次以上linux的实践经验,收集整理出这套常用的服务器管理配置,在我后续的工作中发挥了巨大的价值,提升了N倍工作效率。当然这个过程中

  • Erlang shell 被用于表达式的测试。因此,测试可以在 shell 进行,这是在实际的应用程序运行之前进行测试。 下面的例子展示了如何在 shell 中添加表达式并使用。这里需要指出的是,表达需要使用(.)定界符来作为结束符。 执行该命令后,shell 打印出另一个提示,此时为命令编号为2(因为指令数在每次输入新命令后增加)。 以下函数在 Erlang Shell 最常见的。 b() −