У меня есть любопытная проблема с 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?
С уважением
Мы решили эту проблему: -)
Установка переменной среды 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
С уважением
Основываясь на отличной информации в ответе от @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=
Это не демон SSH, который напрямую использует программу scp
, поэтому нет, вы не можете перенастроить его для использования другого двоичного файла. Вам необходимо удалить все, кроме «правильных» scp
двоичных файлов из системы, или переписать переменную среды PATH
(желательно в системном профиле по умолчанию), потому что с точки зрения SSH демон, scp
- это просто оболочка для запуска удаленной команды.
По сути, scp
делает следующее:
ssh
scp -t (целевой путь)
через канал, как если бы вы использовали команду 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
отправлена «как есть», целевая система должна найти эту программу для пользователя.