Как избежать кавычек в оболочке как при использовании ssh, так и при использовании sudo?

Вы можете передать команду в качестве аргумента и использовать -t для принудительного выделения псевдотерминала.

Например, если команду seq необходимо запустить на удаленном сервере:

ssh $REMOTE_HOST -t 'seq 1 100 | less'

Если команду seq необходимо запустить на локальном компьютере, вы можете использовать аналогичный команда с использованием встроенной строки <<< (конечно, цитирование становится немного затруднительным):

ssh $REMOTE_HOST -t "less <<< \"$(seq 1 100)\""
2
17.01.2017, 12:21
2 ответа

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

for i in `cat hosts`; do
  ssh "$i" 'sudo sed -f - …' <<'EOF'
s/(    upload_server = ).*/\1("$a", 10051)/g
EOF
done

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

for i in `cat hosts`; do
  ssh "$i" sudo sh <<'EOF'
sed 's/(    upload_server = ).*/\1("$a", 10051)/g' …
EOF
done

Из вашего вопроса неясно, собирались ли вы вставить «$ a» в файл конфигурации или «что-то» , где значение переменной a в локальной оболочке - это что-то . Если вы хотите обратиться к локальной переменной, используйте здесь документ с интерполяцией и защитите $ \ ` в этом документе с помощью обратной косой черты. Обратите внимание, что из-за синтаксического анализа sed и удаленной оболочки во втором фрагменте значение переменной не должно содержать никаких символов \ / ' или новой строки.

  ssh "$i" sudo sh <<EOF
sed 's/(    upload_server = ).*/\\1("$a", 10051)/g' …
EOF
2
27.01.2020, 22:10
$ ssh localhost sh -c \"echo \\\'how to print single quotes here\\\'\"
'how to print single quotes here'

$ ssh localhost echo \\\'how to print single quotes here\\\'
'how to print single quotes here'

Чтобы понять правила, запомните этот уровень цитирования удаляется локальной оболочкой, затем SSH вызывает удаленную оболочку, которая удаляет второй уровень цитирования.

0
27.01.2020, 22:10

Теги

Похожие вопросы