Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Shell scripts (sh, bash, zsh, tcsh)

Автор: lirik93
Дата сообщения: 28.12.2011 14:50
нужна помощь..((
написать скрипт , который проверит не запущена ли из директории программа, а если запущена, останавливает. (LINUX)
Автор: ASE_DAG
Дата сообщения: 28.12.2011 22:47
lirik93
> проверит не запущена ли из директории программа
«Запущена из директории» — это как? Является текущей рабочей — пожалуйста:
$ ps -A -o pid= | xargs pwdx | gawk -F ': ' '$2 == "/tmp" {print $1}'

А рабочая директория на момент запуска нигде не сохраняется.
Автор: gap5
Дата сообщения: 10.01.2012 20:03
...передумал...
Автор: turboon
Дата сообщения: 27.01.2012 10:58
Здравствуйте. Столкнулся с интересной непонятностью.
Изучаю bash, сравнение строк по ASCII кодам.
Например, согласно мануалу, выражения
if [[ "$a" > "$b" ]]
и
if [ "$a" \> "$b" ]
- это одно и тоже. Однако:
и
if [[ ":" < "0" ]]; then echo "Y"; fi
и
if [ ":" \> "0" ]; then echo "Y"; fi
оказываются истинны!
А почему - непонятно
Помогите разобраться, пожалуйста

Автор: ASE_DAG
Дата сообщения: 27.01.2012 12:43
turboon
> Например, согласно мануалу, выражения [[ "$a" > "$b" ]] и if [ "$a" \> "$b" ] - это одно и тоже.
В каком это мануале вы сие прочитали? В bash(1) белым по черному написано:

Цитата:
When used with [[, the < and > operators sort lexicographically using the current locale. The test command sorts using ASCII ordering.


В нейтральной локали, да, разницы не будет:
$ LANG=C
$ echo -e ':\nb\na\n0\n1' | sort
0
1
:
a
b


В иных локалях — вполне может быть (для этого, понятное дело, и делалось).
$ LANG=ru_RU.UTF-8
$ echo -e ':\nb\na\n0\n1' | sort
:
0
1
a
b


Использовать устаревшие (deprecated) возможности, оставленные для обратной совместимости, среди коих [, не надо.

P.S. Почему для русского языка установлен именно тот порядок сортировки, что установлен, — не знаю; стандарту (ГОСТ 7.25-2001) он не соответствует.
Автор: turboon
Дата сообщения: 27.01.2012 15:00

Цитата:
В каком это мануале вы сие прочитали?

В данном монументальном труде, например:
"Advanced Bash-Scripting Guide Автор: Mendel Cooper"
Спасибо! Теперь природа этого 'феномена' мне ясна

Кстати, может быть, вы еще подскажете.
Я использую сравнение по ASCII кодам, чтобы определить, является ли символ цифрой.
Вот так:
while [ "/" \< "$out" -a ":" \> "$out" ]; do ...
...

Возможно, есть более правильные методы для этого?
Автор: ASE_DAG
Дата сообщения: 27.01.2012 15:55
turboon
> Спасибо! Теперь природа этого 'феномена' мне ясна :-)
Всегда пожалуйста.

> Я использую сравнение по ASCII кодам, чтобы определить, является ли символ цифрой.
Ну, наверное, вполне допустимый подход, но, конечно, не в том виде, что вы привели.

По-хорошему это проверяется так: [[ $X == [0-9] ]].

Проверка, является ли строка $X целым числом (т.е. одной или более цифрой, опционально с лидирующим минусом) может выглядеть как [[ $X == ?(-)+([0-9]) ]] (экстглобом) или [[ $X =~ ^-?[0-9]+$ ]] (регекспом).
Автор: turboon
Дата сообщения: 30.01.2012 08:41
Большое спасибо за помощь.
Автор: perdun
Дата сообщения: 06.06.2012 07:29
есть некая утила, запрашивающая параметр (пароль) со стандартного ввода
как избавиться от "интерактивности"?
я так понимаю, надо переменную перенаправить в стдин..?
Автор: ASE_DAG
Дата сообщения: 06.06.2012 08:31
perdun
> надо переменную перенаправить в стдин
Да, но базовыми утилитами в ГНУ (да и в других системах, полагаю) этого не сделать. Воспользуйтесь специально для вашей задачи предназначенной утилитой expect.
Автор: perdun
Дата сообщения: 06.06.2012 09:51
ASE_DAG

Цитата:
утилитой expect

test# man expect
No manual entry for expect
чота нет такого..
а подробнее, что это?
====
я уж думаю на сях наколбасить чонить типа read(), write()
ну, блин, как то же просто должно быть..
Автор: DrakonHaSh
Дата сообщения: 06.06.2012 10:03
perdun

Цитата:
а подробнее, что это?

а в гугл вбить не пробовали ?


Цитата:
я уж думаю на сях наколбасить чонить типа read(), write()
ну, блин, как то же просто должно быть..

v1. echo pass | util
v2. utul < fileWithPass
только на стандартных утилитах вроде ssh/su/sudo (да, по идее и любых других стандартных) такое не прокатит - они пароли не просто с stdin читают
Автор: perdun
Дата сообщения: 06.06.2012 11:09
DrakonHaSh

Цитата:
а в гугл вбить не пробовали ?

пробовали
помогло, но не сильно %)
колупаюсь шас с пайпами, как в статье
там и експект, и емпти, и на перлах, и на тцл-ях хрен знает чо нагородить можно..
еслиб можно было юзать, что то, кроме "штатного"..
нету ничо! минимальная инсталляция)


Добавлено:
DrakonHaSh

Цитата:
v1. echo pass | util
v2. utul < fileWithPass

не катит, всё равно спрашивает

задача: авторизоваться на проксе посредством нетката
строка вида
nc -x192.168.0.1:3128 -Xconnect -Puser ya.ru 80
Автор: DrakonHaSh
Дата сообщения: 06.06.2012 11:49
perdun
когда-то подобной задачей интересовался
почитать можно здесь:
на ру-борде про юзание expect
эмуляция tty
эмуляция tty (не проверял и не вникал)
Автор: ASE_DAG
Дата сообщения: 06.06.2012 14:06
perdun
> еслиб можно было юзать, что то, кроме "штатного"..
А меж тем, вы только что собирались «на сях наколбасить чонить». Вижу здесь противоречие.
Автор: perdun
Дата сообщения: 06.06.2012 14:33
ASE_DAG

Цитата:
А меж тем, вы только что собирались «на сях наколбасить чонить». Вижу здесь противоречие.

да не, во фре gcc "по штату" полагается, даж в минималке)
Автор: ASE_DAG
Дата сообщения: 06.06.2012 16:49
perdun
Ну так ставьте expect и не морочьте себе и нам голову. ;-)
Автор: perdun
Дата сообщения: 06.06.2012 18:47
ASE_DAG

