Есть ли способ найти скрытые параметры и аргументы для команды / пакета, которые не задокументированы?

В Linux, если я устанавливаю новый пакет, и он содержит команды, которые я раньше не использовал, есть ли способ найти скрытые параметры и аргументы, которые не описаны на странице MAN или с помощью параметра --help.

Недавно я наткнулся на несколько пакетов, в которых были скрытые опции, о которых я бы не знал, если бы не нашел их в Интернете при устранении неполадок.

3 ответа

Решение

Не все с открытым исходным кодом, даже в Linux, поэтому, если исходный код по какой-то причине вам не доступен, возможно, просто потому, что вы не хотите заниматься поиском исходного кода и его загрузкой или просмотром в Интернете, вы можете найти подсказки, ища строки в двоичном файле команды.

strings Команда точно предназначена для извлечения читаемых строк из двоичного файла.

Например, вы сейчас lsкоманда принимает -T <tabsize> вариант, поэтому при условии, что он использует getopt разобрать свои аргументы, последовательность символов T: должно быть в getopt список опций.

Это действительно так:

$ strings /bin/ls | grep T:
abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1

Все буквы являются вариантами, поэтому вы можете проверить, все ли задокументированы или нет.

Вы также можете искать длинные опции, но если у вас уже нет понятия о том, какими могут быть имена скрытых опций, это более сложно, так как вам нужно просмотреть все строки.

Если вы уже знаете одну из длинных опций, вы можете ограничить поиск строками, которые появляются рядом с ними.

Оставаясь с ls случай, вы найдете все эти строки вокруг tabsize опция:

$ strings /bin/ls | less
...
no-group
hide-control-chars
reverse
almost-all
ignore-backups
classify
file-type
dereference-command-line
hide
ignore
dereference
literal
quote-name
recursive
show-control-chars
tabsize
time-style
block-size
context
author
help

Вы можете найти только скрытые параметры и аргументы в исходном коде, но это не проблема, поскольку GNU/Linux является открытым исходным кодом. На программах, написанных на C, вы начинаете с просмотра main() функционировать как int argc для подсчета аргументов и char *argv[] массив указателей на аргументы обрабатываются.

#include <stdio.h>

int main( int argc, char *argv[] )  {

  if( argc == 2 ) {
    printf("The argument is %s\n", argv[1]);
  }
  else {
    printf("Exactly one argument expected.\n");
  }
}

Опции также передаются из командной строки в программу в качестве аргументов. Если варианты передаются с использованием getopt() API, вы, вероятно, увидите while циклическая проверка параметров с помощью switch - case, Это позволяет анализировать параметры и их аргументы независимо от их порядка.

Обычно, getopt вызывается в цикле. когда getopt возвращается -1, указывая, что больше нет опций, цикл завершается.

  while ((c = getopt (argc, argv, "abc:")) != -1)
    switch (c)
      {
      case 'a':
        aflag = 1;
        break;
      case 'b':
        bflag = 1;
        break;
      case 'c':
        cvalue = optarg;
        break;
      case '?':
        if (optopt == 'c')
          fprintf (stderr, "Option -%c requires an argument.\n", optopt);
        else if (isprint (optopt))
          fprintf (stderr, "Unknown option `-%c'.\n", optopt);
        else
          fprintf (stderr,
                   "Unknown option character `\\x%x'.\n",
                   optopt);
        return 1;
      default:
        abort ();
      }

Второй цикл используется для обработки оставшихся неопционных аргументов.

  for (index = optind; index < argc; index++)
    printf ("Non-option argument %s\n", argv[index]);

Я бы начал поиск с поиска этих петель, а затем, где еще argv используется.

Проблема с недокументированными функциями / опциями / переключателями состоит в том, что, конечно, нет стандартного места, где вы можете их найти.

Исходный код является идеальным (или, возможно, первым) местом для поиска того, что поддерживается, но вам может потребоваться некоторый опыт разработки программного обеспечения, чтобы иметь возможность читать код и понимать смысл / реализацию определенной функции.

Многие разработчики, которые пренебрегают обновлением документации, по-прежнему будут упоминать новые функции в Changelog они поддерживают. Журналы изменений, хотя часто довольно лаконичны, но все же на обычном английском, а не на коде.

Даже если разработчик часто не поддерживает его, упаковщик все равно будет вести журнал изменений, который включает обзор обновлений безопасности и любых новых функций, которые были перенесены в бэкпорт.
Обычно сопровождающий пакета устанавливает список изменений в /usr/share/doc/<package-name/ и включает его версию в сам пакет, запросите ваши установленные пакеты RPM с rpm -q -changelog <package> или использовать apt-get changelog <package> на Debian и Ubuntu.

Один немного неясный пример:
-- насколько я знаю, опция не задокументирована явно для многих, если не для большинства команд, которые ее поддерживают, и она стала немного неясным синтаксисом.
Он находит свое происхождение в getopt Функция и используется для "разграничения конца опций и начала параметров" и является тем, что вы будете использовать, когда (возможно) ваши аргументы могут иметь вид опций. пример здесь

Другие вопросы по тегам