Đối với tôi, có vẻ như vấn đề cơ bản là các trích dẫn không lồng vào nhau theo cách bạn đang sử dụng chúng trong ssh
chỉ huy. Đó là, trong lệnh này:
sshpass -p (vượt qua) ssh -t (người dùng)@$1 "
sudo sqlite3 config.sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
lối ra "
Các "
Trong "CHỌN * TỪ...
thực sự là một trích dẫn gần (khớp với trích dẫn mở ở dòng trước), vì vậy thay vì CHỌN * TỪ cài đặt
nằm trong hai lớp dấu ngoặc kép, nó thực sự hoàn toàn không được trích dẫn (và kết quả là, *
sẽ mở rộng thành danh sách các tệp trong thư mục cục bộ, gây ra sự hỗn loạn mà ai cũng biết).
Như djdomi đã nói trong một bình luận, bạn có thể thấy các đối số ssh
trông giống như sau khi trình bao đã phân tích cú pháp chúng (và do đó, nội dung sẽ được gửi đến hệ thống từ xa để được thực thi) bằng cách thay thế ssh
lệnh với tiếng vang
. Khi tôi chạy cái này:
tiếng vang"
sudo sqlite3 config.sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
lối ra "
nó in:
sudo sqlite3 config.sqlite CHỌN file1.txt file2.jpg TỪ cài đặt |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
lối ra
Giải pháp trực tiếp nhất là thoát khỏi dấu ngoặc kép bên trong, do đó trình bao cục bộ sẽ chuyển chúng qua trình bao trên hệ thống từ xa:
sshpass -p (vượt qua) ssh -t (người dùng)@$1 "
sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
lối ra "
Lưu ý rằng bạn phải trốn thoát tất cả các trong số chúng, ngay cả những cái bên trong trích dẫn đơn awk
lệnh, bởi vì những dấu ngoặc đơn đó không có ý nghĩa gì đối với trình bao cục bộ.
... nhưng tôi khuyên bạn nên đơn giản hóa điều này một chút. Tôi không thấy lý do nào mà tiếng kêu
và awk
cần được chạy trên hệ thống từ xa chứ không phải hệ thống cục bộ (và lối ra
lệnh không làm bất cứ điều gì hữu ích, vì dù sao thì nó cũng sẽ thoát). Vì vậy, bạn có thể di chuyển tiếng kêu
và awk
các lệnh bên ngoài ssh
chỉ huy:
sshpass -p (vượt qua) ssh -t (người dùng)@$1 "sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\"" |
grep "SALE_POINT" |
awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'
Và tôi luôn ghét nhìn thấy tiếng kêu
sử dụng trước awk
, khi nào awk
hoàn toàn có khả năng tự làm mọi thứ:
sshpass -p (vượt qua) ssh -t (người dùng)@$1 "sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\"" |
awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); in}'
Tôi cũng khuyên bạn nên trích dẫn kép tất cả các tham chiếu biến (ví dụ: ping "$1" -c 5
Thay vì chỉ ping $1 -c 5
) và thay thế điều này:
ping $1 -c 5
nếu [ $? -eq 0 ]; sau đó
chỉ với:
nếu ping "$1" -c 5; sau đó
Và cuối cùng tôi muốn giới thiệu bản inf
thay vì tiếng vang -e
- đó là cách dễ đoán hơn. bản inf
phức tạp hơn một chút để sử dụng -- đối số đầu tiên là một chuỗi định dạng cho nó biết cách in bất kỳ đối số nào còn lại và nó không tự động thêm một dòng mới ở cuối (vì vậy hãy thêm một dòng rõ ràng với \N
) -- nhưng nó ít có khả năng bị hỏng do một số thay đổi trong phiên bản shell của tiếng vang
(như đã xảy ra với tôi một lúc trước ...). Vì vậy, sử dụng ví dụ:
printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie UstawieÅ" "IP $1"
Ồ, và tôi luôn khuyên bạn nên chạy tập lệnh của mình qua shellcheck.net -- nó sẽ chỉ ra nhiều sai lầm phổ biến và thực hành không tốt.