AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 965259
Accepted
Ciges
Ciges
Asked: 2019-05-01 03:52:14 +0800 CST2019-05-01 03:52:14 +0800 CST 2019-05-01 03:52:14 +0800 CST

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

  • 772

我对 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?

此致

linux
  • 3 3 个回答
  • 1414 Views

3 个回答

  • Voted
  1. Lacek
    2019-05-01T05:11:47+08:002019-05-01T05:11:47+08:00

    它不是scp直接使用该程序的 SSH 守护程序,所以不,您不能重新配置它以使用另一个二进制文件。您需要从系统中删除除“正确”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命令“按原样”发送,因此由目标系统为用户找到该程序。

    • 6
  2. Bruno Bronosky
    2019-05-02T18:50:41+08:002019-05-02T18:50:41+08:00

    基于@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=
    
    • 0
  3. Best Answer
    Ciges
    2019-05-12T06:38:34+08:002019-05-12T06:38:34+08:00

    我们已经解决了:-)

    设置 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 行保持为

    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
    

    此致

    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve