У меня есть любопытная проблема с 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
делает:
ssh
scp -t (target path)
через канал, как если бы вы использовали ssh user@target scp -t /this/file
команда.Вы можете эмулировать 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=