LinuxForum.Fans
Тема

PS1 in bash

Автор: Peter 15 сообщений 805 просмотров
17.10.2017 12:50 #425916

Здравствуйте!

Я как-то неудачно пересобрал bash-4.2, в результате после компиляции и установки
у меня перестали выполняться настроечные файлы, в которых есть проверка
на существование $PS1 - /etc/bash.bashrc и ~/.bashrc. Мне нужна была опция
-net-redirections. Похоже, что и ещё что-то испортилось.
А известно, с какими опциями configure стандартно собирается bash?
Или вообще без опций? Вот с какими собирал я:

text

./configure --enable-alias --enable-arith-for-command --enable-array-variables \
--enable-brace-expansion --enable-casemod-attributes --enable-net-redirections \
--enable-directory-stack --enable-prompt-string-decoding --enable-help-builtin \
--enable-extended-glob-default --enable-process-substitution --enable-progcomp \
--enable-strict-posix-default --enable-single-help-strings --enable-restricted \
--enable-casemod-expansions --enable-command-timing --enable-dparen-arithmetic \
--enable-cond-command --enable-mem-scramble --enable-readline --enable-history \
--enable-cond-regexp --enable-coprocesses --enable-job-control --enable-select \
--enable-separate-helpfiles --enable-disabled-builtins --enable-multibyte
17.10.2017 18:11 · отредактировано #425919

Я скомпилировал bash только с двумя опциями:
--enable-net-redirections --enable-disabled-builtins
Стало получше: теперь на момент запуска ~/.profile хоть какой-то $PS1 есть
и ~/.bashrc отрабатывает, но при запуске /etc/profile $PS1 отсутствует
и /etc/bash.bashrc не выполняется.
-net-redirections тоже не работает, хотя, как я прочитал в каком-то большом файле
по компиляции bash, эта опция включена по умолчанию.
Наверное, всё это чьи-то козни.

17.10.2017 18:25 #425920
"Peter" написал:
и /etc/bash.bashrc не выполняется.

Ну а если сделать так:
[console]# mkdir /etc/bash
# mv /etc/bash.bashrc /etc/bash/bashrc [/console]
У меня в gentoo собирается так:

text
./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --libdir=/usr/lib64 --with-installed-readline=. --with-curses --without-afs --enable-net-redirections --disable-profiling --disable-mem-scramble --without-bash-malloc --enable-readline --enable-history --enable-bang-history

Это с флагами указывает плюс:

text
- - afs          : Add OpenAFS support (distributed file system)
 - - bashlogger   : Log ALL commands typed into bash; should ONLY be used in restricted
                    environments such as honeypots
 - - examples     : Install examples, usually source code
 - - mem-scramble : Build with custom malloc/free overwriting allocated/freed memory
 + + net          : Enable /dev/tcp/host/port redirection
 + + nls          : Add Native Language Support (using gettext - GNU locale utilities)
 - - plugins      : Add support for loading builtins at runtime via 'enable'
 - + readline     : Enable support for libreadline, a GNU line-editing library that almost everyone
17.10.2017 20:28 #425922

ormorph,Благодарю за совет, попробую ваши опции.
А что такое profiling и почему его надо запрещать?
И почему надо самому беспокоиться о readline, и так же должна выбраться, какая надо?

17.10.2017 21:58 · отредактировано #425924
"Peter" написал:
А что такое profiling и почему его надо запрещать?

Это отключает профилирование gprof, т.е. собирается без опций компилятора -pg

"Peter" написал:
И почему надо самому беспокоиться о readline, и так же должна выбраться, какая надо?

Ну тут я просто привел с какими опциями у меня собирается bash gentoo, этот вывод показывает если выполнить:

text
# ebuild /usr/portage/app-shells/bash/bash-4.2_p53.ebuild configure

Указывать radline нужно что бы собиралось с поддержкой системной библиотеки readline.
Вот что по этому поводу пишется в ебилде:

text

    # Historically, we always used the builtin readline, but since
    # our handling of SONAME upgrades has gotten much more stable
    # in the PM (and the readline ebuild itself preserves the old
    # libs during upgrades), linking against the system copy should
    # be safe.
    # Exact cached version here doesn't really matter as long as it
    # is at least what's in the DEPEND up above.
    export ac_cv_rl_version=${READLINE_VER}

# Force linking with system curses ... the bundled termcap lib # sucks bad compared to ncurses. For the most part, ncurses # is here because readline needs it. But bash itself calls # ncurses in one or two small places :(

Т.е. можно и без нее:

text
--with-installed-readline

но тогда будет использоваться встроенная.

18.10.2017 20:55 #425928

ormorph, я потерпел полное фиаско - как в bash'е, скомпилированном с вашими опциями,
так в Astra Linux Orel 1.11 с дистрибутивным bash перенаправление из сокета в файл 3 не происходит.
ffmpeg сообщает, что нет такого файла, встроенная read тоже ничего и знего не читает.
Ещё в поддержке Astra мне написали, что эта опция могла быть отключена по требованию
регуляторов, по телефону мне не сказали, кто это, но после запуска configure в config.h есть строка

