![Match Exec 无法执行任何操作](https://linux22.com/image/13593/Match%20Exec%20%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%E4%BB%BB%E4%BD%95%E6%93%8D%E4%BD%9C.png)
测试SSHMatch Exec
特征。我有这个最小的~/.ssh/config
:
Match Exec echo
ServerAliveInterval 60
我正在跑步
ssh localhost
我明白了
Unable to execute 'echo': No such file or directory
无论我是否使用完整路径,或者使用双引号还是单引号,这都是如此。我也尝试echo
在我的文件夹中放入一个假脚本。.ssh
我已经尝试了多个命令(test, nc, connect
)。看来该Exec
功能根本看不到我的路径。
我正在使用 OpenSSH 运行 WSL Debian。我的最终目标是测试$http_proxy
match 子句中是否可达,以便自动使用代理,但让上述内容正常工作就足够了。
答案1
为了调用“match”指令,ssh 实际上调用:
$SHELL -c 'command'
“$SHELL”可以是 SHELL 环境变量的值,也可以是默认值,通常是“/bin/sh”。 “command”是来自“match”指令的命令。这里是执行命令的实际代码:
argv[0] = shell;
argv[1] = "-c";
argv[2] = xstrdup(cmd);
argv[3] = NULL;
execv(argv[0], argv);
error("Unable to execute '%.100s': %s", cmd, strerror(errno));
请注意,execv()
不会搜索正在执行的 shell 的任何类型的路径,因此 SHELL 必须是完整的路径名,例如“/bin/bash”或“/usr/local/bin/zsh”。
如果 shell 已启动但无法运行“echo”,那么您会从 shell 收到错误。但您收到的错误来自 ssh。这意味着问题出在调用 shell 上,而不是“echo”命令上。
最简单的解释是你的SHELL环境变量无效。它指的是一个丢失的文件,或者它位于您无法读取的目录中。
答案2
您应该将SHELL
环境变量设置为 shell 的完整路径,而不仅仅是bash
或zsh
。
尝试:
SHELL=/bin/bash ssh user@host