Назад | Перейти на главную страницу

Можно ли установить этот путь команды scp для использования демоном OpenSSH sshd?

У меня есть любопытная проблема с OpenSSH на серверах Linux SLES 12 SP4.

Мы устанавливаем настроенный OpenSSH на наших серверах, поэтому на каждой машине у нас есть две версии OpenSSH: официальный пакет операционной системы и тот, который мы скомпилировали.

В случае SLES 12 SP4, если мы запустим следующую команду с другого сервера

scp -r directory/. destination_server:/path/to/directory

возникает следующая ошибка

scp: error: unexpected filename: .

Мы проверили, что проблема связана с двоичным файлом scp в / usr / bin / scp, который запускается нашим OpenSSH вместо scp по его собственному пути.

После поиска и тестирования Применяемое решение - удалить права выполнения на / usr / bin / scp, поэтому наша версия OpenSSH не может его использовать, а команда scp -r из клиента работает отлично.

Есть ли более элегантный способ указать демону использовать двоичный файл scp по его собственному пути вместо / usr / bin / scp?

С уважением

Это не демон 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 команда отправлена ​​"как есть", целевая система должна найти эту программу для пользователя.

Мы ее решили :-)

Установка переменной среды PATH была бесполезна, потому что PATH жестко запрограммирован в двоичных файлах SSHD (мы проверили это, наблюдая за файлом окружения в виртуальной файловой системе / proc для процесса sshd).

Итак, проблема заключалась в том, что наш каталог был добавлен в файл конфигурации в sshd sources после путь нормальной системы. Решение состоит в том, чтобы изменить строку 19346 файла конфигурации в источниках на

user_path=$t_bindir:$user_path

вместо того

user_path=$user_path:$t_bindir

($ t_bindir - это путь, установленный в опции --bindir при выполнении configure перед компиляцией с помощью make, $ 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

С уважением

Основываясь на отличной информации в ответе от @Lacek и на том, что следующая стенограмма показывает, как sshd управляется systemd, Я бы сказал, что это должно быть довольно легко решить.

Таким же образом я могу добавить PATH=/path/to/new/ssh/bin:$PATH в мой профиль bash, я могу добавить его в /etc/systemd/system/sshd.service через 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=