我对 SLES 12 SP4 Linux 服务器中的 OpenSSH 有一个奇怪的问题。
我们在我们的服务器上安装了一个定制的 OpenSSH,所以在每台机器上我们都有两个版本的 OpenSSH,一个是操作系统的官方包,另一个是我们自己编译的。
对于 SLES 12 SP4,如果我们从另一台服务器运行以下命令
scp -r directory/. destination_server:/path/to/directory
出现以下错误
scp: error: unexpected filename: .
我们已经验证问题出在 /usr/bin/scp 下的 scp 二进制文件上,它是由我们的 OpenSSH 而不是它自己路径下的 scp 运行的。
经过搜索和测试,应用的解决方案是删除 /usr/bin/scp 的执行权限,所以我们的 OpenSSH 版本不能使用它,客户端的 scp -r 可以正常工作。
有没有更优雅的方式告诉守护进程在自己的路径下使用 scp 二进制文件而不是 /usr/bin/scp?
此致
它不是
scp
直接使用该程序的 SSH 守护程序,所以不,您不能重新配置它以使用另一个二进制文件。您需要从系统中删除除“正确”scp
二进制文件之外的所有二进制文件,或重写PATH
环境变量(最好在系统默认配置文件中),因为从 SSH 守护程序的角度来看,scp
它只是运行远程命令的包装器。基本上,这是做什么
scp
的:ssh
scp -t (target path)
命令,就像您使用ssh user@target scp -t /this/file
命令一样。您可以使用以下命令模拟 scp:
第三行包含访问权限、文件大小和原始文件名。并且由于
scp
命令“按原样”发送,因此由目标系统为用户找到该程序。基于@Lacek 回答中的出色信息以及以下记录显示的有关如何
sshd
由 管理的内容systemd
,我想说它应该很容易解决。就像我可以添加
PATH=/path/to/new/ssh/bin:$PATH
到我的 bash 配置文件一样,我可以将它添加到/etc/systemd/system/sshd.service
viaEnvironment="PATH=/path/to/new/ssh/bin:$PATH"
(如文档所示),或者我可以/etc/default/ssh
直接添加它。这是最近的 Ubuntu 系统的外观:
我们已经解决了:-)
设置 PATH 环境变量没有用,因为PATH 是硬编码在 SSHD 的二进制文件中(我们已经验证了它在 /proc 虚拟文件系统下为 sshd 进程观察环境文件)。
所以问题是我们的目录是在正常系统路径之后的 sshd 源的配置文件中添加的。解决方法是将sources中配置文件的第19346行更改为
user_path=$t_bindir:$user_path
代替
user_path=$user_path:$t_bindir
($t_bindir 是 make 编译前执行 configure 时 --bindir 选项中设置的路径,$user_path 是环境 PATH 值)
因此,为了更清楚地显示,源中配置文件的第 19343 - 19350 行保持为
此致