Mi se pare că problema de bază este că ghilimele nu se încadrează în modul în care le folosești în ssh
comanda. Adică în această comandă:
sshpass -p (trece) ssh -t (utilizator)@$1 "
sudo sqlite3 config.sqlite „SELECT * FROM settings” |grep „SALE_POINT” | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
Ieșire "
The "
în "SELECTAȚI DIN...
este de fapt un citat apropiat (care se potrivește cu citatul deschis de pe linia anterioară), deci mai degrabă decât SELECTARE * DIN setări
fiind în interiorul a două straturi de ghilimele, este de fapt complet necotat (și, ca rezultat, *
se va extinde la o listă de fișiere din directorul local, provocând cine-știe-ce haos).
După cum a spus djdomi într-un comentariu, puteți vedea care sunt argumentele ssh
arată ca după ce shell-ul le-a analizat (și, prin urmare, ce va fi trimis la sistemul de la distanță pentru a fi executat) prin înlocuirea ssh
comanda cu ecou
. Când rulez asta:
ecou"
sudo sqlite3 config.sqlite „SELECT * FROM settings” |grep „SALE_POINT” | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
Ieșire "
se tipărește:
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' &&
Ieșire
Cea mai directă soluție este să scăpați de ghilimelele interioare, astfel încât shell-ul local le va trece prin shell-ul sistemului de la distanță:
sshpass -p (trece) ssh -t (utilizator)@$1 "
sudo sqlite3 config.sqlite \"SELECT * FROM settings\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
Ieșire "
Rețineți că trebuie să evadați toate dintre ei, chiar și cei din interiorul citatului simplu awk
comandă, deoarece acele ghilimele simple nu înseamnă nimic pentru shell-ul local.
... dar aș recomanda să simplificați puțin acest lucru. Nu văd niciun motiv pentru asta grep
și awk
trebuie să fie rulat pe sistemul de la distanță, mai degrabă decât pe sistemul local (și Ieșire
comanda nu face nimic util, deoarece oricum va ieși). Deci ai putea muta grep
și awk
comenzi în afara ssh
comanda:
sshpass -p (trece) ssh -t (utilizator)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
grep „SALE_POINT” |
awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'
Și mereu urăsc să văd grep
folosit inainte awk
, când awk
este perfect capabil să facă totul în sine:
sshpass -p (trece) ssh -t (utilizator)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); imprimare}'
De asemenea, aș recomanda citarea duble a tuturor referințelor variabile (de ex. ping „$1” -c 5
în loc de doar ping $1 -c 5
), și înlocuind aceasta:
ping $1 -c 5
dacă [ $? -eq 0]; atunci
cu doar:
dacă ping „$1” -c 5; atunci
Și în sfârșit aș recomanda printf
în loc de ecou -e
-- este mult mai previzibil. printf
este puțin mai complex de utilizat - primul argument este un șir de format care îi spune cum să imprime orice argument rămas și nu adaugă automat o nouă linie la sfârșit (deci adăugați unul explicit cu \n
) -- dar este mai puțin probabil să se rupă din cauza unor modificări în versiunea shell-ului ecou
(cum mi s-a întâmplat cu ceva timp în urmă...). Deci folosiți de ex.
printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie UstawieÅ" "IP $1"
Ah, și vă recomand întotdeauna să vă executați scripturile shellcheck.net -- va evidenția multe greșeli comune și practici proaste.