Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在启动SSH连接之前和SSH连接关闭之后运行本地命令?_Bash_Ssh - Fatal编程技术网

Bash 如何在启动SSH连接之前和SSH连接关闭之后运行本地命令?

Bash 如何在启动SSH连接之前和SSH连接关闭之后运行本地命令?,bash,ssh,Bash,Ssh,基本上,我想做的是运行我创建的Bash脚本,在启动SSH连接之前和SSH连接关闭之后切换WiFi ssid 我通过将ProxyCommand设置为//runscript,将其添加到~/.ssh/config;ssh%h:%p但是这样做,我觉得它会忽略我在运行ssh命令时传递的任何参数。另外,我不知道如何在SSH连接关闭时让脚本再次运行。假设无法实现“SSH”的包装器(使用别名或其他方法),则可以在proxy命令中实现以下内容 需要注意的重要一点是,没有针对多次调用“ssh”的保护措施—可能在特定

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


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

假设无法实现“SSH”的包装器(使用别名或其他方法),则可以在proxy命令中实现以下内容

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

代理脚本的可能实现是 ProxyCommand/path/to/run脚本%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”隧道。

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

但要使其工作,您还需要系统范围的选项(在
/etc/ssh/ssh\u config
中)
PermitLocalCommand
yes
。(默认设置为
no

它在认证后但在远程shell启动之前在本地计算机上执行


但是,在连接关闭后,似乎没有(简单的)执行方法。

为什么不创建一个别名?alias ssh_alias_name=/path/to/run script&&sshI只能怀疑
按字面理解。我认为ProxyCommand应该做它的后处理,当它的内部远程管道关闭时,它应该建立。基本上,您需要将
ssh
调用放在
运行脚本中,并将所有ssh令牌(如
%h
%p
)传递给脚本。谢谢!我使用了pre命令和
nc
命令,但post命令似乎没有运行。脚本似乎在
nc
完成后立即停止。有什么办法吗?@silverAndroid-将'-N'添加到nc应该会有所帮助。我有一台Mac电脑,我认为你的电脑上的
-N
与我的电脑上的不一样…NC 1.10-41.1(Linux Mint)已经-N关闭了stdin上EOF后的网络套接字。我无法访问Mac。作为一种选择,考虑SOCAT(SocaStdio TCP4:1美元:2美元)。在我的机器上,它正确地关闭了EOF上的套接字。