Tag Archive: history

一月 30th, 2018

为服务器打补丁是 Linux 系统管理员的一项重要任务,为的是让系统更加稳定,性能更加优化。厂商经常会发布一些安全/高危的补丁包,相关软件需要升级以防范潜在的安全风险。

Yum (Yellowdog Update Modified) 是 CentOS 和 RedHat 系统上用的 RPM 包管理工具,yum history 命令允许系统管理员将系统回滚到上一个状态,但由于某些限制,回滚不是在所有情况下都能成功,有时 yum 命令可能什么都不做,有时可能会删掉一些其他的包。

我建议你在升级之前还是要做一个完整的系统备份,而 yum history 并不能用来替代系统备份的。系统备份能让你将系统还原到任意时候的节点状态。

某些情况下,安装的应用程序在升级了补丁之后不能正常工作或者出现一些错误(可能是由于库不兼容或者软件包升级导致的),那该怎么办呢?

与应用开发团队沟通,并找出导致库和软件包的问题所在,然后使用 yum history 命令进行回滚。

注意:

  • 它不支持回滚 selinux,selinux-policy-*,kernel,glibc (以及依赖 glibc 的包,比如 gcc)。
  • 不建议将系统降级到更低的版本(比如 CentOS 6.9 降到 CentOS 6.8),这会导致系统处于不稳定的状态

让我们先来看看系统上有哪些包可以升级,然后挑选出一些包来做实验。

  1. #yum update
  2. Loaded plugins: fastestmirror, security
  3. Setting up UpdateProcess
  4. Loading mirror speeds from cached hostfile
  5. epel/metalink |12 kB 00:00
  6. * epel: mirror.csclub.uwaterloo.ca
  7. base |3.7 kB 00:00
  8. dockerrepo |2.9 kB 00:00
  9. draios |2.9 kB 00:00
  10. draios/primary_db |13 kB 00:00
  11. epel |4.3 kB 00:00
  12. epel/primary_db |5.9 MB 00:00
  13. extras |3.4 kB 00:00
  14. updates |3.4 kB 00:00
  15. updates/primary_db |2.5 MB 00:00
  16. ResolvingDependencies
  17. -->Running transaction check
  18. --->Packagegit.x86_64 0:1.7.1-8.el6 will be updated
  19. --->Packagegit.x86_64 0:1.7.1-9.el6_9 will be an update
  20. --->Package httpd.x86_64 0:2.2.15-60.el6.centos.4 will be updated
  21. --->Package httpd.x86_64 0:2.2.15-60.el6.centos.5 will be an update
  22. --->Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.4 will be updated
  23. --->Package httpd-tools.x86_64 0:2.2.15-60.el6.centos.5 will be an update
  24. --->Package perl-Git.noarch 0:1.7.1-8.el6 will be updated
  25. --->Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update
  26. -->FinishedDependencyResolution
  27. DependenciesResolved
  28. =================================================================================================
  29. PackageArchVersionRepositorySize
  30. =================================================================================================
  31. Updating:
  32. git x86_64 1.7.1-9.el6_9 updates 4.6 M
  33. httpd x86_64 2.2.15-60.el6.centos.5 updates 836 k
  34. httpd-tools x86_64 2.2.15-60.el6.centos.5 updates 80 k
  35. perl-Git noarch 1.7.1-9.el6_9 updates 29 k
  36. TransactionSummary
  37. =================================================================================================
  38. Upgrade4Package(s)
  39. Total download size:5.5 M
  40. Isthis ok [y/N]: n

你会发现 git 包可以被升级,那我们就用它来实验吧。运行下面命令获得软件包的版本信息(当前安装的版本和可以升级的版本)。

  1. #yumlistgit
  2. Loaded plugins: fastestmirror, security
  3. Setting up UpdateProcess
  4. Loading mirror speeds from cached hostfile
  5. * epel: mirror.csclub.uwaterloo.ca
  6. InstalledPackages
  7. git.x86_64 1.7.1-8.el6@base
  8. AvailablePackages
  9. git.x86_64 1.7.1-9.el6_9 updates

