每个配置文件的 scp -O(传统协议)选项?

每个配置文件的 scp -O(传统协议)选项?

我基本上有与这里描述(并解决)的相同的问题:https://stackoverflow.com/questions/74311661/subsystem-request-failed-on-channel-0-scp-connection-closed-macbook
这是:只有当我提供“-O”标志时,scp 到一些不支持 sftp 子系统的主机才会起作用。

但是有没有办法默认配置此行为?
例如通过 中的选项~/.ssh/config
关键是:对于手动使用,我只能使用alias scp='scp -O',但这在脚本和非 shell 操作(例如运行 ansible playbooks)中不起作用。

答案1

我认为您不能使用~/.ssh/config来解决您的问题,因为此文件用于ssh,而不是scp。这确实是后台scp用途,但您要强制的选项严格用于,而不是。ssh-Oscpssh

您可能能够使用包装器脚本获得可接受的结果。这是脚本:

#!/bin/sh
exec /usual/path/to/scp -O "$@"

您需要使用真实的完整路径scp。将脚本保存为中比 中所有其他包含其他(实际上:真实)可执行文件scp的目录更早的目录中。创建一个新目录并根据需要调整您的目录。使脚本可执行()。$PATH$PATHscp$PATHchmod +x scp

从现在起,任何继承了修改$PATH并尝试运行的进程scp都将运行包装器而不是真实的scp。包装器将用真实的替换自身scp,并将-O与传递给包装器的所有参数保持一致。这种方式-O将自动注入。

在某些情况下该方法不起作用:

  • 如果进程调用的scp用途$PATH不是您修改的,$PATH那么它将找不到包装器,并且会scp直接运行实际的包装器;因此-O不会被注入。出于这个原因,您可能希望$PATH尽可能“全局”地进行修改。

  • 如果某个进程/usual/path/to/scp明确调用,那么它显然会直接调用真实的,scp而不管$PATH;所以-O不会被注入。

克服这些问题的一种方法是:

  1. 请勿修改$PATH
  2. 将原始内容移动scp到不同的路径名。
  3. 在包装器中使用此路径名,这样包装器就可以scp像往常一样执行实际操作。
  4. 将包装器另存为/usual/path/to/scp

缺点是,你的操作系统在升级时可能会用新版本的真实 替换包装器。这种事故不会发生在修改后未更改的scp方法中。$PATH/usual/path/to/scp

答案2

从 OpenSSH 9.4 开始,选择 SCP 协议的唯一方法scp是通过-O转变

不涉及任何配置文件或任何其他内容。

因此所有解决方案都必须是 的外部解决方案scp。例如别名。

相关内容