当我关闭 SSH 连接时,如何防止仅保存“退出”?

当我关闭 SSH 连接时,如何防止仅保存“退出”?

当在 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,例如如果您输入错误ctrlC其他任何情况。

另请注意,ctrl-仅在作为一行中的第一个内容输入时(即在输入之后)D生成,如果该行上已经输入了任何内容,则忽略它。EOFbash

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 之类的东西screentmux这样您就可以恢复断开的连接。

~/.bashrc我在所有远程系统的顶部都有这个:

screen -r >/dev/null 2>&1

如果您缺少断开连接的屏幕会话(例如,如果这是您的第二个连接,或者您刚刚重新启动),则这不会执行任何操作,但如果您确实有屏幕会话(未连接到其他地方),它将自动重新连接您。砰,您以前的所有历史记录(和活动命令等)都被恢复。 (这假设您screen在第一次登录时启动。)

我还将其与循环 SSH 连接结合起来。这是一个简单的版本来说明我正在谈论的内容:

while sleep 1; do ssh remotehost; done

这样,当您断开连接时,您将自动重新连接(这甚至是透明的,假设您有 ssh 密钥并且正在使用ssh-agent无密码密钥)。

相关内容