Цитата:
Ну так ставьте expect и не морочьте себе и нам голову.

ну дык.. а как до портов и сорцов добраться?
яж грю, нет ничо, удалось тока ttyecho скомпилять, а вот как передать в nc пароль неясно; базовый набор утил - inetd, nc, ssh (вроде есть опция в ssh "чегото" проксирования, тунеляния)
Автор: ASE_DAG
Дата сообщения: 06.06.2012 18:59
perdun
> а как до портов и сорцов добраться?
А это уже вам виднее, я понятия не имею, чем там у вас вызваны трудности с доступом к портам. Но как бы ни было, если вы можете собрать и выполнить ttyecho, то и expect можете, хотя это, возможно, и потребует несколько больших усилий.
Автор: DrakonHaSh
Дата сообщения: 06.06.2012 20:09
perdun

Цитата:
задача: авторизоваться на проксе посредством нетката
строка вида
nc -x192.168.0.1:3128 -Xconnect -Puser ya.ru 80


Цитата:
удалось тока ttyecho скомпилять, а вот как передать в nc пароль неясно;

=>

Код:
sudo ttyecho -n /dev/pts/0 'nc -x192.168.0.1:3128 -Xconnect -Puser ya.ru 80 > /tmp/output 2>/tmp/errOutput'
sudo ttyecho -n /dev/pts/0 'password'
sudo ttyecho -n /dev/pts/0 'GET http://ya.ru/ HTTP/1.1'
sudo ttyecho -n /dev/pts/0 'Host: ya.ru'
sudo ttyecho -n /dev/pts/0 ''
sudo ttyecho -n /dev/pts/0 ''

Автор: perdun
Дата сообщения: 07.06.2012 09:47
ASE_DAG

Цитата:
чем там у вас вызваны трудности с доступом к портам.

трудности вызваны тем, что всё закрыто к ипиням.. и на вылет, и на влёт
на вылет тока эта сГаная прокся с авторизацией
всё.
DrakonHaSh

Цитата:
ввод будет виден на /dev/pts/0
вывод будет в /tmp/output

эту скриптовую конструкцию надо запускать с pts/1? (не нулевой)
ибо, если запускать оттуда, откуда залогинился, получаем
Ambiguous output redirect.

у меня на линухе, ваш скрипт не признает опцию -Р, man отсутствует

Код: # cat errOutput
nc: invalid option -- 'P'
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port]
# man nc
bash: man: command not found
Автор: DrakonHaSh
Дата сообщения: 07.06.2012 10:20
perdun

Цитата:
эту скриптовую конструкцию надо запускать с pts/1? (не нулевой)
ибо, если запускать оттуда, откуда залогинился, получаем
Ambiguous output redirect.

я запускал и с /dev/pts/0 и /dev/pts/1 и вообще из под безконсольного apacha
попробуйте поменять /dev/pts/0 на /dev/pts/1 /dev/pts/2 ...
для работы ttyecho, как я понял, надо чтобы соответствующая консоль уже была запущена.


Цитата:
у меня на линухе, ваш скрипт не признает опцию -Р, man отсутствует

эта опция есть только в bsd порте nc


Цитата:
на фре второй строкой пароль, видимо, прилетает кудато не в "тот" буфер
потому как прокся не авторизует, говорит, failed

вставьте между первой и второй строкой скрипта вызов паузы на 2 сек:
sleep 2

