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

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

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

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

scp -r каталог /. целевой_сервер: / путь / к / каталогу

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

scp: error: неожиданное имя файла:.

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

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

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

С уважением

2
задан 30 April 2019 в 14:52
3 ответа

Мы решили эту проблему: -)

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

Таким образом, проблема заключалась в том, что наш каталог был добавлен в файл конфигурации в источниках sshd после обычного системного пути . Решение состоит в том, чтобы изменить строку 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

С уважением

0
ответ дан 3 December 2019 в 09:14

Основываясь на отличной информации в ответе от @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=
0
ответ дан 3 December 2019 в 09:14

Это не демон SSH, который напрямую использует программу scp , поэтому нет, вы не можете перенастроить его для использования другого двоичного файла. Вам необходимо удалить все, кроме «правильных» scp двоичных файлов из системы, или переписать переменную среды PATH (желательно в системном профиле по умолчанию), потому что с точки зрения SSH демон, scp - это просто оболочка для запуска удаленной команды.

По сути, scp делает следующее:

  1. Инициирует соединение через ssh
  2. Отправляет команду scp -t (целевой путь) через канал, как если бы вы использовали команду 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
ответ дан 3 December 2019 в 09:14

Теги

Похожие вопросы