如何维护开放的 ssh 连接并从 shell 脚本中使用它?

如何维护开放的 ssh 连接并从 shell 脚本中使用它?

目前我调用以下内容:

$ ssh [email protected] my_cmd

这很慢并且不容易安全地实现自动化。我想建立一次 ssh 连接,并有一些脚本将我的命令转发到 host.com 并打印输出。

那可能吗 ?

将我的机器添加到authorized_keys对我来说不是一个选择,并且它不能解决缓慢问题。

答案1

该功能称为ControlMaster在一个现有通道上进行复用。它导致 ssh 执行所有密钥交换并仅登录一次;因此,后面的命令将执行得更快。您可以使用以下三行来激活它.ssh/config

Host host.com
  ControlMaster auto
  ControlPath ~/.ssh/master-%C
  # for openssh < 6.7 you need to use this one:
  # ControlPath ~/.ssh/master-%r@%h-%p
  ControlPersist 5m

您可以根据您的需要进行调整;另一种选择是,您可以打开一个主连接,该连接在执行其他命令期间保持打开状态;那么你就不需要了ControlPersist

此功能有很多调整的可能性,但请确保将套接字存储ControlPath在安全的地方,其他用户无法读取,否则可能会被滥用。

更多信息可以在ssh_config(5)手册页中找到。

答案2

如果您可以控制机器并在其上自动执行任务,那么为什么不能将密钥添加到authorized_keys 中呢?

ssh-copy-id -i ~/.ssh/foo [email protected]

这样您就不必每次连接时都输入密码。

control master如果最大的问题是连接需要很长时间才能连接,您可以通过添加到 ssh 配置来重用单个连接。让该连接保持运行,任何后续连接都将几乎是瞬时的。

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600

https://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

从长远来看,如果您要自动化任务,那么使用为您建立连接的自动化框架可能会更好,例如:

相关内容