Vòng lặp for từ xa qua SSH


11

Tôi có đoạn sau trong một kịch bản

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

Nhưng nó không hoạt động. Điều kỳ lạ, tôi thấy $ I số tiền của dòng trả về. Vì vậy, nếu tôi có mười tệp, tôi thấy mười dòng trống.


nhìn vào tùy chọn của GNU Parallel --sshlogin .
Sebastian

Câu trả lời:


19

Shell cục bộ của bạn diễn giải các ${i}dấu ngoặc kép bên trong ( "), vì vậy lệnh sẽ hoạt động để

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

Chỉ cần sử dụng dấu ngoặc đơn ( ') thay vào đó và vấn đề của bạn sẽ biến mất:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

1

Chỉ gặp vấn đề này một chút và giải pháp được đưa ra, trong khi nó không hoạt động quá hiệu quả nếu bạn cũng lấy các biến từ shell cục bộ, trước ssh bạn tạo một mảng để lặp lại. Một chút rắc rối hơn một chút sẽ là thoát khỏi $ ban đầu để nó được

"for i in /tmp/foo* ; do echo \${i}; done"

Mà sẽ thoát nó trong cấu trúc cục bộ, không phải là vỏ ssh được gọi.


0

Tôi đã cập nhật câu trả lời ở trên để có được cổng từ một danh sách quá.

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.