Shell script từ máy cục bộ để thực thi lệnh trong máy từ xa, sau đó tiếp tục trên máy cục bộ


10

Vấn đề là ở đây: Tôi muốn sao chép các tập tin từ một máy từ xa.

Tôi đang tìm cách để viết một tập lệnh shell sẽ kết nối với máy từ xa, lấy vị trí của tệp được lưu trữ, khi tôi nhận được ngắt kết nối vị trí từ máy chủ từ xa và sử dụng scp từ trong máy cục bộ với vị trí thu được sao chép tập tin

Cụ thể, tôi muốn biết làm thế nào từ một kịch bản, tôi sẽ kết nối với một máy từ xa, thực hiện các tác vụ trên máy đó. Ngắt kết nối và tiếp tục thực hiện cục bộ.

Câu trả lời:


15

Giải pháp 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Điều này hoạt động bằng cách kết nối với máy từ xa, chạy một số lệnh và sao chép đầu ra vào một biến trên máy cục bộ của bạn. Nói, lặp lại đường dẫn tập tin từ xa, chụp nó cục bộ.

Giải pháp 2:

ssh user@host "determine_path; cat filename" >local_filename

Điều này hoạt động bằng cách tìm và xuất tệp trực tiếp từ xa và chuyển hướng tệp đến tệp cục bộ. Điều này bỏ qua scp. Điều này yêu cầu các bước trước "cat" không có đầu ra (mà bạn có thể giải quyết bằng &> / dev / null).


1
+1 để hiển thị cách giải quyết toàn bộ vấn đề với một kết nối, thay vì ssh + scp riêng biệt.
Peter Cordes

Tất cả các câu trả lời đều hữu ích nhưng câu hỏi này giải quyết vấn đề của tôi một cách cụ thể nhất
gnsr

20

Bạn có thể viết một tập lệnh theo định dạng sau:

command1
command2
...
ssh user@machine command3
...
command4
command5

Bạn cần thiết lập các khóa SSH để được command3thực thi mà không cần nhắc bạn nhập mật khẩu.


2
cần lưu ý rằng điều này sẽ bằng cách đồng bộ. Trong khi ssh user@remote command3đang chạy, command4không thể bắt đầu
aaaaa nói phục hồi Monica

3
@aaaaaa trừ khi bạn đã làmssh user@machine command3 &
Isaac

3
@Isaac vâng, quan điểm của tôi là một trong hai hành vi có thể là mong muốn, nhưng đó phải là quyết định khó hiểu
aaaaa nói phục hồi Monica

2

Tôi giả sử bạn đã có một số ý tưởng về cách bạn sẽ xác định tệp mà bạn muốn sao chép và bạn có thể hoặc đã viết một tập lệnh hoặc bộ lệnh sẽ chạy trên máy từ xa có nhận dạng này .

Hơn nữa, tôi cũng sẽ giả sử rằng các lệnh đó in trên đầu ra tiêu chuẩn đường dẫn đầy đủ đến tệp hoặc đường dẫn tương đối đến tệp, liên quan đến thư mục chính của người dùng SSH đang được sử dụng cho bản sao. Trong ví dụ của tôi, tên của tập lệnh là "getfilepath.sh", mặc dù nó không phải là tập lệnh shell, nó có thể là một số lệnh thực thi khác hoặc thậm chí là một loạt các lệnh.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

Trong đoạn mã trên, ký hiệu "$ ()" là cách nắm bắt đầu ra tiêu chuẩn của lệnh dưới dạng biến shell. Nó khá chuẩn, nhưng nếu bạn đang sử dụng lớp vỏ không hiểu về nó, thay vào đó, bạn có thể bao quanh lệnh bằng "back-ticks", đó là các dấu trọng âm ở bên trái của phím 1 trên hầu hết các bàn phím của Hoa Kỳ.


0

có lẽ có thể kích hoạt một Tác vụ theo lịch trình trên máy từ xa thực hiện tất cả công việc.

Điều này sẽ ngăn bạn kết nối với máy từ xa trong khi bạn đang tìm kiếm vị trí của các tệp bạn muốn sao chép.

Tôi đang làm điều này:

dòng comand kích hoạt một tác vụ theo lịch trình thực thi một lô trong trường hợp của tôi.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Trân trọng

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.