В Linux, если я устанавливаю новый пакет и он содержит команды, которые я раньше не использовал, есть ли способ найти скрытые параметры и аргументы, которые не задокументированы на странице MAN или с параметром --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
используется.
Не все является открытым исходным кодом, даже в 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
Проблема с недокументированными функциями / параметрами / переключателями заключается в том, что, конечно, нет стандартного места, где вы могли бы их найти.
Исходный код - это окончательное (или, возможно, первое) место для поиска поддерживаемых функций, но вам может потребоваться некоторый опыт разработки программного обеспечения, чтобы иметь возможность читать код и понимать значение / реализацию определенной функции.
Многие разработчики, пренебрегающие обновлением документации, все равно будут упоминать новые функции в Changelog
они поддерживают. Журналы изменений, хотя часто довольно краткие, все же написаны на обычном английском языке, а не в коде.
Даже если разработчик не поддерживает его часто, упаковщик все равно будет вести журнал изменений, включающий обзор обновлений безопасности и любых новых функций, которые были портированный.
Обычно сопровождающий пакета устанавливает журнал изменений в /usr/share/doc/<package-name/
и включает его версию в сам пакет, запросите установленные пакеты RPM с помощью rpm -q -changelog <package>
или используйте apt-get changelog <package>
на Debian и Ubuntu.
Один несколько непонятный пример:
В --
Насколько я знаю, эта опция явно не задокументирована для многих, если не для большинства команд, которые ее поддерживают, и она стала немного неясным синтаксисом.
Он находит свое происхождение в getopt
функция и используется для «разграничить конец параметров и начало параметров» и это то, что вы использовали бы, когда (возможно) ваши аргументы могут иметь вид вариантов. пример здесь