Когда я запускаю следующую команду в терминале bash, все работает нормально.
$ bash -c "python -c \"print 'helloworld'\""
---> привет мир
Однако когда я пытаюсь сделать это через SSH, ничего не получается. Может ли кто-нибудь пролить свет на эту проблему?
$ ssh [email protected] "bash -c \"python -c \"print 'helloworld'\"\""
--> ничего
решение1
ssh [email protected] "$(cat <<'EOT'
bash -c "python -c \"print 'helloworld'\""
EOT
)"
У меня есть идея простой функции/утилиты, которая должна помочь избежать кошмара с цитированием при использовании нескольких встроенных команд, подобных этой. Оставайтесь с нами ;-)
решение2
Вы не правильно цитируете. Ваша команда
ssh [email protected] "bash -c \"python -c \"print 'helloworld'\"\""
запускает это на удаленной стороне:
bash -c "python -c "print 'helloworld'""
что эквивалентно
bash -c "python -c print" 'helloworld'
который запускает python -c print
, который печатает пустую строку. (Примечание: helloworld
действует какэтот.)
Чтобы правильно цитировать, нужно больше обратных косых черт. Это:
ssh [email protected] "bash -c \"python -c \\\"print 'helloworld'\\\"\""
на удаленной стороне выполняется следующее:
bash -c "python -c \"print 'helloworld'\""
именно то, что вы хотели.
Проверятьэтот вопрос на Super User. Он призван помочь в подобных случаях.
Скорее всего, вам это вообще не нужно bash -c
. Этот код должен работать в локальной оболочке:
python -c "print 'helloworld'"
так что это, вероятно, сработает:
ssh [email protected] "python -c \"print 'helloworld'\""
Вероятно, потому что сервер SSH запустит команду, используя оболочку, выбранную meeee в качестве оболочки входа. В некоторых экзотических случаях она может работать некорректно python -c
. Но поскольку вы ожидаете, что она запустится bash -c
, она также должна запуститьсяpython -c