Как правильно избежать двойных кавычек в команде ssh pkill bash?

$ ssh root@123.123.123.123
123.123.123.123# pkill -f "stalled process name"; commands_to_restart; some_more_commands;
many many lines of output demonstrating success
123.123.123.123# exit;

ВСЕ РАБОТАЕТ ОТЛИЧНО

$ ssh root@123.123.123.123 "pkill -f "\""stalled process name"\"";"\
> "commands_to_restart; some_more_commands;";

нет выхода, ничего не делает.

$ ssh root@123.123.123.123 "echo "\""pkill -f "\"\\\"\""stalled process name"\"\\\"\""; "\
> "commands_to_restart; some_more_commands;"\"";";
pkill -f "stalled process name"; commands_to_restart; some_more_commands;

так что... ДВА ЭТАПА ВЫДЕЛЯЮЩИХ ЦИТАТУ работает, как и ожидалось...

Как получить один слой цитаты, работающей с ssh/bash? Поскольку цитирование работает отлично в двух слоях, у меня есть ощущение, что оно связано не столько с цитированием, сколько с некоторыми аспектами sshобработка терминала. Тем не менее, насколько я знаю, команды не делают ничего, кроме простого и регулярного ввода-вывода для стандартного вывода и без ввода.

2 ответа

Решение

Вам лучше использовать heredoc для таких вещей:

ssh root@123.123.123.123 bash -s << 'EOF'
    pkill -f "stalled process name"
    commands_to_restart
    some_more_commands
EOF
  • bash -s гарантирует, что вы используете bash, а не пользовательскую оболочку на удаленном хосте
  • цитирование маркера конца heredoc ('EOF') гарантирует, что содержимое передается как есть, без интерпретации его родительской оболочкой

Пытаться:

ssh root@123.123.123.123 'pkill -f "stalled process name"; commands_to_restart; some_more_commands'

С помощью команды в одинарных кавычках нет необходимости избегать внутренних двойных кавычек.

Если вы предпочитаете использовать только двойные кавычки, то однократный выход внутренних двойных кавычек должен быть удовлетворительным:

ssh root@123.123.123.123 "pkill -f \"stalled process name\"; commands_to_restart; some_more_commands"
Другие вопросы по тегам