Защитить sh-скрипт от \r :)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

StanislavL
Сообщения: 80

Защитить sh-скрипт от \r :)

Сообщение StanislavL »

Предлагается по приколу решить проблемку, типа как отборочный этап на конкурс веселых и находчивых

Имеется некий скрипт:
#!/bin/sh
echo 'F... you, lamer!'
...

- в общем совершенно неважно что у него там за команды внутри. Важно то, что редактируют этот скрипт несколько человек, взамодействие между которыми поставлено плохо.
И где-нибудь, раз в неск. месяцев, какая-нибудь фашистская щука обязательно умудрится поредактировать этот скрипт в винде, а потом закатать его назад через ftp / scp / неважно опять же как, важно только что в концах строк оказываются \r\n . Скрипт работать перестает, вестимо. А по логам запускалки хрен догадаешься. И до следующего раза, вестимо, успеваешь забыть про существование этих грабель.

Вопрос: можем ли мы изменить заголовок скрипта так, чтобы он запускался даже если ему всобачили \r в концы строк ? :)
Как минимум - чтоб выдал осмысленное сообщение "Уберите \r, идиоты!"

(Идея перед запуском обработать скрипт каким-нибудь перлом - это, конечно, решение, но слишком уж некрасивое )
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Защитить sh-скрипт от \r :)

Сообщение eddy »

Запускайте его другим скриптом, который будет предварительно удалять оконечные \r.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Защитить sh-скрипт от \r :)

Сообщение Ленивая Бестолочь »

eddy писал(а):
23.02.2010 01:01
Запускайте его другим скриптом, который будет предварительно удалять оконечные \r.

можно попробовать развить идею, и в шабанг первому скрипту, вместо /bin/sh записать другой скрипт, который будет проверять и, либо писать ошибку, либо запускать первый.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Защитить sh-скрипт от \r :)

Сообщение smaharbA »

Код: Выделить всё

a=`tr -d '\r' < $0`;echo "$a" | tail -n $((`echo "$a" | wc -l` - 1)) > $0;. $0
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Jampire
Сообщения: 163
ОС: Gentoo Linux amd64 || x86

Re: Защитить sh-скрипт от \r :)

Сообщение Jampire »

StanislavL писал(а):
23.02.2010 00:50
Как минимум - чтоб выдал осмысленное сообщение "Уберите \r, идиоты!"

Так вроде ж должно выдавать, если это баш-скрипт? Последний раз сталкивался с подобной проблемой года 2 назад. Баш тогда ругался как-то так: "Error: (bash ^M) bla-bla-bla ".
Человек, говорящий, что это невозможно сделать, не должен мешать тому, кто это делает.
Спасибо сказали:
Аватара пользователя
Warderer
Модератор
Сообщения: 1056
Статус: киберпИнгвин на гусеничном ходу
ОС: Debian unstable

Re: Защитить sh-скрипт от \r :)

Сообщение Warderer »

StanislavL писал(а):
23.02.2010 00:50
Предлагается по приколу решить проблемку, типа как отборочный этап на конкурс веселых и находчивых

поднять и настроить любую систему контроля версий.
Читаю вслух с выражением маны - $50/ч + стоимость звонка. Настраиваю сервисы за Вас - $100/ч + стоимость выезда и проживания.
И восемь строк матом...(бесплатно)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Защитить sh-скрипт от \r :)

Сообщение drBatty »

StanislavL писал(а):
23.02.2010 00:50
Идея перед запуском обработать скрипт каким-нибудь перлом - это, конечно, решение, но слишком уж некрасивое

угу.
ну я что-то не могу ничего придумать красивее, нежели

Код: Выделить всё

sed -i 's/\r$//' this_script

Кстати, разве это так некрасиво?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Защитить sh-скрипт от \r :)

Сообщение sgfault »

Кроме того, если очень важны секунды, которые могут потратиться на обработку скрипта чем-то еще, можно запускать обработку только, если первая строка содержит '\r'.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Защитить sh-скрипт от \r :)

Сообщение drBatty »

sgfault писал(а):
24.02.2010 23:07
Кроме того, если очень важны секунды, которые могут потратиться на обработку скрипта чем-то еще, можно запускать обработку только, если первая строка содержит '\r'.

Код: Выделить всё

[ `sed -n '/\r$/s/.*/x/p; q'` ] && sed 's/\r$//'

так?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Защитить sh-скрипт от \r :)

Сообщение sgfault »

drBatty писал(а):
24.02.2010 23:18
sgfault писал(а):
24.02.2010 23:07
Кроме того, если очень важны секунды, которые могут потратиться на обработку скрипта чем-то еще, можно запускать обработку только, если первая строка содержит '\r'.

Код: Выделить всё

[ `sed -n '/\r$/s/.*/x/p; q'` ] && sed 's/\r$//'

так?

Ну, так или не так - это автору топика виднее, но раз уж вы написали команду, то у меня тоже есть вопрос :-)
Чем ваш вариант лучше такого

Код: Выделить всё

sed -ne'/\r$/q0;q1' && sed -e's/\r$//'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Защитить sh-скрипт от \r :)

Сообщение drBatty »

sgfault писал(а):
24.02.2010 23:28
Чем ваш вариант лучше такого
Код
sed -ne'/\r$/q0;q1' && sed -e's/\r$//'

