URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7334
[ Назад ]

Исходное сообщение
"одинарные кавычки внутри одинарных кавычек..."

Отправлено HAN , 25-Апр-08 02:33 
Привет!
Не могу пока побороть такую тему когда команда ограниченная одинарными кавычками содержит внутри себя еще одну команду которая тоже должна содержать текст-команду тоже в одинарных кавычках. вот например такое:

#!/bin/sh

CONNECT="ssh -l <user> <ip> -p 22"

line1=`$CONNECT 'ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input''

вот та командная строка что отдается перлу - не отрабатывает, точнее отвечает после таймаута - "print: not found"

Прошу помощи как вот сделать рабочими кавычки внутри уже командной строки в таких же кавычках?

Спасибо!


Содержание

Сообщения в этом обсуждении
"одинарные кавычки внутри одинарных кавычек..."
Отправлено angra , 25-Апр-08 03:14 
Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
line1=`$CONNECT "ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input'"`
Это не считая того, что у вас завершающая обратная кавычка отсутствует. Зачем экранирование <> тоже непонятно, зачем вообще STDIN и STDOUT? В чем вообще смысл перловой вставки?

Ну а если в общем случае, то традиционно можно использовать \' и вообще экранирование при помощи \


"одинарные кавычки внутри одинарных кавычек..."
Отправлено HAN , 25-Апр-08 18:13 
>Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
>line1=`$CONNECT "ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input'"`
>Это не считая того, что у вас завершающая обратная кавычка отсутствует.

да, это я здесь ошибся - а так закрывающая кавычка есть

Зачем экранирование <> тоже непонятно, зачем вообще STDIN и STDOUT? В чем вообще смысл перловой вставки?

нужно удаленно запустить команду, обработать ее результат и получить ответ
вот что отвечает по Вашему варианту:

ls: ': No such file or directory
ls: ': No such file or directory
ls: -e: No such file or directory
ls: =: No such file or directory
ls: STDOUT: No such file or directory
ls: \<STDIN\>;: No such file or directory
ls: grep: No such file or directory
ls: perl: No such file or directory
ls: print: No such file or directory
ls: |: No such file or directory
ls: |: No such file or directory

не идет разделения на команды - все идет как опции к команде ls, а это конечно нне так



"take#2, одинарные кавычки внутри - значит что-то не так! :)"
Отправлено Andrey Mitrofanov , 25-Апр-08 18:27 
>>Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
>>line1=`$CONNECT "ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input'"`
>Зачем экранирование <> тоже непонятно, зачем вообще STDIN и STDOUT? В чем вообще смысл перловой вставки?

Вот я не понимаю перла - и удивляюсь, чего это там у Вас "в нём" написано?... %)

>нужно удаленно запустить команду, обработать ее результат и получить ответ
>вот что отвечает по Вашему варианту:
>не идет разделения на команды - все идет как опции к команде
>ls, а это конечно нне так

Ужос... А если запрос данных делать удалённо, а обработку - локально? Hint: stdout и stderr удалённой команды (о, чудо!) "попадают" в stdout/err ssh.

Вроде -
$ ssh user@remote "ls -la"|less

??
line1=`$CONNECT "ls -la" | grep <namefile> | perl -e '$чего-там-у-вас---'`

О, ваш перлл не `head -1`-ли часом делает?!... %-O


"А вам слабо?! $)"
Отправлено Andrey Mitrofanov , 25-Апр-08 11:10 
>Прошу помощи как вот сделать рабочими кавычки внутри уже командной строки в
>таких же кавычках?

$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
'/bin/echo'
$ _


>Спасибо!

Пажалуйста! :)


":)))))))"
Отправлено Andrey Mitrofanov , 25-Апр-08 15:49 
>>Прошу помощи
>
>$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
>'/bin/echo'
>$ _

$ sh -c 'echo \'\'\'\''/bin/echo\'\'
'/bin/echo'
$ _

Помогло? :))


":)))))))"
Отправлено HAN , 25-Апр-08 18:17 
>[оверквотинг удален]
>>
>>$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
>>'/bin/echo'
>>$ _
>
>$ sh -c 'echo \'\'\'\''/bin/echo\'\'
>'/bin/echo'
>$ _
>
>Помогло? :))

локально это работает - да и та длинная команда что в самом начале с повторением идинарных кавычек - то же работают - локально!
а вот через коннект по ssh - нет и причем речь идет не о строке /bin/echo , а о команде внутри другой команды


":)))))))"
Отправлено Andrey Mitrofanov , 25-Апр-08 18:42 
>>[оверквотинг удален]
>
>а вот через коннект по ssh - нет и причем речь идет
>не о строке /bin/echo , а о команде внутри другой команды

$ ssh user@remote 'ls -la |gawk \'/ping/{print}\'\'

А мы за Вас и пальцы загибать будем! Только перл учить не заставляйте. :-P

И на посошок - два _правильных_ :) варианта:
$ ssh user@remote 'ls -la |gawk '"'"'/ping/{print}'"'"
$ ssh user@remote 'ls -la |gawk '\''/ping/{print}'\'

С Вас $100 - в кассу. Следующий!


":)))))))"
Отправлено HAN , 25-Апр-08 18:52 
>[оверквотинг удален]
>$ ssh user@remote 'ls -la |gawk \'/ping/{print}\'\'
>
>А мы за Вас и пальцы загибать будем! Только перл учить не
>заставляйте. :-P
>
>И на посошок - два _правильных_ :) варианта:
>$ ssh user@remote 'ls -la |gawk '"'"'/ping/{print}'"'"
>$ ssh user@remote 'ls -la |gawk '\''/ping/{print}'\'
>
>С Вас $100 - в кассу. Следующий!

логин идет автоматически - поэтому в формате что уже работает для просто цепочки команд пробуем:

line1=`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `

получаем:

ls: '/ping/{print}': No such file or directory
ls: |gawk: No such file or directory

говорю же - тут задача внутри одной команды для ssh вставить еще выполение другой которая тоже может содержать строку вида 'команда'


":)))))))"
Отправлено Andrey Mitrofanov , 25-Апр-08 19:08 
>line1=`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `

У меня работает.

- Кто у Вас и.о. /bin/sh?

- а
line1="`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `"
line1="$($CONNECT 'ls -la |gawk '\''/ping/{print}'\')"
?

- ...$200!


":)))))))"
Отправлено HAN , 25-Апр-08 19:21 
>>line1=`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `
>
>У меня работает.
>
>- Кто у Вас и.о. /bin/sh?

все как было с самого начала - вот в первом сообщении указано какой шелл используется

>
>- а
>line1="`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `"
>line1="$($CONNECT 'ls -la |gawk '\''/ping/{print}'\')"
>?

нет, у меня это не работает - все тот же ответ
ls: '/ping/{print}': No such file or directory
ls: |gawk: No such file or directory

>
>- ...$200!

-100
-200
=
-300

нет результата - счет на амортизацию аппаратуры и интернета
:)


"а-кх-кр-р-р...."
Отправлено Andrey Mitrofanov , 25-Апр-08 19:32 
>>- Кто у Вас и.о. /bin/sh?
>
>все как было с самого начала - вот в первом сообщении указано
>какой шелл используется

Нет.

- Ещё раз внимательно спрашиваю: покажи вывод
$ file /bin/sh
$ /bin/sh --version

- Дистрибутив - какой?

- Всё то же самое - на "той" стороне ssh??

>нет результата - счет на амортизацию аппаратуры и интернета
>:)

Смешно.

----
Не freebsd ли?? Далее в порядке убывания телепатических предпочтений slackware, gentoo, ubuntu... Солярисы и мандривы, тоже там где-то.


"а-кх-кр-р-р...."
Отправлено HAN , 25-Апр-08 19:47 
>>>- Кто у Вас и.о. /bin/sh?
>>
>>все как было с самого начала - вот в первом сообщении указано
>>какой шелл используется
>
>Нет.
>
>- Ещё раз внимательно спрашиваю: покажи вывод
>$ file /bin/sh
>$ /bin/sh --version

ок

# file /bin/sh
/bin/sh: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), stripped

# /bin/sh --version

Illegal option --

>
>- Дистрибутив - какой?

да, не указал, FreeBSD

>
>- Всё то же самое - на "той" стороне ssh??
>

с той стороны - тоже самое, FreeBSD и ответы те же

>>нет результата - счет на амортизацию аппаратуры и интернета
>>:)
>
>Смешно.

ну так сам начал "остроумно" шутить - и главное к теме :)


"блинъязнал(тм)"
Отправлено Andrey Mitrofanov , 25-Апр-08 20:04 
>>- Дистрибутив - какой?
>да, не указал, FreeBSD

ох...

>>Смешно.
>ну так сам начал "остроумно" шутить - и главное к теме :)

_Самую_ "остроумную" шутку чего не процитировал? -->

#>>----
#>>Не freebsd ли??

$SUBJ "И как он догадался?!"

Ждите, сейчас "ваши" подойдут -- отэскейпят кавычки как надо. Или не подойдут.


"одинарные кавычки внутри одинарных кавычек..."
Отправлено NuINu , 28-Апр-08 09:25 
>[оверквотинг удален]
>line1=`$CONNECT 'ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input''
>
>вот та командная строка что отдается перлу - не отрабатывает, точнее отвечает
>после таймаута - "print: not found"
>
>Прошу помощи как вот сделать рабочими кавычки внутри уже командной строки в
>таких же кавычках?
>
>Спасибо!
>

ой, нафлудили то!

см здесь:
#!/bin/sh

# показать все файлы на данном компьютере в домашней директории
# Запуск: ./remote_exec.sh <server> <user> <file>

IP=$1
USER=$2
NAMEFILE=$3

echo user=${NAMEFILE}
CONNECT="ssh -l ${USER} ${IP} -p 22"

#t1="ls -la | grep ${NAMEFILE} | perl -e 'while(\$input=<>){print \$input.\"\\n\";}'"
t1="ls -la | grep ${NAMEFILE} | perl -e 'while(\$input=<>){print \$input.\"\\n\";}; open(\$fh, \"<\", \"/etc/passwd\"); while(\$inp=<\$fh>){print \$inp;}; close(\$fh);'"
echo $t1
line1=`${CONNECT} $t1`

echo get:${line1}

---------------------------------
я тут в конце еще юзеров вывожу, что бы было понятно что перл выполняется не на моей машине а на удаленной.(а то мало ли что)