运行下面命令来将 git 从 1.7.1-8 升级到 1.7.1-9

  1. #yum update git
  2. Loaded plugins: fastestmirror, presto
  3. Setting up UpdateProcess
  4. Loading mirror speeds from cached hostfile
  5. * base: repos.lax.quadranet.com
  6. * epel: Fedora.mirrors.pair.com
  7. * extras: mirrors.seas.harvard.edu
  8. * updates: mirror.sesp.northwestern.edu
  9. ResolvingDependencies
  10. -->Running transaction check
  11. --->Packagegit.x86_64 0:1.7.1-8.el6 will be updated
  12. -->ProcessingDependency:git=1.7.1-8.el6forpackage: perl-Git-1.7.1-8.el6.noarch
  13. --->Packagegit.x86_64 0:1.7.1-9.el6_9 will be an update
  14. -->Running transaction check
  15. --->Package perl-Git.noarch 0:1.7.1-8.el6 will be updated
  16. --->Package perl-Git.noarch 0:1.7.1-9.el6_9 will be an update
  17. -->FinishedDependencyResolution
  18. DependenciesResolved
  19. =================================================================================================
  20. PackageArchVersionRepositorySize
  21. =================================================================================================
  22. Updating:
  23. git x86_64 1.7.1-9.el6_9 updates 4.6 M
  24. Updatingfor dependencies:
  25. perl-Git noarch 1.7.1-9.el6_9 updates 29 k
  26. TransactionSummary
  27. =================================================================================================
  28. Upgrade2Package(s)
  29. Total download size:4.6 M
  30. Isthis ok [y/N]: y
  31. DownloadingPackages:
  32. Setting up and reading Presto delta metadata
  33. Processing delta metadata
  34. Package(s) data still to download:4.6 M
  35. (1/2):git-1.7.1-9.el6_9.x86_64.rpm |4.6 MB 00:00
  36. (2/2): perl-Git-1.7.1-9.el6_9.noarch.rpm |29 kB 00:00
  37. -------------------------------------------------------------------------------------------------
  38. Total5.8 MB/|4.6 MB 00:00
  39. Running rpm_check_debug
  40. RunningTransactionTest
  41. TransactionTestSucceeded
  42. RunningTransaction
  43. Updating: perl-Git-1.7.1-9.el6_9.noarch1/4
  44. Updating:git-1.7.1-9.el6_9.x86_64 2/4
  45. Cleanup: perl-Git-1.7.1-8.el6.noarch3/4
  46. Cleanup:git-1.7.1-8.el6.x86_64 4/4
  47. Verifying:git-1.7.1-9.el6_9.x86_64 1/4
  48. Verifying: perl-Git-1.7.1-9.el6_9.noarch2/4
  49. Verifying:git-1.7.1-8.el6.x86_64 3/4
  50. Verifying: perl-Git-1.7.1-8.el6.noarch4/4
  51. Updated:
  52. git.x86_64 0:1.7.1-9.el6_9
  53. DependencyUpdated:
  54. perl-Git.noarch 0:1.7.1-9.el6_9
  55. Complete!

验证升级后的 git 版本.

  1. #yumlistgit
  2. InstalledPackages
  3. git.x86_64 1.7.1-9.el6_9@updates
  4. # rpm -git
  5. git-1.7.1-9.el6_9.x86_64

现在我们成功升级这个软件包,可以对它进行回滚了。步骤如下。

 

使用 YUM history 命令回滚升级操作

首先,使用下面命令获取 yum 操作的 id。下面的输出很清晰地列出了所有需要的信息,例如操作 id、谁做的这个操作(用户名)、操作日期和时间、操作的动作(安装还是升级)、操作影响的包数量。

  1. #yum history
  2. #yum history list all
  3. Loaded plugins: fastestmirror, presto
  4. ID |Login user |Dateandtime|Action(s)|Altered
  5. -------------------------------------------------------------------------------
  6. 13| root |2017-08-1813:30|Update|2
  7. 12| root |2017-08-1007:46|Install|1
  8. 11| root |2017-07-2817:10| E, I, U |28 EE
  9. 10| root |2017-04-2109:16| E, I, U |162 EE
  10. 9| root |2017-02-0917:09| E, I, U |20 EE
  11. 8| root |2017-02-0210:45|Install|1
  12. 7| root |2016-12-1506:48|Update|1
  13. 6| root |2016-12-1506:43|Install|1
  14. 5| root |2016-12-0210:28| E, I, U |23 EE
  15. 4| root |2016-10-2805:37| E, I, U |13 EE
  16. 3| root |2016-10-1812:53|Install|1
  17. 2| root |2016-09-3010:28| E, I, U |31 EE
  18. 1| root |2016-07-2611:40| E, I, U |160 EE

