Привет!
Не могу пока побороть такую тему когда команда ограниченная одинарными кавычками содержит внутри себя еще одну команду которая тоже должна содержать текст-команду тоже в одинарных кавычках. вот например такое:#!/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"
Прошу помощи как вот сделать рабочими кавычки внутри уже командной строки в таких же кавычках?
Спасибо!
Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
line1=`$CONNECT "ls -la | grep <namefile> | perl -e '$input = \<STDIN\>; print STDOUT $input'"`
Это не считая того, что у вас завершающая обратная кавычка отсутствует. Зачем экранирование <> тоже непонятно, зачем вообще STDIN и STDOUT? В чем вообще смысл перловой вставки?Ну а если в общем случае, то традиционно можно использовать \' и вообще экранирование при помощи \
>Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
>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, а это конечно нне так
>>Что в _данном_ случае запрещает использовать двойные кавычки вместе с одинарными:
>>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
>Прошу помощи как вот сделать рабочими кавычки внутри уже командной строки в
>таких же кавычках?$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
'/bin/echo'
$ _
>Спасибо!Пажалуйста! :)
>>Прошу помощи
>
>$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
>'/bin/echo'
>$ _$ sh -c 'echo \'\'\'\''/bin/echo\'\'
'/bin/echo'
$ _Помогло? :))
>[оверквотинг удален]
>>
>>$ sh -c 'echo "'"'"'/bin/echo'"'"'"'
>>'/bin/echo'
>>$ _
>
>$ sh -c 'echo \'\'\'\''/bin/echo\'\'
>'/bin/echo'
>$ _
>
>Помогло? :))локально это работает - да и та длинная команда что в самом начале с повторением идинарных кавычек - то же работают - локально!
а вот через коннект по ssh - нет и причем речь идет не о строке /bin/echo , а о команде внутри другой команды
>>[оверквотинг удален]
>
>а вот через коннект по 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 - в кассу. Следующий!
>[оверквотинг удален]
>$ 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 вставить еще выполение другой которая тоже может содержать строку вида 'команда'
>line1=`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `У меня работает.
- Кто у Вас и.о. /bin/sh?
- а
line1="`$CONNECT 'ls -la |gawk '\''/ping/{print}'\' `"
line1="$($CONNECT 'ls -la |gawk '\''/ping/{print}'\')"
?- ...$200!
>>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нет результата - счет на амортизацию аппаратуры и интернета
:)
>>- Кто у Вас и.о. /bin/sh?
>
>все как было с самого начала - вот в первом сообщении указано
>какой шелл используетсяНет.
- Ещё раз внимательно спрашиваю: покажи вывод
$ file /bin/sh
$ /bin/sh --version- Дистрибутив - какой?
- Всё то же самое - на "той" стороне ssh??
>нет результата - счет на амортизацию аппаратуры и интернета
>:)Смешно.
----
Не freebsd ли?? Далее в порядке убывания телепатических предпочтений slackware, gentoo, ubuntu... Солярисы и мандривы, тоже там где-то.
>>>- Кто у Вас и.о. /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 и ответы те же
>>нет результата - счет на амортизацию аппаратуры и интернета
>>:)
>
>Смешно.ну так сам начал "остроумно" шутить - и главное к теме :)
>>- Дистрибутив - какой?
>да, не указал, FreeBSDох...
>>Смешно.
>ну так сам начал "остроумно" шутить - и главное к теме :)_Самую_ "остроумную" шутку чего не процитировал? -->
#>>----
#>>Не freebsd ли??$SUBJ "И как он догадался?!"
Ждите, сейчас "ваши" подойдут -- отэскейпят кавычки как надо. Или не подойдут.
>[оверквотинг удален]
>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=$3echo 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}
---------------------------------
я тут в конце еще юзеров вывожу, что бы было понятно что перл выполняется не на моей машине а на удаленной.(а то мало ли что)