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_proxy
match 子句中是否可达,以便自动使用代理,但让上述工作正常工作就足够了。
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 环境变量无效。它指的是丢失的文件,或者它位于您无法读取的目录中。
小智 5
您应该将SHELL
环境变量设置为 shell 的完整路径,而不仅仅是bash
或zsh
。
尝试:
SHELL=/bin/bash ssh user@host
Run Code Online (Sandbox Code Playgroud)