проблема с обратными кавычками внутри цикла while при выполнении команды через ssh

Убрать из конфига параметр

push "redirect-gateway def1"

Этот параметр перенаправляет весь трафик через VPN-туннель

0
17.03.2017, 01:52
3 ответа

Как вы заметили в своем вопросе, эта подстановка:

`cat $CHECK/samplefile | grep "string"`

была выполнена на вашей локальной машине. Вы можете легко исправить это следующим образом:

ssh -n test@192.168.1.2 \
"until { cat ""$CHECK""/samplefile | grep ""string""; }; do \
touch  ""$CHECK""/success; \
done"

Как вы видите, вам не нужна никакая подстановка, кроме разрешения переменной $CHECK. Вы можете поместить условные инструкции в список {...}, и теперь код выхода списка будет решающим для инструкции until.

3
28.01.2020, 02:16
export CHECK='/home/test/Desktop'
ssh -n test@192.168.1.2 'until [ `cat "$CHECK/samplefile" | grep "string"` ]; do touch  "$CHECK/success"; done'
0
28.01.2020, 02:16

Вы правы, что это цитата. Заключая удаленную команду в двойные кавычки, вы указываете локальной оболочке интерпретировать все, что она может передать сеансу ssh. В данном случае команда cat .

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

локальный файл:

bash-[501]$ echo $(hostname) > /tmp/samplefile
bash-[506]$ echo $(cat /tmp/samplefile)
tank

создать удаленный файл:

bash-[502]$ ssh evil 'echo $(hostname) > /tmp/samplefile'
bash-[501]$ cat /tmp/samplefile
evil

попытаться просмотреть удаленный файл в двойных кавычках:

bash-[508]$ ssh evil "echo `cat /tmp/samplefile`"
tank

попытаться просмотреть удаленный файл в одинарных кавычках:

bash-[509]$ ssh evil 'echo `cat /tmp/samplefile`'
evil

определить файл как переменную для обработки на удаленной стороне:

bash-[527]$ ssh evil 'F=/tmp/samplefile; cat $F'
evil

В вашем случае, заключая команду в одинарные кавычки и определяя $ CHECK внутри этих кавычек, чтобы было достаточно, чтобы отправить все для интерпретации на удаленной стороне .

ssh -n test@192.168.1.2 'CHECK=/home/test/Desktop; until [ `cat $CHECK/samplefile | grep "string"` ]; do touch  $CHECK/success; done'
2
28.01.2020, 02:16

Теги

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