Como instruir o 'sshd' a usar seu caminho absoluto quando forking?

1

Eu tenho um antigo PowerMac G5 com um PowerPC que precisa de acesso SSH moderno. Não há suporte para fornecedores. Eu atualizei o OpenSSL e o OpenSSH e os instalei em /usr/local . O sshd atualizado está localizado em /usr/local/sbin/sshd e escuta na porta 1522.

As conexões com o servidor estão sendo recusadas e o cliente exibe ssh_exchange_identification: Connection closed by remote host . Eu habilitei -d logging no servidor e sua escrita /var/log/sshd.log:sshd re-exec requires execution with an absolute path para stderr .

Veja a transcrição completa em uma conexão de teste:

$ 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

Quando configurei o OpenSSH no tempo de compilação, não me lembro de uma opção relacionada ao comportamento do garfo. ./configure --help | egrep "(fork|re-exec)" não retorna nada. Eu configurei com ./configure --without-ssh1 --with-ssl-dir=/usr/local/ssl/darwin --with-zlib=/usr/local --prefix=/usr/local .

Como posso dizer ao sshd para usar seu caminho absoluto ( /usr/local/sbin/sshd ) quando forking?

EDITAR . Aparece que a mensagem de erro sshd re-exec requires execution with an absolute path é causada pelo seguinte em sshd.c . Está presente perto da linha 1625:

if (!test_flag && (rexec_flag && (av[0] == NULL || *av[0] != '/')))
    fatal("sshd re-exec requires execution with an absolute path");

Alterar o código para imprimir av[0] mostra que não há nenhum executável ou caminho. A nova mensagem (por causa das alterações abaixo) inclui (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>"));

Infelizmente, alteramos a plist para:

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/sshd -i -d</string>
    </array>

Resulta no seguinte (note que sshd.c ainda removeu o caminho absoluto que digitei em 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.

Eu não sei como / o que o Launchd usa para iniciar o daemon na inicialização, mas o plist é mostrado abaixo. A inicialização está bem; o problema ocorre quando um cliente se conecta durante o fork / exec.

Eu posso pará-lo assim que começar com sudo launchctl unload /System/Library/LaunchDaemons/ssh-7.1.plist . Eu posso reiniciá-lo com 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>
    
por jww 23.08.2015 / 19:22

1 resposta

1

O problema estava no arquivo plist copiado com base nas informações fornecidas em uma pergunta / resposta de falha do servidor . O plist precisa explicitamente chamar usr/local/sbin/sshd como ProgramArguments :

<?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.7-1</string>
    <key>Program</key>
    <string>/usr/local/sbin/sshd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/sshd</string>
        <string>-i</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>/dev/null</string>
    <key>SHAuthorizationRight</key>
    <string>system.preferences</string>
</dict>
</plist>
    
por 23.08.2015 / 22:21