text
#define NETWORK_REDIRECTIONS 1
18.10.2017 21:39 #425929

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

Я как то напоролся на один глюк ядра, когда повысить привилегии просто было не реально, при чем только если работаешь в enlightenment, если переходишь на openbox, то все получается, откатился на другое ядро и все стало работать, при чем все это происходило с одними и теми же эмуляторами терминалов..

19.10.2017 00:41 #425931
"Peter" написал:
А что такое profiling и почему его надо запрещать?

Вы знаете, что такое профилировщик и для чего он нужен? Вот эта опция для анализа работы bash и нужна, для целей отладочных и/или оптимизационных.

19.10.2017 09:31 #425934

Нет, ядро дистрибутивное в обоих системах. Если только попробовать другую систему.
Также благодарю yars за ссылку.
Но ведь соединение происходит, не происходит перенаправление.

19.10.2017 10:12 #425935
"Peter" написал:
Но ведь соединение происходит, не происходит перенаправление.

Хм это как?

"Peter" написал:
так в Astra Linux Orel 1.11 с дистрибутивным bash перенаправление из сокета в файл 3 не происходит.

Т.е. exec отрабатывает, а направление в файл и обратно через канал &3 не идет?

19.10.2017 10:42 #425936

Программа с QTcpServer сообщает, что соединение наступило, сокет создаётся.
Я не знаю, отрабатывает ли exec, не только ffmpeg сообщает, что нет этого файла,
но и встроенная read из него не читает, как в примере из Интернета,
если сделать поиск по /dev/tcp.
М.б., в Astra это на уровне ядра отключено.

19.10.2017 12:50 #425937

Ну а такое работает?
[console]$ exec 3<>/dev/tcp/www.google.com/80
$ ( echo 'GET /search?q=man+bash HTTP/1.0'; echo; ) | sed 's/$/\r/' >&3
$ cat <&3[/console]

19.10.2017 14:12 #425938

Да, это работает, и такой тоже:

text

exec 3<>/dev/tcp/www.google.com/80
/bin/echo -e "GET /search?q=man+bash HTTP/1.0" "\r\n" >&3
cat <&3

Выводят
[console]
HTTP/1.0 302 Redirect
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 0
Connection: close
Location: http://192.168.0.1:4080/nonauth/nohost.php
[/console]
Но это не на том компьютере, на котором я пытаюсь перенаправить сокет в файл,
он не подключён к Интернету. Но я могу его подключить и тогда попробую на нём.
Благодарю за идею.

19.10.2017 14:28 #425939

Да, и на том компьютере это работает и возвращает то же самое.

19.10.2017 15:45 #425941

У меня стало получаться без всякого перенаправления с таким скриптом,
команда выделена
#!!!!!!!!!!!!!!!!!!!!!!!!!!!

text

#!/bin/bash

# 1st - port number, 2nd - fps nprt=$1 fps=$2 fout=${HOME}"/ffmpeg.avi" pprn=${HOME}"/image2avi_3.log" pprne=${HOME}"/image2avi_3e.log" idprn=${HOME}"/ffmpeg_id_3" #!/bin/bash

# 1st - port number, 2nd - fps nprt=$1 fps=$2 fout=${HOME}"/ffmpeg.avi" pprn=${HOME}"/image2avi_3.log" pprne=${HOME}"/image2avi_3e.log" idprn=${HOME}"/ffmpeg_id_3" rm -f $pprne $idprn $fout touch $pprne fpath=${HOME}"/hard/avi" fdt=`date +%Y_%m_%d_%H_%M_%S` flnm=${fdt}_${fps} fflnm=${fpath}/${flnm} vcod=libx264 hostn=`hostname` addrrs=`hostname -I` f_addr=`echo "$addrrs" | cut -d " " -f 1` msg="" echo $1 $2 $hostn $flnm $f_addr > $pprn

#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /usr/bin/ffmpeg -v error -f yuv4mpegpipe -i tcp://${f_addr}:${nprt} \ -r $fps -vcodec $vcod -vpre libx264-ultrafast-old \ -f avi $fout >& $pprne & #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! piav=`pidof ffmpeg` echo $piav > $idprn if [ -z $piav ] ; then echo "ffmpeg not running" >> $pprn else echo "ffmpeg is running" $piav >> $pprn fi

cnt=0 while [ "a" = "a" ] ; do pfmp=`pidof ffmpeg` if [ -z $pfmp ] ; then echo "ffmpeg not running" >> $pprn fi pfmp=`pidof main.elf` if [ -z $pfmp ] ; then exit 0 fi fdt=`date +%Y_%m_%d_%H_%M_%S` echo $fdt "cnt="$cnt >> $pprn let cnt++ sleep 1 done

Однако ffmpeg сообщает:
[console]tcp://192.168.1.7:6067: Operation not permitted[/console]
avi-файл построился, но картинок нет, бессмысленная мазня. Я содержимое
QImage попиксельно преобразую в YUV. М.б., надо в YCbCr?
Но всё равно не должно получаться мазни.

Войдите или зарегистрируйтесь, чтобы ответить.