上面命令显示有两个包受到了影响,因为 git 还升级了它的依赖包 perl-Git。 运行下面命令来查看关于操作的详细信息。

  1. #yum history info13
  2. Loaded plugins: fastestmirror, presto
  3. Transaction ID :13
  4. Begintime:FriAug1813:30:522017
  5. Begin rpmdb :420:f5c5f9184f44cf317de64d3a35199e894ad71188
  6. Endtime:13:30:542017(2 seconds)
  7. End rpmdb :420:d04a95c25d4526ef87598f0dcaec66d3f99b98d4
  8. User: root
  9. Return-Code:Success
  10. CommandLine: update git
  11. Transaction performed with:
  12. Installed rpm-4.8.0-55.el6.x86_64 @base
  13. Installedyum-3.2.29-81.el6.centos.noarch @base
  14. Installedyum-plugin-fastestmirror-1.1.30-40.el6.noarch@base
  15. Installedyum-presto-0.6.2-1.el6.noarch@anaconda-CentOS-201207061011.x86_64/6.3
  16. PackagesAltered:
  17. Updatedgit-1.7.1-8.el6.x86_64 @base
  18. Update1.7.1-9.el6_9.x86_64 @updates
  19. Updated perl-Git-1.7.1-8.el6.noarch@base
  20. Update1.7.1-9.el6_9.noarch@updates
  21. history info

运行下面命令来回滚 git 包到上一个版本。

  1. #yum history undo 13
  2. Loaded plugins: fastestmirror, presto
  3. Undoing transaction 53,fromFriAug1813:30:522017
  4. Updatedgit-1.7.1-8.el6.x86_64 @base
  5. Update1.7.1-9.el6_9.x86_64 @updates
  6. Updated perl-Git-1.7.1-8.el6.noarch@base
  7. Update1.7.1-9.el6_9.noarch@updates
  8. Loading mirror speeds from cached hostfile
  9. * base: repos.lax.quadranet.com
  10. * epel: fedora.mirrors.pair.com
  11. * extras: repo1.dal.innoscale.net
  12. * updates: mirror.vtti.vt.edu
  13. ResolvingDependencies
  14. -->Running transaction check
  15. --->Packagegit.x86_64 0:1.7.1-8.el6 will be a downgrade
  16. --->Packagegit.x86_64 0:1.7.1-9.el6_9 will be erased
  17. --->Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade
  18. --->Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased
  19. -->FinishedDependencyResolution
  20. DependenciesResolved
  21. =================================================================================================
  22. PackageArchVersionRepositorySize
  23. =================================================================================================
  24. Downgrading:
  25. git x86_64 1.7.1-8.el6 base 4.6 M
  26. perl-Git noarch 1.7.1-8.el6 base 29 k
  27. TransactionSummary
  28. =================================================================================================
  29. Downgrade2Package(s)
  30. Total download size:4.6 M
  31. Isthis ok [y/N]: y
  32. DownloadingPackages:
  33. Setting up and reading Presto delta metadata
  34. Processing delta metadata
  35. Package(s) data still to download:4.6 M
  36. (1/2):git-1.7.1-8.el6.x86_64.rpm |4.6 MB 00:00
  37. (2/2): perl-Git-1.7.1-8.el6.noarch.rpm |29 kB 00:00
  38. -------------------------------------------------------------------------------------------------
  39. Total3.4 MB/|4.6 MB 00:01
  40. Running rpm_check_debug
  41. RunningTransactionTest
  42. TransactionTestSucceeded
  43. RunningTransaction
  44. Installing: perl-Git-1.7.1-8.el6.noarch1/4
  45. Installing:git-1.7.1-8.el6.x86_64 2/4
  46. Cleanup: perl-Git-1.7.1-9.el6_9.noarch3/4
  47. Cleanup:git-1.7.1-9.el6_9.x86_64 4/4
  48. Verifying:git-1.7.1-8.el6.x86_64 1/4
  49. Verifying: perl-Git-1.7.1-8.el6.noarch2/4
  50. Verifying:git-1.7.1-9.el6_9.x86_64 3/4
  51. Verifying: perl-Git-1.7.1-9.el6_9.noarch4/4
  52. Removed:
  53. git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9
  54. Installed:
  55. git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6
  56. Complete!

回滚后,使用下面命令来检查降级包的版本。

  1. #yumlistgit
  2. # rpm -git
  3. git-1.7.1-8.el6.x86_64

 

使用YUM downgrade 命令回滚升级

此外,我们也可以使用 YUM downgrade 命令回滚升级。

  1. #yum downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6
  2. Loaded plugins: search-disabled-repos, security, ulninfo
  3. Setting up DowngradeProcess
  4. ResolvingDependencies
  5. -->Running transaction check
  6. --->Packagegit.x86_64 0:1.7.1-8.el6 will be a downgrade
  7. --->Packagegit.x86_64 0:1.7.1-9.el6_9 will be erased
  8. --->Package perl-Git.noarch 0:1.7.1-8.el6 will be a downgrade
  9. --->Package perl-Git.noarch 0:1.7.1-9.el6_9 will be erased
  10. -->FinishedDependencyResolution
  11. DependenciesResolved
  12. =================================================================================================
  13. PackageArchVersionRepositorySize
  14. =================================================================================================
  15. Downgrading:
  16. git x86_64 1.7.1-8.el6 base 4.6 M
  17. perl-Git noarch 1.7.1-8.el6 base 29 k
  18. TransactionSummary
  19. =================================================================================================
  20. Downgrade2Package(s)
  21. Total download size:4.6 M
  22. Isthis ok [y/N]: y
  23. DownloadingPackages:
  24. (1/2):git-1.7.1-8.el6.x86_64.rpm |4.6 MB 00:00
  25. (2/2): perl-Git-1.7.1-8.el6.noarch.rpm |28 kB 00:00
  26. -------------------------------------------------------------------------------------------------
  27. Total3.7 MB/|4.6 MB 00:01
  28. Running rpm_check_debug
  29. RunningTransactionTest
  30. TransactionTestSucceeded
  31. RunningTransaction
  32. Installing: perl-Git-1.7.1-8.el6.noarch1/4
  33. Installing:git-1.7.1-8.el6.x86_64 2/4
  34. Cleanup: perl-Git-1.7.1-9.el6_9.noarch3/4
  35. Cleanup:git-1.7.1-9.el6_9.x86_64 4/4
  36. Verifying:git-1.7.1-8.el6.x86_64 1/4
  37. Verifying: perl-Git-1.7.1-8.el6.noarch2/4
  38. Verifying:git-1.7.1-9.el6_9.x86_64 3/4
  39. Verifying: perl-Git-1.7.1-9.el6_9.noarch4/4
  40. Removed:
  41. git.x86_64 0:1.7.1-9.el6_9 perl-Git.noarch 0:1.7.1-9.el6_9
  42. Installed:
  43. git.x86_64 0:1.7.1-8.el6 perl-Git.noarch 0:1.7.1-8.el6
  44. Complete!

注意: 你也需要降级依赖包,否则它会删掉当前版本的依赖包而不是对依赖包做降级,因为 downgrade 命令无法处理依赖关系。

 

至于 Fedora 用户

命令是一样的,只需要将包管理器名称从 yum 改成 dnf 就行了。

  1. # dnf listgit
  2. # dnf history
  3. # dnf history info
  4. # dnf history undo
  5. # dnf listgit
  6. # dnf downgrade git-1.7.1-8.el6 perl-Git-1.7.1-8.el6
TAGS:
二月 25th, 2017

如果你是 Linux 命令行的用户,有的时候你可能不希望某些命令记录在你的命令行历史中。原因可能很多,例如,你在公司担任某个职位,你有一些不希望被其它人滥用的特权。亦或者有些特别重要的命令,你不希望在你浏览历史列表时误执行。

然而,有方法可以控制哪些命令进入历史列表,哪些不进入吗?或者换句话说,我们在 Linux 终端中可以开启像浏览器一样的无痕模式吗?答案是肯定的,而且根据你想要的具体目标,有很多实现方法。在这篇文章中,我们将讨论一些行之有效的方法。

注意:文中出现的所有命令都在 Ubuntu 下测试过。

 

1. 在命令前插入空格

