Есть ли способ найти скрытые параметры и аргументы для команды / пакета, которые не задокументированы?
В 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
Функция и используется для "разграничения конца опций и начала параметров" и является тем, что вы будете использовать, когда (возможно) ваши аргументы могут иметь вид опций. пример здесь