Linux

是否可以設置 scp 命令的路徑以供 OpenSSH sshd 守護程序使用?

  • May 11, 2019

我對 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的:

  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命令“按原樣”發送,因此由目標系統為使用者找到該程序。

基於@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=

引用自:https://serverfault.com/questions/965259