是的,没看错。在命令前面插入空格,这条命令会被 shell 忽略,也就意味着它不会出现在历史记录中。但是这种方法有个前提,只有在你的环境变量 HISTCONTROL 设置为 “ignorespace” 或者 “ignoreboth” 才会起作用。在大多数情况下,这个是默认值。

所以,像下面的命令(LCTT 译注:这里[space]表示输入一个空格):

  1. [space]echo "this is a top secret"

如果你之前执行过如下设置环境变量的命令,那么上述命令不会出现在历史记录中。

  1. export HISTCONTROL = ignorespace

下面的截图是这种方式的一个例子。

第四个 “echo” 命令因为前面有空格,它没有被记录到历史中。

2. 禁用当前会话的所有历史记录

如果你想禁用某个会话所有历史,你可以在开始命令行工作前简单地清除环境变量 HISTSIZE 的值即可。执行下面的命令来清除其值:

  1. export HISTSIZE=0

HISTSIZE 表示对于 bash 会话其历史列表中可以保存命令的个数(行数)。默认情况,它设置了一个非零值,例如在我的电脑上,它的值为 1000。

所以上面所提到的命令将其值设置为 0,结果就是直到你关闭终端,没有东西会存储在历史记录中。记住同样你也不能通过按向上的箭头按键或运行 history 命令来看到之前执行的命令。

3. 工作结束后清除整个历史

这可以看作是前一部分所提方案的另外一种实现。唯一的区别是在你完成所有工作之后执行这个命令。下面是刚说到的命令:

  1. history -cw

刚才已经提到,这个和 HISTSIZE 方法有相同效果。

4. 只针对你的工作关闭历史记录

虽然前面描述的方法(2 和 3)可以实现目的,它们可以清除整个历史,在很多情况下,有些可能不是我们所期望的。有时候你可能想保存直到你开始命令行工作之间的历史记录。对于这样的需求,你开始在工作前执行下述命令:

  1. [space]set +o history

备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。

上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。

要重新开启历史功能,执行下面的命令:

  1. [Space]set -o history

它将环境恢复原状,也就是你完成了你的工作,执行上述命令之后的命令都会出现在历史中。

5. 从历史记录中删除指定的命令

现在假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。直接动手删除它们。通过下面的命令来删除:

  1. history | grep "part of command you want to remove"

上面的命令会输出历史记录中匹配的命令,每一条前面会有个数字。

一旦你找到你想删除的命令,执行下面的命令,从历史记录中删除那个指定的项:

  1. history -d [num]

下面是这个例子的截图。

第二个 ‘echo’命令被成功的删除了。

(LCTT 译注:如果你不希望上述命令本身也被记录进历史中,你可以在上述命令前加个空格)

同样的,你可以使用向上的箭头一直往回翻看历史记录。当你发现你感兴趣的命令出现在终端上时,按下 “Ctrl + U”清除整行,也会从历史记录中删除它

TAGS: ,
七月 24th, 2016
  1. 在命令前插入空格

是的,没看错。在命令前面插入空格,这条命令会被 shell 忽略,也就意味着它不会出现在历史记录中。但是这种方法有个前提,只有在你的环境变量 HISTCONTROL 设置为 “ignorespace” 或者 “ignoreboth” 才会起作用。在大多数情况下,这个是默认值。

所以,像下面的命令(LCTT 译注:这里[space]表示输入一个空格):

[space]echo “this is a top secret”
如果你之前执行过如下设置环境变量的命令,那么上述命令不会出现在历史记录中。

export HISTCONTROL = ignorespace
下面的截图是这种方式的一个例子。

第四个 “echo” 命令因为前面有空格,它没有被记录到历史中。

  1. 禁用当前会话的所有历史记录

如果你想禁用某个会话所有历史,你可以在开始命令行工作前简单地清除环境变量 HISTSIZE 的值即可。执行下面的命令来清除其值:

export HISTSIZE=0
HISTSIZE 表示对于 bash 会话其历史列表中可以保存命令的个数(行数)。默认情况,它设置了一个非零值,例如在我的电脑上,它的值为 1000。

所以上面所提到的命令将其值设置为 0,结果就是直到你关闭终端,没有东西会存储在历史记录中。记住同样你也不能通过按向上的箭头按键或运行 history 命令来看到之前执行的命令。

  1. 工作结束后清除整个历史

