Match Exec 无法执行任何操作

kab*_*nus 3 ssh ssh-config windows-subsystem-for-linux

测试SSHMatch Exec功能。我有这个最小的~/.ssh/config

Match Exec echo
   ServerAliveInterval 60
Run Code Online (Sandbox Code Playgroud)

我正在跑步

ssh localhost
Run Code Online (Sandbox Code Playgroud)

我得到

Unable to execute 'echo': No such file or directory
Run Code Online (Sandbox Code Playgroud)

无论我是否使用完整路径,或者使用双引号还是单引号,都是如此。我也尝试echo在我的.ssh文件夹中放置一个假脚本。我尝试了多个命令 ( test, nc, connect)。似乎该Exec功能根本看不到我的路径。

我正在使用 OpenSSH 运行 WSL Debian。我的最终目标是测试$http_proxymatch 子句中是否可达,以便自动使用代理,但让上述工作正常工作就足够了。

Ken*_*ter 10

要调用“匹配”指令,ssh 实际上调用:

$SHELL -c 'command'
Run Code Online (Sandbox Code Playgroud)

"$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));
Run Code Online (Sandbox Code Playgroud)

请注意,execv()它不会为正在执行的 shell 搜索任何类型的路径,因此 SHELL 必须是一个完整的路径名,如“/bin/bash”或“/usr/local/bin/zsh”。

如果 shell 已启动,然后无法运行“echo”,那么您会从 shell 收到错误消息。但是您得到的错误来自 ssh。这意味着问题在于调用 shell,而不是“echo”命令。

最简单的解释是你的 SHELL 环境变量无效。它指的是丢失的文件,或者它位于您无法读取的目录中。

  • 如果您的 SHELL 只是“bash”,那就是问题所在。它应该是程序的完整路径,例如另一个答案中的“/bin/bash”。 (5认同)

小智 5

您应该将SHELL环境变量设置为 shell 的完整路径,而不仅仅是bashzsh

尝试:

SHELL=/bin/bash ssh user@host
Run Code Online (Sandbox Code Playgroud)