是否可以设置 scp 命令的路径供 OpenSSH sshd 守护程序使用?

是否可以设置 scp 命令的路径供 OpenSSH sshd 守护程序使用?

我在 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做的:

  1. 通过以下方式发起连接ssh
  2. scp -t (target path)通过通道 发送命令,就像您使用了该ssh user@target scp -t /this/file命令一样。
  3. 发送访问模式和文件长度,以“\n”结尾。
  4. 通过 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.servicevia 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

此致

相关内容