У меня есть старый PowerMac G5 с PowerPC, который требует современного доступа по SSH. Там нет поддержки поставщика. Я обновил OpenSSL и OpenSSH и установил их в /usr/local
. Обновленный sshd
находится по адресу /usr/local/sbin/sshd
и прослушивает порт 1522.
Соединения с сервером отклоняются , и клиент отображает ssh_exchange_identification: Connection closed by remote host
. Я включил ведение журнала -d
на сервере, и его запись /var/log/sshd.log:sshd re-exec requires execution with an absolute path
к stderr
.
Вот полная расшифровка стенограммы тестового соединения:
$ grep -I -R sshd /var/log 2>/dev/null
/var/log/appfirewall.log:Aug 23 13:15:22 riemann.local socketfilterfw[122] <Info>: sshd is listening from 0.0.0.0:1522 proto=6
/var/log/appfirewall.log:Aug 23 13:15:22 riemann.local socketfilterfw[122] <Info>: sshd is listening from :::1522 proto=6
/var/log/sshd.log:Aug 23 13:16:43 riemann.local launchproxy[362] <Info>: /usr/local/sbin/sshd: Connection from: 127.0.0.1 on port: 49157
/var/log/sshd.log:sshd re-exec requires execution with an absolute path
Когда я настраивал OpenSSH во время сборки, я не вспоминаю опцию, связанную с поведением вилки. ./configure --help | egrep "(fork|re-exec)"
ничего не возвращает. Я настроил с помощью ./configure --without-ssh1 --with-ssl-dir=/usr/local/ssl/darwin --with-zlib=/usr/local --prefix=/usr/local
.
Как мне сказать sshd
использовать его абсолютный путь (/usr/local/sbin/sshd
) при разветвлении?
РЕДАКТИРОВАТЬ. Похоже, что сообщение об ошибке sshd re-exec requires execution with an absolute path
, вызвано следующим в sshd.c
Он присутствует возле линии 1625:
if (!test_flag && (rexec_flag && (av[0] == NULL || *av[0] != '/')))
fatal("sshd re-exec requires execution with an absolute path");
Изменение кода для печати av[0]
показывает, что нет исполняемого файла или пути. Новое сообщение (из-за изменений, приведенных ниже) включает в себя (re-exec with "-i -d")
.
if (!test_flag && (rexec_flag && (av[0] == NULL || *av[0] != '/')))
fatal("sshd re-exec requires execution with an absolute path (re-exec with \"%s\")", (av[0] ? av[0] : "<NULL>"));
К сожалению, изменение plist на:
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sshd -i -d</string>
</array>
Результаты следующие (заметьте, что sshd.c
все еще лишает абсолютного пути, который я ввел в argv[0]
):
$ sudo grep 'sshd' /var/log/* 2>/dev/null
/var/log/system.log:Aug 23 15:51:22 riemann.local sshd -i -d[1243]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
/var/log/system.log:Aug 23 15:51:22 riemann.local sshd -i -d[1243]: error: Bind to port 22 on :: failed: Address already in use.
/var/log/system.log:Aug 23 15:51:22 riemann.local sshd -i -d[1243]: fatal: Cannot bind any address.
Я не знаю, как / что Launchd использует для запуска демона при запуске, но список приведен ниже. Запуск в порядке; проблема возникает, когда клиент подключается во время форка / exec.
Я могу остановить его после запуска sudo launchctl unload /System/Library/LaunchDaemons/ssh-7.1.plist
. Затем я могу перезапустить его с помощью команды sudo launchctl load /System/Library/LaunchDaemons/ssh-7.1.plist
.
$ cat /System/Library/LaunchDaemons/ssh-7.1.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>com.openssh.sshd-v7.1</string>
<key>Program</key>
<string>/usr/local/sbin/sshd</string>
<key>ProgramArguments</key>
<array>
<string>-i -d</string>
</array>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>1522</string>
</dict>
</dict>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>StandardErrorPath</key>
<string>/var/log/sshd.log</string>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>