当在 Google 上搜索执行此操作的方法时,我所能找到的只是退出会话而不保存历史记录的方法(例如kill -9 $$
),但我遇到了相反的问题。我想保存所有历史记录,而不是命令exit
。
Comcast 在工作中确实虐待了我们,以至于我们的 SSH 隧道在不损坏管道的情况下无法保持超过 5 分钟。重新连接后,我去运行最后一个命令,果然,我忘记了现在exit
!
答案1
shell 将从您的终端(即 shell 的标准输入)读取命令,直到被告知停止(通过输入命令exit
)或遇到文件结尾 (EOF) 时(就像 shell 执行脚本时一样) 。
如果输入exit
命令,该命令将首先保存到历史记录中,然后 shell 将退出。输入ctrl——D生成EOF;由于这不是命令而是输入状态,因此无法将其保存在 shell 的历史记录中。
请注意,您可以指示bash
忽略 EOF;这可以通过两种方式完成:
- 设置-o忽略
- 忽略EOF=
n
第一种方法相当于执行IGNOREEOF=10
,这意味着您必须连续按ctrl- D10 次,shell 才会退出。这是为了防止意外终止 shell,例如如果您输入错误ctrl或C其他任何情况。
另请注意,ctrl-仅在作为一行中的第一个内容输入时(即在输入之后)D生成,如果该行上已经输入了任何内容,则忽略它。EOF
bash
ctrl-也在shell外部D生成。EOF
例如:
$ wc
foo bar
<ctrl-D>
1 2 8
wc
已统计 1 行、2 个单词、8 个字符(包括换行符)。
这是一个在行上给出一些输入后使用ctrl-的示例:D
$ wc
foo bar<ctrl-D><ctrl-D> 0 2 7
现在wc
已计算出零行(没有enter
给出)、2 个单词和 7 个字符。两个ctrl-D序列是必要的,因为数据已经给出;请注意,它bash
会专门处理此问题(忽略EOF
是否已在该行中输入某些内容),而eg则dash
不会。这可能是由于bash
.
答案2
如果@StéphaneChazelas 建议增加ServerAliveInterval
不起作用(也许尝试使用 的值300
),那么您可能需要考虑 GNU 之类的东西screen
,tmux
这样您就可以恢复断开的连接。
~/.bashrc
我在所有远程系统的顶部都有这个:
screen -r >/dev/null 2>&1
如果您缺少断开连接的屏幕会话(例如,如果这是您的第二个连接,或者您刚刚重新启动),则这不会执行任何操作,但如果您确实有屏幕会话(未连接到其他地方),它将自动重新连接您。砰,您以前的所有历史记录(和活动命令等)都被恢复。 (这假设您screen
在第一次登录时启动。)
我还将其与循环 SSH 连接结合起来。这是一个简单的版本来说明我正在谈论的内容:
while sleep 1; do ssh remotehost; done
这样,当您断开连接时,您将自动重新连接(这甚至是透明的,假设您有 ssh 密钥并且正在使用ssh-agent
无密码密钥)。