这可以看作是前一部分所提方案的另外一种实现。唯一的区别是在你完成所有工作之后执行这个命令。下面是刚说到的命令:

history -cw
刚才已经提到,这个和 HISTSIZE 方法有相同效果。

  1. 只针对你的工作关闭历史记录

虽然前面描述的方法(2 和 3)可以实现目的,它们可以清除整个历史,在很多情况下,有些可能不是我们所期望的。有时候你可能想保存直到你开始命令行工作之间的历史记录。对于这样的需求,你开始在工作前执行下述命令:

[space]set +o history
备注:[space] 表示空格。并且由于空格的缘故,该命令本身也不会被记录。

上面的命令会临时禁用历史功能,这意味着在这命令之后你执行的所有操作都不会记录到历史中,然而这个命令之前的所有东西都会原样记录在历史列表中。

要重新开启历史功能,执行下面的命令:

[Space]set -o history
它将环境恢复原状,也就是你完成了你的工作,执行上述命令之后的命令都会出现在历史中。

  1. 从历史记录中删除指定的命令

现在假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办?很简单。直接动手删除它们。通过下面的命令来删除:

history | grep “part of command you want to remove”
上面的命令会输出历史记录中匹配的命令,每一条前面会有个数字。

一旦你找到你想删除的命令,执行下面的命令,从历史记录中删除那个指定的项:

history -d [num]

第二个 ‘echo’命令被成功的删除了。
同样的,你可以使用向上的箭头一直往回翻看历史记录。当你发现你感兴趣的命令出现在终端上时,按下 “Ctrl + U”清除整行,也会从历史记录中删除它

 

TAGS: ,
十一月 10th, 2015

Linux中histroy很常用,但是无论对于管理员,普通用户还是黑客,从另一个角度而言,它对于安全的重要性也不言而喻,比如说这条命令”mysql –h198.168.0.1 –uroot –p1234”,很重要的信息,数据库的密码被破解了.同样掌握了history命令,可以使你的效率得到很大提升.

执行history命令,终端会显示之前执行过的命令及其编号,而我们执行”!编号”(例如!10) 或”!ls”(历史中以ls开头的命令,以最近执行的优先),可以执行history历史用相应的指令.

默认情况下,命令历史被存储在.bash_history文件中,可以把下面一行添加到.bash_profile文件中,重新登录shell,则.new_command文件将取代.bash_history文件用来存储历史命令.#vi ~/.bash_profile HISTFILE=/root/.new_command.

接下来,让我们看看history一些小技巧,也许很有乐趣哦!

1 使用HISTTIMEFORMAT在历史命令中显示TIMESTAMP

通常情况下,我们输入history命令时,终端中将显示你刚输入的命令及其编号.如果出于审查命令的目的,和命令一起显示时间戳,用户将很有帮助,如下所示:

[root@sqj2015 ~]export HISTTIMEFORMAT=”`whoami` %F %T ”  //whoami用反引号“

[root@sqj2015 ~]history |more

…..

74  root 2015-11-06 10:05:16 vi ~/.bash_profile

75  root 2015-11-06 10:06:15 vi /root/.bash_profile

76  root 2015-11-06 10:08:58 vi ~/.bash_profile

77  root 2015-11-06 10:09:56 vi /root/.bash_history

78  root 2015-11-06 10:10:16 cd /root

79  root 2015-11-06 10:10:18 ls -a

80  root 2015-11-06 10:35:23 export HISTTIMEFORMAT=”`whoami` %F %T ”

81  root 2015-11-06 10:35:25 history

注:我们可以使用history N(N为数字)来显示最近的几条命令.

 

2 巧妙使用HISTCONTROL命令

2.1 使用HISTCONTROL消除历史中连续重复命令

如下,若连续输入三次pwd,当你使用history的时候,你会看到这三条命令连续出现. 设置HISTCONTROL为ignoredups.来消除重复命令:

[root@sqj2015 ~]# history 4

108  pwd

109  pwd

110  pwd

111  history

若你设置:export HISTCONTROL=ignoredups,而你再次连续输入三次pwd,执行history就只会显示一条pwd命令了.

 

2.2 使用HISTCONTROL消除整个历史中重复命令

[root@sqj2015 home]# history 4

97  cd /home/

98  pwd

99  history

100  history 4

