我在 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?
此致
答案1
SSH 守护程序不会scp
直接使用该程序,因此您无法将其重新配置为使用其他二进制文件。您需要scp
从系统中删除除“正确”二进制文件之外的所有二进制文件,或者重写PATH
环境变量(最好在系统默认配置文件中),因为从 SSH 守护程序的角度来看,scp
它只是运行远程命令的包装器。
基本上,这是scp
做的:
- 通过以下方式发起连接
ssh
scp -t (target path)
通过通道 发送命令,就像您使用了该ssh user@target scp -t /this/file
命令一样。- 发送访问模式和文件长度,以“\n”结尾。
- 通过 SSH 通道发送文件内容。
您可以使用以下命令模拟 scp:
ssh user@host scp -t /tmp/aFile.to.create
(enter your password)
C0664 41 originalFileName
The file should contain
these two lines.
(press enter twice)
第三行包含访问权限、文件大小和原始文件名。由于scp
命令是“按原样”发送的,因此由目标系统来为用户找到该程序。
答案2
根据@Lacek 的回答中提供的出色信息以及以下记录中关于如何sshd
管理的信息systemd
,我认为这应该很容易解决。
就像我可以添加PATH=/path/to/new/ssh/bin:$PATH
到我的 bash 配置文件一样,我可以将其添加到/etc/systemd/system/sshd.service
via Environment="PATH=/path/to/new/ssh/bin:$PATH"
(据记载)或者我可以/etc/default/ssh
直接将其添加到。
这是最新的 Ubuntu 系统的样子:
ubuntu@ip-10-10-0-192:~$ find /etc/systemd/ -name '*ssh*' -ls
557 0 lrwxrwxrwx 1 root root 31 Oct 12 2018 /etc/systemd/system/multi-user.target.wants/ssh.service -> /lib/systemd/system/ssh.service
587 0 lrwxrwxrwx 1 root root 31 Oct 12 2018 /etc/systemd/system/sshd.service -> /lib/systemd/system/ssh.service
ubuntu@ip-10-10-0-192:~$ cat /etc/systemd/system/sshd.service
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
[Install]
WantedBy=multi-user.target
Alias=sshd.service
ubuntu@ip-10-10-0-192:~$ cat /etc/default/ssh
# Default settings for openssh-server. This file is sourced by /bin/sh from
# /etc/init.d/ssh.
# Options to pass to sshd
SSHD_OPTS=
答案3
我们已经解决了:-)
设置 PATH 环境变量没有用,因为PATH 在 SSHD 的二进制文件中被硬编码(我们已经验证它正在观察 /proc 虚拟文件系统下 sshd 进程的 environment 文件)。
所以问题在于我们的目录被添加到了 sshd 源中的配置文件中后正常系统的路径。解决方法是将源文件中的 configure 文件的 19346 行改为
user_path=$t_bindir:$user_path
代替
user_path=$user_path:$t_bindir
($t_bindir 是在 make 编译前执行 configure 时在 --bindir 选项中设置的路径,$user_path 是环境变量 PATH 值)
因此,为了更清楚地显示,源文件中配置文件的 19343 - 19350 行保持为
if test $? -ne 0 ; then
echo $user_path | grep "^$t_bindir" > /dev/null 2>&1
if test $? -ne 0 ; then
user_path=$t_bindir:$user_path
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Adding $t_bindir to USER_PATH so scp will work" >&5
$as_echo "Adding $t_bindir to USER_PATH so scp will work" >&6; }
fi
fi
此致