Есть ли защита BASH для удаленной копии корневых файлов?

Я подумал, что, возможно, проблема связана с моей версией zsh, поэтому я очистил пакет zsh и скомпилировал его из исходного кода:

% sudo aptitude install git-core gcc make autoconf yodl libncursesw5-dev texinfo

% git clone git://zsh.git.sf.net/gitroot/zsh/zsh
% cd zsh
% git checkout zsh-5.3.1

% ./Util/preconfig

% ./configure --build=x86_64-linux-gnu \
--prefix=/usr \
--includedir=/usr/include \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/usr/lib/x86_64-linux-gnu \
--libexecdir=/usr/lib/x86_64-linux-gnu \
--bindir=/bin \
LDFLAGS="-Wl,--as-needed -g" \
--enable-maildir-support \
--enable-etcdir=/etc/zsh \
--enable-function-subdirs \
--enable-site-fndir=/usr/local/share/zsh/site-functions \
--enable-fndir=/usr/share/zsh/functions \
--with-tcsetpgrp \
--with-term-lib="ncursesw tinfo" \
--enable-cap \
--enable-pcre \
--enable-readnullcmd=pager \
--enable-custom-patchlevel=Debian \
--enable-additional-fpath=/usr/share/zsh/vendor-functions,/usr/share/zsh/vendor-completions \
--disable-ansi2knr

Я нашел зависимости и параметры конфигурации, прочитав INSTALL, а также этот текст, найденный в Google:

https://gist.github.com/nicoulaj/715855

… и глядя на то, как разработчики Ubuntu скомпилировали последние пакеты zsh:

https://launchpadlibrarian.net/280509421/buildlog_ubuntu-yakkety-amd64.zsh_5.2-5ubuntu1_BUILDING.txt.gz

Были некоторые опции, которые были написаны дважды, или не были распознаны zsh, поэтому я их удалил. Значение, которое разработчики Ubuntu присвоили LDFLAGS, похоже, не работало на моей машине, поэтому я скопировал тот из сути на Github. Параметры, которые я оставил, описаны в ./configure --help:

--build=BUILD           configure for building on BUILD [guessed]

--prefix=PREFIX         install architecture-independent files in PREFIX
                        [/usr/local]

--includedir=DIR        C header files [PREFIX/include]

--mandir=DIR            man documentation [DATAROOTDIR/man]

--infodir=DIR           info documentation [DATAROOTDIR/info]

--sysconfdir=DIR        read-only single-machine data [PREFIX/etc]

--localstatedir=DIR     modifiable single-machine data [PREFIX/var]

--libdir=DIR            object code libraries [EPREFIX/lib]

--libexecdir=DIR        program executables [EPREFIX/libexec]

--bindir=DIR            user executables [EPREFIX/bin]

 LDFLAGS                linker flags, e.g. -L if you have libraries in a
                            nonstandard directory 

--enable-maildir-support
                        enable maildir support in MAIL and MAILPATH

--enable-etcdir=DIR     the default directory for global zsh scripts

--enable-function-subdirs
                        install functions in subdirectories

--enable-site-fndir=DIR same for site functions (not version specific)

--enable-fndir=DIR      the directory in which to install functions

--with-tcsetpgrp        assumes that tcsetpgrp() exists and works correctly

 --with-term-lib=LIBS   search space-separated LIBS for terminal handling

 --enable-cap           enable the search for POSIX capabilities (may
                        require additional headers to be added by hand)

--enable-pcre           enable the search for the pcre library (may create
                        run-time library dependencies)

--enable-readnullcmd=PAGER
                        pager used when READNULLCMD is not set

--enable-custom-patchlevel
                        set a custom ZSH_PATCHLEVEL value

--enable-additional-fpath=DIR
                        add directories to default function path

--enable-ansi2knr       translate source to K&R C before compiling

Компиляция работала, но было 2 сбоя среди 48 тестов, выполненных командой make check:

% make
% make check
…
**************************************
46 successful test scripts, 2 failures, 0 skipped
**************************************
Makefile:187: recipe for target 'check' failed
make[1]: *** [check] Error 1
make[1]: Leaving directory '/home/user/GitRepos/zsh/Test'
Makefile:263: recipe for target 'check' failed
make: *** [check] Error 2

Я не мог избавиться от них.

Наконец, вместо использования make install для установки двоичного файла я использовал checkinstall, чтобы получить .deb, который я могу удалить, если мне нужно будет изменить оболочку в будущем (с помощью dpkg -r zsh):

% sudo checkinstall

При установке мне пришлось дать краткое описание (я использовал оболочку с большим количеством характеристики), и что более важно, я должен был дать версию. Без версии, совместимой с политикой Debian, checkinstall не сгенерировал .deb. Я просмотрел вывод apt-cache policy zsh, чтобы проверить какая схема именования используется Debian, и выбрал 5.3.1-1ubuntu2.

% echo /bin/zsh >> /etc/shells
% chsh  →  /bin/zsh

Эти 2 строки были необходимы для того, чтобы Ubuntu распознал /bin/zsh как допустимую оболочку для входа в систему и сделал ее моей оболочкой по умолчанию.

Теперь версия оболочки 5.3.1 (вместо 5.1.1):

% zsh --version
    zsh 5.3.1 (x86_64-pc-linux-gnu)

И оболочка запускается быстро (около 0,04 с ):

% repeat 10 =time zsh -i -c exit

    0.06user 0.03system 0:00.12elapsed 80%CPU (0avgtext+0avgdata 5592maxresident)k
    0inputs+0outputs (0major+5668minor)pagefaults 0swaps
    0.06user 0.01system 0:00.09elapsed 77%CPU (0avgtext+0avgdata 5480maxresident)k
    0inputs+0outputs (0major+5634minor)pagefaults 0swaps
    0.04user 0.01system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
    0inputs+0outputs (0major+5641minor)pagefaults 0swaps
    0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5652maxresident)k
    0inputs+0outputs (0major+5645minor)pagefaults 0swaps
    0.03user 0.03system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
    0inputs+0outputs (0major+5634minor)pagefaults 0swaps
    0.04user 0.01system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5548maxresident)k
    0inputs+0outputs (0major+5624minor)pagefaults 0swaps
    0.04user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5612maxresident)k
    0inputs+0outputs (0major+5655minor)pagefaults 0swaps
    0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5780maxresident)k
    0inputs+0outputs (0major+5624minor)pagefaults 0swaps
    0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5584maxresident)k
    0inputs+0outputs (0major+5641minor)pagefaults 0swaps
    0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5668maxresident)k

При первой компиляции я забыл переключиться на последнюю ветку релиза, поэтому был на мастере.
У этой разрабатываемой версии zsh время запуска было даже хуже, чем у версии из репозиториев Ubuntu. Примерно 0,42 с для запуска оболочки. Но опять же, только если я добавил каталог в fpath в zshrc и создал файл внутри последнего (достаточно было простого touch-файла).

Так что мне интересно, возникла ли проблема из-за опций компиляции или из-за релизной версии. Надеюсь, релизная версия, которую я скомпилировал, останется быстрой…

Спасибо @thrigh и @Stéphane Chazelas за помощь в комментариях.

1
29.03.2016, 21:45
0 ответов

Теги

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