设置HISTCONTROL为erasedups,export HISTCONTROL=erasedups;这时候,当我再次键入pwd 命令,然后使用history会有什么样的结果:

[root@sqj2015 home]# history 5

97  cd /home/

98  history

99  history 4

100  pwd

101  history 5

你会发现,cd /home 下的pwd命令条目消除了.

 

2.3 使用HISTCONTROL 强制history忽略某条特定命令

设置HISTCONTROL为ignorespace(export HISTCONTROL=ignorespace)后,在执行一条命令时,在该命令前加一个空格来指示history忽略该命令.如下:

[root@sqj2015 home]# export HISTCONTROL=ignorespace

[root@sqj2015 home]#  cd /

[root@sqj2015 /]# history 3

105  history

106  export HISTCONTROL=ignorespace

109  history 3

很明显cd / 这条命令在history历史条目中被隐藏了.

 

2.4 查看/设置HISTCONTROL变量值

echo $HISTCONTROL    //查看HISTCONTROL值

export HISTCONTROL=ignoredups/erasedups/ignorespace/  //设置HISTCONTROL值

若设置export HISTCONTROL=  ,为空,则会取消所有设定.

 

3使用c选项清除所有历史命令

有时候你或许想要清楚之前所有的历史命令,而你又不想让history继续工作.就可以执行history -c 命令.

 

4 替换命令历史中的内容

当你搜索历史命令时,你可能希望执行一个与刚刚查找到的历史命令具有相同的参数的命令,例如:  “!!:$”可以将前一个命令参数作为当前命令参数;“!^”把上一个命令的第一个参数传递给当前命令;“!$”把上一个命令的最后一个参数传递给当前命令.

[root@sqj2015 /]# touch 01.txt 02.txt 03.txt

[root@sqj2015 /]# ls 01.txt

01.txt

[root@sqj2015 /]# vi !!:$

vi 01.txt

 

[root@sqj2015 /]# ls 01.txt 02.txt 03.txt

01.txt  02.txt  03.txt

[root@sqj2015 /]# vi !^

vi 01.txt

 

[root@sqj2015 /]# ls 01.txt 02.txt 03.txt

01.txt  02.txt  03.txt

[root@sqj2015 /]# vi !$

vi 03.txt

 

5 替换特定命令的特定参数

[root@sqj2015 /]# ls 01.txt 02.txt 03.txt

01.txt  02.txt  03.txt

[root@sqj2015 /]# vi !ls:2

vi 02.txt

[root@sqj2015 /]# vi !ls:3

vi 03.txt

同样可以使用“!ls:^”“!ls:$”来指定第一个或最后一个参数.

 

6 使用HISTSIZE禁用history

若你想禁用history,又不让bashshell记录你的命令,就可以把HISTSIZE设为0;

export HISTSIZE=0,这样执行history后就不会显示任何信息了.

 

7 使用HISTIGNORE让history在存储时忽略某些指令

有时候你不想在记录中看到诸如pwd ls 之类的基本命令,可以用HISIGNORE忽略这些指令.但要注意:在HISTIGNORE中添加ls只忽略ls,不忽略ls -l ,所以一定要写出要忽略的指令.

[root@sqj2015 /]# export HISTIGNORE=”pwd:ls:”

[root@sqj2015 /]# pwd

/

[root@sqj2015 /]# ls

[root@sqj2015 /]# ls -l

[root@sqj2015 /]# history 5

13  vi 01.txt

14  vi 03.txt

15  export HISTIGNORE=”pwd:ls:”

16  ls -l

17  history 5

相关博客:http://blog.sina.com.cn/s/blog_ecd48c580102vxjn.html

 

TAGS: ,
七月 27th, 2015

某些时候,可能会用到记录命令的执行时间的问题,所以在这里来给大家介绍一下

编辑/etc/bashrc,添加以下配置信息:

# 让系统记录每条历史命令的执行时间。注意最后的”号前面要放个空格,否则时间就与命令在一起,不方便也不美观

export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "

# 以下是关于记录文件大小与命令条数的设置,根据需要来设置

# 设置保存历史命令的文件大小

export HISTFILESIZE=1000000

# 保存历史命令条数

export HISTSIZE=2000

 

执行下面的命令使配置立即生效:

source /etc/bashrc

 

再次查看历史命令记录:

history
就可以看到了。

 

TAGS: ,