как сделать так, чтобы в этом скрипте, который ищет что-то из базы данных. он искал это и менял название в терминале. Здесь у меня проблема с кавычками. Может кто знает как это исправить
spr-ustawien()
{
echo -e "\e[31;43mSprawdzanie Ustawień\e[0m \e[101mIP $1\e[0m"
intertube=0
while [ $intertube -ne 1 ]; do
ping $1 -c 5
if [ $? -eq 0 ]; then
sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
exit "
echo -e "\e[1;5;32mSprawdzony\e[0m"
intertube=1;
else
echo -e "\e[1;5;31m!!! JEST OFFLINE !!!\e[0m"
break
fi
done
}
Мне кажется, что основная проблема заключается в том, что кавычки не вложены так, как вы используете их в команде ssh
. То есть в этой команде:
sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
exit "
"
в "SELECT * FROM...
на самом деле является закрытой кавычкой (, совпадающей с открытой кавычкой в предыдущей строке ), поэтому SELECT * FROM settings
не находится внутри двух слоев кавычек. на самом деле полностью (без кавычек, и в результате *
будет расширен до списка файлов в локальном каталоге, вызывая кто-знает-какой хаос).
Как сказал djdomi в комментарии, вы можете увидеть, как выглядят аргументы для ssh
после их разбора оболочкой (и, следовательно, что будет отправлено на удаленную систему для выполнения)путем замены команда ssh
с echo
. Когда я запускаю это :
echo "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
exit "
, он печатает:
sudo sqlite3 config.sqlite SELECT file1.txt file2.jpg FROM settings |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
exit
Самое прямое решение — избежать внутренних двойных-кавычек, чтобы локальная оболочка передала их оболочке в удаленной системе:
sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite \"SELECT * FROM settings\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
exit "
Обратите внимание, что вы должны экранировать все из них, даже те, что внутри команды -в одинарных кавычках awk
, потому что эти одинарные-кавычки ничего не значат для локальной оболочки.
... но я бы рекомендовал немного упростить это. Я не вижу причин, по которым grep
и awk
нужно запускать в удаленной системе, а не в локальной системе (, а команда exit
не делает ничего полезного, так как она все равно выйдет ). Таким образом, вы можете переместить команды grep
и awk
за пределы команды ssh
:
sshpass -p (pass) ssh -t (user)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
grep "SALE_POINT" |
awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'
. И я всегда ненавижу видеть, как grep
используется до awk
, когда awk
вполне способен делать все сам :
sshpass -p (pass) ssh -t (user)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); print}'
. ] Я бы также рекомендовал двойное-цитирование всех ссылок на переменные (, например ping "$1" -c 5
вместо простоping $1 -c 5
)и замена этого:
ping $1 -c 5
if [ $? -eq 0 ]; then
только на:
if ping "$1" -c 5; then
И, наконец, я бы рекомендовал printf
вместо echo -e
--, это более предсказуемо.printf
немного сложнее в использовании --первый аргумент — это строка формата, которая указывает, как печатать любые оставшиеся аргументы, и он не добавляет автоматически новую строку в конце (, поэтому добавьте ее явно с помощью\n
)--но вероятность поломки меньше из-за некоторых изменений в версии оболочки echo
(, как это случилось со мной некоторое время назад... ). Так что используйте, например.
printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie Ustawień" "IP $1"
О, и я всегда рекомендую запускать ваши скрипты через shellcheck.net--это укажет на многие распространенные ошибки и неверные методы.