Użyjmy grep
, aby dostać się na pole do gry. Nie będę zawracać sobie głowy szukaniem default
, ponieważ dostanę zbyt wiele wyników, ale spróbuję Type "Help"
, która nie powinna pojawiać się zbyt wiele razy. Jeśli jest to ciąg znaków C, cytaty zostaną usunięte. Powinniśmy najpierw szukać łańcuchów C i łańcuchów Pythona.
Python $ grep 'Type \\"help\\"' . -Ir
./Modules/main.c: "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
Jest w Modules/main.c
w Py_Main()
. Więcej kopania daje nam ten wiersz:
fprintf(stderr, "Python %s on %s\n",
Py_GetVersion(), Py_GetPlatform());
Bo „on” jest w ciągu formatu, Py_GetPlatform()
musi być linux
i Py_GetVersion()
musi dać ciąg chcemy ...
Python $ grep Py_GetVersion . -Irl
...
./Python/getversion.c
...
To wygląda obiecująco. ..
PyOS_snprintf(version, sizeof(version), "%.80s (%.80s) %.80s",
PY_VERSION, Py_GetBuildInfo(), Py_GetCompiler());
musi Chcemy Py_GetBuildInfo()
, bo to w nawiasach ...
Python $ grep Py_GetBuildInfo . -Irl
...
./Modules/getbuildinfo.c
...
To wygląda na zbyt oczywiste.
const char *
Py_GetBuildInfo(void)
{
static char buildinfo[50 + sizeof(HGVERSION) +
((sizeof(HGTAG) > sizeof(HGBRANCH)) ?
sizeof(HGTAG) : sizeof(HGBRANCH))];
const char *revision = _Py_hgversion();
const char *sep = *revision ? ":" : "";
const char *hgid = _Py_hgidentifier();
if (!(*hgid))
hgid = "default";
PyOS_snprintf(buildinfo, sizeof(buildinfo),
"%s%s%s, %.20s, %.9s", hgid, sep, revision,
DATE, TIME);
return buildinfo;
}
Tak, default
to nazwa oddziału Mercurial. Sprawdzając pliki makefile, możemy stwierdzić, że pochodzi on z makro HGTAG
. Zmienna pliku Makefile o nazwie HGTAG
tworzy zmienną, która jest uruchamiana jako polecenie. Więc
Proste rozwiązanie
Przy budowie Python,
Python $ ./configure
Python $ make HGTAG='echo awesome'
Python $ ./python
Python 3.2.3 (awesome, May 1 2013, 21:33:27)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Możesz prawdopodobnie uzyskać słowo "__DATE__" lub "__TIME__", aby uzyskać odpowiedni kod. –
Możesz użyć tego kodu, aby zmienić to, co pokazuje interpreter - python -ic 'import sys; sys.ps1 = "$"; sys.ps2 = "" " – fixxxer