【问题标题】:How do I run a local command before starting SSH connection and after SSH connection closes?如何在启动 SSH 连接之前和 SSH 连接关闭之后运行本地命令?
【发布时间】:2019-10-01 14:42:26
【问题描述】:

基本上我想要做的是运行我创建的 Bash 脚本,该脚本在启动 SSH 连接之前和关闭 SSH 连接之后切换 WiFi SSID。

我已通过将 ProxyCommand 设置为 ./run-script; ssh %h:%p 将其添加到 ~/.ssh/config,但这样做,我觉得它会忽略我在运行 ssh 命令时传递的任何参数。另外,我不知道如何在 SSH 连接关闭时让脚本再次运行。

【问题讨论】:

  • 你为什么不创建一个别名?别名 ssh_alias_name = /path/to/run-script && ssh
  • 我只能怀疑,; 是字面意思。而且我认为 ProxyCommand 应该在其内部远程管道关闭时进行后处理,该命令应该建立。本质上,您需要将 ssh 调用放入您的 run-script 中,并将所有 ssh 令牌(如 %h%p)传递给您的脚本。

标签: bash ssh


【解决方案1】:

对于 OpenSSH,您可以在 ssh 配置中指定 LocalCommand (~/.ssh/config)。

但要使其正常工作,您还需要系统范围的选项(在 /etc/ssh/ssh_config 中)PermitLocalCommandyes。 (默认设置为no。)

它在身份验证之后但在远程 shell 启动之前在本地机器上执行。

不过,在连接关闭后似乎没有(简单的)方法可以执行某些操作。

【讨论】:

    【解决方案2】:

    假设无法实现 'ssh' 的包装器(使用别名或其他方法),则可以在 proxyCommand 中实现以下内容。

    需要注意的是,没有针对多次调用“ssh”的保护 - 可能在特定调用期间 WIFI 已经连接。此外,当特定的 ssh 终止时,WIFI 可能由于其他未决条件而必须保持活动状态。

    代理脚本的可能实现是 ProxyCommand /path/to/run-script %h %p

    #! /bin/sh
    pre-command      # connect to WIFI
    nc -N "$1" "$2"     # Tunnel, '%h' and '%p' are passed in
    post-command     # Disconnect WIFI
    

    您不想在代理脚本中使用简单的 ssh,因为这将转换为对“运行脚本”的另一个调用。另请注意,提供给原始 ssh 的所有选项都将由初始“ssh”会话处理,该会话将利用代理“nc”隧道。

    【讨论】:

    • 谢谢!我有 pre-command 和 nc 命令工作,但 post-command 似乎没有运行。脚本似乎在nc 完成后立即停止。有什么办法吗?
    • @silverAndroid - 将“-N”添加到 nc 应该会有所帮助。已回答修改
    • 我有一台 Mac,我认为你的机器上的 -N 和我的机器上的不一样...these are my options
    • NC 1.10-41.1 (Linux Mint) 有'-N 在标准输入 EOF 后关闭网络套接字'。我无法访问 Mac。
    • 作为替代方案,请考虑 'socat (socat STDIO tcp4:$1:$2'。在我的机器上,它正确关闭了 EOF 上的套接字。另请参阅:serverfault.com/questions/512722/…stackoverflow.com/questions/32838811/…
    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多