我基本上有与这里描述(并解决)的相同的问题: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
-O
scp
ssh
您可能能够使用包装器脚本获得可接受的结果。这是脚本:
#!/bin/sh
exec /usual/path/to/scp -O "$@"
您需要使用真实的完整路径scp
。将脚本保存为中比 中所有其他包含其他(实际上:真实)可执行文件scp
的目录更早的目录中。创建一个新目录并根据需要调整您的目录。使脚本可执行()。$PATH
$PATH
scp
$PATH
chmod +x scp
从现在起,任何继承了修改$PATH
并尝试运行的进程scp
都将运行包装器而不是真实的scp
。包装器将用真实的替换自身scp
,并将-O
与传递给包装器的所有参数保持一致。这种方式-O
将自动注入。
在某些情况下该方法不起作用:
如果进程调用的
scp
用途$PATH
不是您修改的,$PATH
那么它将找不到包装器,并且会scp
直接运行实际的包装器;因此-O
不会被注入。出于这个原因,您可能希望$PATH
尽可能“全局”地进行修改。如果某个进程
/usual/path/to/scp
明确调用,那么它显然会直接调用真实的,scp
而不管$PATH
;所以-O
不会被注入。
克服这些问题的一种方法是:
- 请勿修改
$PATH
。 - 将原始内容移动
scp
到不同的路径名。 - 在包装器中使用此路径名,这样包装器就可以
scp
像往常一样执行实际操作。 - 将包装器另存为
/usual/path/to/scp
。
缺点是,你的操作系统在升级时可能会用新版本的真实 替换包装器。这种事故不会发生在修改后未更改的scp
方法中。$PATH
/usual/path/to/scp