フォークするときに絶対パスを使用するように `sshd`に指示する方法は?


1

最新のSSHアクセスを必要とするPowerPCを備えた古いPowerMac G5を使用しています。ベンダーのサポートはありません。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)を使用するように指示するにはどうすればよいですか?


EDIT。エラーメッセージの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が起動時にデーモンを起動するためにどのように/何を使用するのかわかりませんが、plistを以下に示します。スタートアップは問題ありません。この問題は、クライアントがfork / 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>

どのように始めsshdますか教えてください。再実行には絶対パスが必要です。つまり、直接起動することはできませんsshdが、のように完全なパスを指定する必要があります/usr/local/sbin/sshd。これがすべての魔法です
-Jakuje

@Jakuje-Launchdに関連する追加情報を追加しました。Launchdがどのように起動するかはよくわかりませんが、実際に起動するので問題ないと思います。この問題は、クライアントが接続するときにfork / execで発生するようです。
jww

sshd相対パスで開始する場合、私の経験から開始することさえ拒否する必要があります
...-寂退

はい、-dスイッチを削除しても、forkでreexecを交換するため、パスについて不平を言うことはもうないはずです(re-execはデバッグのみで使用されます)。
-Jakuje

@Jakuje-そのまま使用-iすると、元の問題が発生します。テストするMacがありますか?私が使用した手順は次のとおりです。OSX用のOpenSSHの構築?。私は他の人を助けるために使用した手順を書き起こしましたが、それはちょうど私を助けるかもしれません:)
jww

回答:


1

問題は、サーバー障害の質問/回答で提供され情報に基づいてコピーされたplistファイルにありました。plistは、明示的にusr/local/sbin/sshdaとしてコールアウトする必要があります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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.