еще попробуйте статически собрать expect на другой bsd и перенесите ее на свою (например через nc, как я писал в сообщении выше, если других стандартных способов вроде wget/ftp/http нет)

Автор: perdun
Дата сообщения: 07.06.2012 10:49
DrakonHaSh

Цитата:
вставьте между первой и второй строкой скрипта вызов паузы на 2 сек:
sleep 2

я так и делал, без слипа сразу видно было, что пароль не "по адресу"
со слипом, всё как бы хорошо, но проксятина, сцуко, умная похоже, распознает как то, откуда этот пароль прилетел.. и failed

=====
ладно, хер с ней, с автоматизацией..
как всё это руками запустить?
1. # nc -x192.168.0.1:3128 -Xconnect -Puser cvsup4.ru.FreeBSD.org 5999
Proxy password for user@192.168.0.1:
OK 17 0 SNAP_16_1h CVSup server ready
дальше чего?
2. надо как то через пайп или сокет отдать это в csup с его конфигом supfile
# nc -x192.168.0.1:3128 -Xconnect -Puser cvsup4.ru.FreeBSD.org 5999 | csup /root/supfile
Proxy password for webs@192.168.0.1:
Cannot connect to 212.188.8.40: Operation timed out
Cannot connect to 2a02:28:2:1::40: No route to host
Will retry at 14:52:26

и всё..
Автор: DrakonHaSh
Дата сообщения: 07.06.2012 11:22
perdun
пароль для прокси требует сам nc. т.е. в нем, в его способе ввода пароля загвоздка.

http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/
=>
http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/socks.c?rev=1.20;content-type=text%2Fplain
=>

Код:
static const char *
getproxypass(const char *proxyuser, const char *proxyhost)
{
    char prompt[512];
    static char pw[256];

    snprintf(prompt, sizeof(prompt), "Proxy password for %s@%s: ",
     proxyuser, proxyhost);
    if (readpassphrase(prompt, pw, sizeof(pw), RPP_REQUIRE_TTY) == NULL)
        errx(1, "Unable to read proxy passphrase");
    return (pw);
}
Автор: smiker2007
Дата сообщения: 16.01.2013 13:18
ребята, выручайте
нужен простой shell скрипт, который мониторит запуск определенного процесса (service smb status) и если процесс не запущен, он его стартует и чтобы каждую минуту запускался, мониторил.
ОС: CentOS
Автор: vitvoronin
Дата сообщения: 11.07.2013 13:06
необходимо решить задачу:
Переименовать все файлы и подкаталоги, расположенные в заданном каталоге, так, что один заданный символ имени файла (подкаталога) заменяется на другой заданный символ.
Примечание. Имя каталога, а также оба заданных символа вводятся с командной строки в качестве параметров скрипта.
Прошу помочь.
Автор: ASE_DAG
Дата сообщения: 11.07.2013 14:12
vitvoronin
$ rename 's/a/b/g' *

заменит a на b.
Автор: vitvoronin
Дата сообщения: 12.07.2013 05:13
Спасибо. Но я так понял по условию немного другое требуется. Нужно задать каталог, в котором будет осуществляться поиск файлов и подкаталогов с заданными символами. Символы тоже задаются в качестве параметров. И потом эти файлы и подкаталоги автоматически переименовываются.
Автор: ASE_DAG
Дата сообщения: 12.07.2013 17:01
vitvoronin
> Но я так понял по условию немного другое требуется
Не понял. Что значит «вы так поняли»? Это ваше условие. Или это вы домашнее задание пытаетесь на кого-нибудь спихнуть?

> Нужно задать каталог...
Ну так вперед! :-) Я вам написал ключевой элемент, о существовании которого вы могли не догадываться, а оборачивайте его уже во что хотите. Или вы мне предлагаете за вас все сделать?

Между прочим, я не понимаю, что вам тут не понравилось. Здесь все и задается в виде параметров. Или вы не в курсе, что можно указывать пути вот так:

$ rename 's/a/b/g' ~/path/to/my/dir/*

Однако если это ваше домашнее задание, то оно наверное не на знание ассортимента утилит, доступных в GNU (rename он же prename входит обычно в пакет perl), а на совершенствование умений скриптинга на Баше при использовании минимума утилит. Так что приступайте, а будут вопросы — обращайтесь. :-)

Добавлено:
All
Вставил в шапку ссылку на смежную ветку, где есть полноценная шапка.
Автор: ASE_DAG
Дата сообщения: 12.07.2013 19:17
vitvoronin
А я смотрю вы не только домашние задания подкидываете, но еще и кросспостите не дождавшись первого ответа (http://www.cyberforum.ru/shell/thread921485.html). Ай-ай-ай! Надо по крайней мере взаимные ссылки ставить — здесь уже, понятное дело, не надо, а оттуда сюда поставьте, пожалуйста.

Тов. accept предлагает вам использовать find. Но нет, это здесь совершенно излишне.

$ for f in *"$A"*; do mv "$f" "${f//$A/$B}"; done

Комментарии нужны?

Страницы: 123456

Предыдущая тема: Сжатие БД формата Access средствами VC++


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.