ничем.
ваш лучше ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
varjo
Сообщения: 43
ОС: ArchLinux, FreeBSD

Re: Защитить sh-скрипт от \r :)

Сообщение varjo »

sgfault писал(а):
24.02.2010 23:07
Кроме того, если очень важны секунды, которые могут потратиться на обработку скрипта чем-то еще, можно запускать обработку только, если первая строка содержит '\r'.

ага и настроить, что-то вроде fam, чтобы запускать только при модификации файла
Спасибо сказали:
StanislavL
Сообщения: 80

Re: Защитить sh-скрипт от \r :)

Сообщение StanislavL »

Warderer писал(а):
23.02.2010 22:33
поднять и настроить любую систему контроля версий.


Эх, Ватсон... Есть она там, есть! :)
Только человек вытаскивает из svn'а ПОД ВИНДОЙ - потому что ЕМУ ТАК УДОБНЕЙ, а потом уже копирует на место другими подручными средствами ...
Я, положим, могу сегодня сегодня оповестить всех кто так делает, что "так делать не надо!", и они послушают. Но через 3 месяца примут на работу нового человека и ... "все опять повторится сначала" ! :)

Проблема "как удалить" вообще-то не стоИт. Мне лично больше всего нравится tr -d '\015' (ибо короче)
Только применять для этого другой скрипт - ни разу не решение, т.к. с "другим скриптом" можно сделать то же самое :)

В принципе, можно попробовать исправить команду запуска на 'tr -d '\015' </путь/к/скрипту |/bin/bash параметры'. Правда, я не уверен, что тамошний autosys такую команду сожрет. Но главное - такая строчка уже будет многих вводить в ступор (из людей, допущеных к корректировке скрипта и пар-ров запуска, меньше половины реально разбираются в том как оно работает, а умеют только поправить указанный параметр, не больше)

Я пытался в строчке '#!/bin/sh' указывать всякие ненужные параметры, в надежде на то, что удастся \r "отсечь", чтоб "испорченый" скрипт все-таки хоть как-то запустился (а дальше я уж как-нибудь извернусь), но ничего не получилось. Может кто знает волшебную комбинацию ? :)
Сузим задачу: первая строчка скрипта="#!/bin/sh ???\r\n" ; существует ли такая замена "???", чтоб скрипт хоть как-то запускался ?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Защитить sh-скрипт от \r :)

Сообщение drBatty »

StanislavL писал(а):
03.03.2010 20:58
Сузим задачу: первая строчка скрипта="#!/bin/sh ???\r\n" ; существует ли такая замена "???", чтоб скрипт хоть как-то запускался ?

вместо /bin/sh поставить процедуру контроля почему нельзя?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Защитить sh-скрипт от \r :)

Сообщение sgfault »

StanislavL писал(а):
03.03.2010 20:58
Я пытался в строчке '#!/bin/sh' указывать всякие ненужные параметры, в надежде на то, что удастся \r "отсечь", чтоб "испорченый" скрипт все-таки хоть как-то запустился (а дальше я уж как-нибудь извернусь), но ничего не получилось. Может кто знает волшебную комбинацию ? :)
Сузим задачу: первая строчка скрипта="#!/bin/sh ???\r\n" ; существует ли такая замена "???", чтоб скрипт хоть как-то запускался ?

Раз уж вы так упорны, то можете попробовать так, хотя решение, конечно, кривое

Код: Выделить всё

sed -ne'4,$s/\r//p' "$0" >"${0%.sh}_striped.sh"
chmod 700 "${0%.sh}_striped.sh"
exec "${0%.sh}_striped.sh"
echo abc
echo def


Запускать через #! нельзя, тк \r все испортит, поэтому надо так

Код: Выделить всё

# bash ./t.sh


Обратите внимание: первые 3-и строки должны иметь на конце пробел, чтобы отделить \r от правильного имени файла. Кроме того, sed и chmod напишут ошибки, но сработают.
Вот результат работы у меня:

Код: Выделить всё

bash-4.0# bash ./t.sh
: No such file or directory
chmod: cannot access `\r': No such file or directory
abc
def


UPD. небольшие изменения в скрипте.

UPD2: Вот так должно выглядеть получше: \r стираются в основном скрипте (копия не создается), и убраны сообщения об ошибках.

Код: Выделить всё

sed -i -ne'3,$s/\r//p' "$0"  2>/dev/null
exec "$0"
echo abc
echo def


Код: Выделить всё

bash-4.0# bash ./t.sh
abc
def
Спасибо сказали:
varjo
Сообщения: 43
ОС: ArchLinux, FreeBSD

Re: Защитить sh-скрипт от \r :)

Сообщение varjo »

StanislavL писал(а):
03.03.2010 20:58
Только человек вытаскивает из svn'а ПОД ВИНДОЙ - потому что ЕМУ ТАК УДОБНЕЙ, а потом уже копирует на место другими подручными средствами ...

запрети использовать другие подручные средства и если всё-так же вылазить \r при работе с svn, чисти их post-commit хуком
Спасибо сказали:
DSS
Сообщения: 390

Re: Защитить sh-скрипт от \r :)

Сообщение DSS »

StanislavL писал(а):
23.02.2010 00:50
А по логам запускалки хрен догадаешься. И до следующего раза, вестимо, успеваешь забыть про существование этих грабель.

А скрипт ручками запускается?
Спасибо сказали: