Назад | Перейти на главную страницу

цитирование удаленного выполнения команды ssh

Я нашел это решение, которое работает для меня, но я не понимаю, как оно работает, учитывая, что команда sed заключает свой собственный параметр в одинарные кавычки, а вся команда ssh также передается в одинарные кавычки. Это запускается из OSX (BSD).

ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done'

Может ли кто-нибудь объяснить мне, почему это работает, и почему мне не нужно было избегать одинарных кавычек для команды sed - я нигде не могу найти ссылку? Спасибо.

Вы этого не делаете, потому что ваша строка sed не должна быть заключена в кавычки, и фактически на удаленном сервере она не цитируется.

То, что передается в качестве аргумента вашей команде ssh, выглядит так:

for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i s/^RS=paper_lantern$/RS=x3/ /var/cpanel/users/${user}; fi; done

И он отлично работает, потому что внутри аргумента вашей команды sed нет пробелов.

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

'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i '\''s/^RS=paper_lantern$/RS=x3/'\'' /var/cpanel/users/${user}; fi; done'

Используя одинарные кавычки, вы не можете избежать одинарных кавычек следующим образом: \'

Вы должны использовать уловку. Вы должны закрыть цитаты, избежать своего ' и повторно открыть котировки. ('\'')