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

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

Я недавно наткнулся на пару пакетов, в которых были скрытые параметры, о которых я бы не узнал, если бы не узнал из Интернета при устранении проблемы.

0
задан 3 July 2018 в 12:55
3 ответа

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

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

Например, теперь команда ls принимает параметр -T , поэтому предполагается, что она использует 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
2
ответ дан 4 December 2019 в 11:15

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

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

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

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

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

1
ответ дан 4 December 2019 в 11:15

Скрытые параметры и аргументы можно найти только в исходном коде , но это не проблема, поскольку 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 , проверяющий параметры с помощью переключателя - case . Это позволяет анализировать параметры и их аргументы независимо от их порядка.

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

  while ((c = getopt (argc, argv, "abc:"))!  = -1)
  переключатель (c)
  {
  case 'a':
  aflag = 1;
  сломать;
  case 'b':
  bflag = 1;
  сломать;
  case 'c':
  cvalue = optarg;
  сломать;
  дело '?':
  если (optopt == 'c')
  fprintf (stderr, «Параметр -% c требует аргумента. \ n», optopt);
  иначе если (isprint (optopt))
  fprintf (stderr, "Неизвестный параметр` -% c '. \ n ", optopt);
  еще
  fprintf (stderr,
  "Неизвестный символ опции` \\ x% x '. \ N ",
  оптопт);
  возврат 1;
  по умолчанию:
  abort ();
  }
 

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

  for (index = optind; index 

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

3
ответ дан 4 December 2019 в 11:15

Теги

Похожие вопросы