Thực thi tập lệnh từ xa với giá trị tham số cục bộ


8

Làm thế nào tôi có thể tự động hóa nhiệm vụ này?

1) Bạn đang ở A. 2) Bạn ssh vào B. 3) Bạn chạy tập lệnh tại B, cần một tham số được biết tại A.

Đầu tiên, tôi nghĩ có lẽ tôi có thể gửi giá trị khi tôi mở kết nối với ssh. Sau đó, có lẽ đơn giản hơn, giữa 1) và 2), quét toàn bộ tập lệnh đến cùng một vị trí tại B (thay thế tập lệnh cũ). Tuy nhiên, làm thế nào để tôi thực hiện kịch bản tại B? (Đó là, làm thế nào để tự động hóa bước cuối cùng đó. Tất nhiên, tôi có thể chạy thủ công sau ssh.)

Một suy nghĩ khác, có thể loại bỏ hoàn toàn ssh - Tôi có một trang web tại B, vậy kịch bản bằng cách nào đó có thể được gọi thông qua giao diện web "dưới mui xe" không?

Hay bạn sẽ làm điều đó theo một cách hoàn toàn khác?


Câu trả lời:


11
myparameter=foobar
ssh user@server "myscript $myparameter"

Điều này sẽ thực thi myscript foobartrên máy chủ.


Đơn giản như thế! Công trình tuyệt vời. (Tôi phải đặt "./" trước tên tập lệnh vì nếu không nó sẽ tìm ~/.elm/aliases.)
Emanuel Berg

6
Như một cảnh báo nhỏ, việc sử dụng dấu ngoặc kép ( ") trái ngược với dấu đơn ( ') rất quan trọng ở đây. Sử dụng gấp đôi có nghĩa là trình bao trên máy cục bộ của bạn sẽ mở rộng biến, sau đó thực hiện sshlệnh. Nếu một cái được sử dụng, shell cục bộ sẽ không chạm vào lệnh, được gửi trên nguyên văn nhưng vẫn được mở rộng trong shell từ xa.
Tilo Wiklund

3
Lưu ý rằng nếu $myparameterchứa khoảng trắng, nó sẽ phân tách ở phía máy chủ. Bash's printfcó một %qđịnh dạng mà bạn có thể sử dụng. Tôi có một số mã ví dụ, nhưng nó không phù hợp ở đây. Tôi sẽ tạo ra một câu trả lời mới cho nó.
janmoesen

7

(Đây là phần tiếp theo nhận xét của tôi về câu trả lời được chấp nhận .)

Lưu ý rằng nếu $myparameterchứa khoảng trắng, nó sẽ phân tách ở phía máy chủ. Printf của Bash có một %qđịnh dạng mà bạn có thể sử dụng. Thí dụ:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile

1

Nếu an toàn khi cho rằng $myparametersẽ không chứa các trích dẫn đơn (nếu không hãy xem tại đây hoặc sử dụng printf '%q' ...giải pháp của janmoesen), bạn chỉ có thể đặt các trích dẫn đơn xung quanh $myparameterđể tránh sự cố phân tách trên không gian phía máy chủ.

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
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.