Мне кажется, что основная проблема заключается в том, что кавычки не вложены так, как вы их используете в ssh
команда. То есть в этой команде:
sshpass -p (проход) ssh -t (пользователь)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
выход "
"
в "ВЫБЕРИТЕ ИЗ...
на самом деле является закрытой кавычкой (соответствующей открытой кавычке в предыдущей строке), поэтому вместо ВЫБЕРИТЕ * ИЗ настроек
будучи внутри двух слоев кавычек, он фактически полностью не заключен в кавычки (и, как следствие, *
будет расширяться до списка файлов в локальном каталоге, вызывая черт знает какой хаос).
Как сказал djdomi в комментарии, вы можете увидеть, какие аргументы ssh
выглядеть после того, как оболочка проанализировала их (и, следовательно, то, что будет отправлено в удаленную систему для выполнения), заменив ssh
команда с эхо
. Когда я запускаю это:
эхо"
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
выход "
он печатает:
sudo sqlite3 config.sqlite ВЫБРАТЬ file1.txt file2.jpg ИЗ настроек |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
выход
Самое прямое решение — избежать внутренних двойных кавычек, чтобы локальная оболочка передала их оболочке удаленной системы:
sshpass -p (проход) ssh -t (пользователь)@$1 "
sudo sqlite3 config.sqlite \"SELECT * FROM settings\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
выход "
Обратите внимание, что вы должны сбежать все из них, даже те, что внутри одинарных кавычек аук
команду, потому что эти одинарные кавычки ничего не значат для локальной оболочки.
... но я бы рекомендовал немного упростить это. я не вижу причин, по которым grep
и аук
необходимо запускать в удаленной системе, а не в локальной системе (и выход
команда не делает ничего полезного, так как она все равно будет завершена). Таким образом, вы могли бы переместить grep
и аук
команды за пределами ssh
команда:
sshpass -p (пароль) ssh -t (пользователь) @$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
grep "SALE_POINT" |
awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'
И я всегда ненавижу видеть grep
использовался раньше аук
, когда аук
вполне способен делать все сам:
sshpass -p (пароль) ssh -t (пользователь) @$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); Распечатать}'
Я бы также рекомендовал двойные кавычки для всех ссылок на переменные (например, пинг "$1" -c 5
вместо того, чтобы просто пинг $1 -c 5
), и заменив это:
пинг $1 -c 5
если [$? -экв 0]; тогда
только с:
если пинг "$1" -c 5; тогда
И, наконец, я бы порекомендовал printf
вместо эхо -е
-- Это более предсказуемо. printf
немного сложнее в использовании — первый аргумент представляет собой строку формата, которая сообщает ему, как печатать любые оставшиеся аргументы, и он не добавляет автоматически новую строку в конце (поэтому добавьте ее явно с помощью \n
) -- но с меньшей вероятностью сломается из-за некоторых изменений в версии оболочки эхо
(как случилось со мной некоторое время назад...). Так что используйте, например.
printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Расширение уставаÅ" "IP $1"
О, и я всегда рекомендую запускать ваши скрипты через shellcheck.net -- это укажет на многие распространенные ошибки и плохие практики.