запутался в экранировании (скриптс)

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

Dorondo
Сообщения: 5

запутался в экранировании

Сообщение Dorondo »

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


#!/bin/sh
lst='myhost'

for i in $lst
do
 cat << EOF | ssh $i "/bin/sh -s"
#!/bin/sh
. /etc/profile.ora
#OSID=`ps -eo "args" |grep [p]mon |awk -F_ '{print \$3}'`
OSID=`ps -eo "args"`
echo $OSID
#for j in $OSID; do
# export ORACLE_SID=$j
#done
EOF
done


вобщем цель, бежать по SSH по списку серверов,затем на сервере получать имя процесса, а затем из имени процесса брать подстроку и экспортировать ее (типа export MY_VAR=$OSID)

проблема в том, что команда OSID=`ps -eo "args"` запускает на выполнение результат вывода, а мне его надо засунуть в переменную.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: запутался в экранировании

Сообщение madskull »

Может, пойти другим путем? Примерно так

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

for i in $lst; do
   ssh $i '
. /etc/profile.ora
OSID=`ps -eo "args" |grep [p]mon |awk -F_ "{print $3}"`
for j in $OSID; do
 export ORACLE_SID=$j
done
'
done

Смысл в том, чтобы команды не через пайп передавать, а в командной строке.

Вот только не пойму, куда/для кого/зачем делается export?
ArchLinux / IceWM
Спасибо сказали:
jsv
Сообщения: 67

Re: запутался в экранировании

Сообщение jsv »

Dorondo писал(а):
16.02.2006 09:08
проблема в том, что команда OSID=`ps -eo "args"` запускает на выполнение результат вывода, а мне его надо засунуть в переменную.

Если хочется экранирования, то примерно так:

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

#!/bin/sh
lst='localhost'

for i in $lst
do
    cat << EOF | ssh $i "/bin/sh -s"
    OSID="$(ps -eo 'args')"
    echo \$OSID
EOF
done


Это не вдаваясь в вопрос, а стоит ли :)
Спасибо сказали:
Dorondo
Сообщения: 5

Re: запутался в экранировании

Сообщение Dorondo »

[quote]Смысл в том, чтобы команды не через пайп передавать, а в командной строке.[quote]

в командной что-то не получается..
т.е. для командной должна прокатывать конструкция типа:

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

ssh myhost "/bin/sh -s" 'ls -l /'

а она не прокатывает. не выдает никакого результату..

[quote]Вот только не пойму, куда/для кого/зачем делается export?[quote]
а потом у меня будут там свои приседания с БД. до них еще не дошел.

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

OSID="$(ps -eo 'args')"
echo \$OSID


а эта конструкция проводит к тому, что команда OSID="$(ps -eo 'args')" выполняется на локальном хосте, а не на удаленном (куда идем по ssh)
Спасибо сказали:
jsv
Сообщения: 67

Re: запутался в экранировании

Сообщение jsv »

Dorondo писал(а):
16.02.2006 13:29
а эта конструкция проводит к тому, что команда OSID="$(ps -eo 'args')" выполняется на локальном хосте, а не на удаленном (куда идем по ssh)

ну, тогда OSID="\$(ps -eo 'args')" ... слешем больше, слешем меньше :ph34r:
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: запутался в экранировании

Сообщение madskull »

Dorondo писал(а):
16.02.2006 13:29
т.е. для командной должна прокатывать конструкция типа:

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

ssh myhost "/bin/sh -s" 'ls -l /'

а она не прокатывает. не выдает никакого результату..

"/bin/sh -s" зачем? Убери ее, и без этого все работает.
Лень разбираться, но подозреваю, что в твоем случае ssh отработает только первую команду, то есть забустит sh, который будет доолго ждать скрипта...

Dorondo писал(а):
16.02.2006 13:29
а эта конструкция проводит к тому, что команда OSID="$(ps -eo 'args')" выполняется на локальном хосте, а не на удаленном (куда идем по ssh)

А вот если убрать все в одинарные кавычки и запустить в командной строке, то все будет правильно.
ArchLinux / IceWM
Спасибо сказали:
Dorondo
Сообщения: 5

Re: запутался в экранировании

Сообщение Dorondo »

ООО!! ОТЦЫ!!
все классно!
все правы!
эта конструкция работает:
OSID="\$(ps -eo "args" | grep [p]mon | awk -F_ '{print \$3}')"
echo \$OSID

"/bin/sh -s" зачем?

совершенно верно! именно она и есть шелл, который ждет команд.

растолкуйте мне разницу между конструкциями типа:
OSID=`ps -eo "args" | grep [p]mon | awk -F_ '{print \$3}')`
и
OSID="\$(ps -eo "args" | grep [p]mon | awk -F_ '{print \$3}')"
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: запутался в экранировании

Сообщение madskull »

Dorondo писал(а):
16.02.2006 13:54
растолкуйте мне разницу между конструкциями типа:
OSID=`ps -eo "args" | grep [p]mon | awk -F_ '{print \$3}')`
и
OSID="\$(ps -eo "args" | grep [p]mon | awk -F_ '{print \$3}')"

Имеешь в виду, разница между `cmd` и $(cmd)?
Во втором случае можно спокойно использовать вложенные кавычки - все аккуратно "рассортируется".
Например, echo "$(basename "$(dirname "$(pwd)")")"
ArchLinux / IceWM
Спасибо сказали:
Dorondo
Сообщения: 5

Re: запутался в экранировании

Сообщение Dorondo »

да, именно эта разница впечатлила..
а то я все по старинке парился с ``
Спасибо сказали: